hitrecord.py (2269B)
1 from __future__ import unicode_literals 2 3 from .common import InfoExtractor 4 from ..compat import compat_str 5 from ..utils import ( 6 clean_html, 7 float_or_none, 8 int_or_none, 9 try_get, 10 ) 11 12 13 class HitRecordIE(InfoExtractor): 14 _VALID_URL = r'https?://(?:www\.)?hitrecord\.org/records/(?P<id>\d+)' 15 _TEST = { 16 'url': 'https://hitrecord.org/records/2954362', 17 'md5': 'fe1cdc2023bce0bbb95c39c57426aa71', 18 'info_dict': { 19 'id': '2954362', 20 'ext': 'mp4', 21 'title': 'A Very Different World (HITRECORD x ACLU)', 22 'description': 'md5:e62defaffab5075a5277736bead95a3d', 23 'duration': 139.327, 24 'timestamp': 1471557582, 25 'upload_date': '20160818', 26 'uploader': 'Zuzi.C12', 27 'uploader_id': '362811', 28 'view_count': int, 29 'like_count': int, 30 'comment_count': int, 31 'tags': list, 32 } 33 } 34 35 def _real_extract(self, url): 36 video_id = self._match_id(url) 37 38 video = self._download_json( 39 'https://hitrecord.org/api/web/records/%s' % video_id, video_id) 40 41 title = video['title'] 42 video_url = video['source_url']['mp4_url'] 43 44 tags = None 45 tags_list = try_get(video, lambda x: x['tags'], list) 46 if tags_list: 47 tags = [ 48 t['text'] 49 for t in tags_list 50 if isinstance(t, dict) and t.get('text') 51 and isinstance(t['text'], compat_str)] 52 53 return { 54 'id': video_id, 55 'url': video_url, 56 'title': title, 57 'description': clean_html(video.get('body')), 58 'duration': float_or_none(video.get('duration'), 1000), 59 'timestamp': int_or_none(video.get('created_at_i')), 60 'uploader': try_get( 61 video, lambda x: x['user']['username'], compat_str), 62 'uploader_id': try_get( 63 video, lambda x: compat_str(x['user']['id'])), 64 'view_count': int_or_none(video.get('total_views_count')), 65 'like_count': int_or_none(video.get('hearts_count')), 66 'comment_count': int_or_none(video.get('comments_count')), 67 'tags': tags, 68 }