def _create_videos(video_data, users): videos = [] for x in video_data: shuffle(users) video = Video(title=x['title']) video.save() if len(users) > 0: video.user = users[0] url = x['url'] + "&blah=%s" % time.time() vt = video_type_registrar.video_type_for_url(url) if vt is None: continue video_url, created = VideoUrl.objects.get_or_create( video=video, type=vt.abbreviation, url=url) video_url.original = True video_url.primary = True video_url.video = video video_url.save() # now we loop over languages: _add_langs_to_video(video, x['langs']) if len(x['langs']) > 0: video.is_subtitled = True video.save() videos.append(video) return videos
def run(self): try: api_key = self.get_working_api_key() if not api_key: raise Exception('Usable Api Key currently unavailable!') response = self.get_response(api_key) status_code = response.status_code if status_code == 200: data = response.json() videos_map = {} for item in data.get('items', []): try: snippet = item['snippet'] video_id = item['id']['videoId'] published_at = parse(snippet['publishedAt']) obj = Video(**{ 'video_id': video_id, 'channel_id': snippet['channelId'], 'title': snippet['title'], 'description': snippet['description'], 'published_at': published_at, 'thumbnail_default': snippet['thumbnails']['default']['url'], 'thumbnail_medium': snippet['thumbnails']['medium']['url'], 'thumbnail_high': snippet['thumbnails']['high']['url'], }) videos_map[video_id] = obj except KeyError as e: logger.info('Skipping an item due to KeyError({})'.format(e)) video_ids = list(videos_map.keys()) existing_videos = list(Video.objects.filter(video_id__in=video_ids).values_list('video_id', flat=True)) if existing_videos: logger.error('Found {} existing videos.'.format(len(existing_videos))) for video_id in existing_videos: del videos_map[video_id] if videos_map: videos = list(videos_map.values()) logger.info('Inserting {} new videos.'.format(len(videos))) Video.objects.bulk_create(videos) elif status_code == 403: logger.error('[Response StatusCode: {}] {}'.format(status_code, response.json())) error_data = response.json() for error in error_data['error']['errors']: if error['reason'] == 'quotaExceeded': self.get_working_api_key(api_key) else: logger.error('[Response StatusCode: {}] {}'.format(status_code, response.json())) except Exception as e: logger.error('[Unhandled Exception] {}'.format(e))