Removed video url import from youtube, which is not needed any more given the /api/meeting/session/video/url API endpoint. This also prevents duplicate video URLs.

- Legacy-Id: 15424
This commit is contained in:
Henrik Levkowetz 2018-08-10 12:54:27 +00:00
parent caa3ec98b4
commit fcbbe08eba
4 changed files with 2 additions and 97 deletions

View file

@ -35,8 +35,7 @@ class CustomApiTestCase(TestCase):
# Using mock to patch the import functions in ietf.meeting.views, where
# api_import_recordings() are using them:
@patch('ietf.meeting.views.import_audio_files')
@patch('ietf.meeting.views.import_youtube_video_urls')
def test_notify_meeting_import_audio_files(self, mock_import_youtube, mock_import_audio):
def test_notify_meeting_import_audio_files(self, mock_import_audio):
meeting = make_meeting_test_data()
client = Client(Accept='application/json')
# try invalid method GET

View file

@ -61,7 +61,7 @@ from ietf.meeting.helpers import send_interim_announcement_request
from ietf.meeting.utils import finalize
from ietf.secr.proceedings.utils import handle_upload_file
from ietf.secr.proceedings.proc_utils import (get_progress_stats, post_process, import_audio_files,
import_youtube_video_urls, create_recording)
create_recording)
from ietf.utils.decorators import require_api_key
from ietf.utils.mail import send_mail_message, send_mail_text
from ietf.utils.pipe import pipe
@ -2183,7 +2183,6 @@ def api_import_recordings(request, number):
if request.method == 'POST':
meeting = get_meeting(number)
import_audio_files(meeting)
import_youtube_video_urls(meeting)
return HttpResponse(status=201)
else:
return HttpResponse(status=405)

View file

@ -4,7 +4,6 @@ proc_utils.py
This module contains all the functions for generating static proceedings pages
'''
import datetime
import httplib2
import os
import re
import subprocess
@ -12,7 +11,6 @@ from urllib import urlencode
import debug # pyflakes:ignore
from apiclient.discovery import build
from django.conf import settings
from django.core.exceptions import ObjectDoesNotExist
@ -27,52 +25,6 @@ AUDIO_FILE_RE = re.compile(r'ietf(?P<number>[\d]+)-(?P<room>.*)-(?P<time>[\d]{8}
VIDEO_TITLE_RE = re.compile(r'IETF(?P<number>[\d]+)-(?P<name>.*)-(?P<date>\d{8})-(?P<time>\d{4})')
def import_youtube_video_urls(meeting, http=httplib2.Http()):
'''Create Document and set external_url for session videos'''
youtube = build(settings.YOUTUBE_API_SERVICE_NAME, settings.YOUTUBE_API_VERSION,
developerKey=settings.YOUTUBE_API_KEY, http=http)
playlistid = get_youtube_playlistid(youtube, 'IETF' + meeting.number)
if playlistid is None:
return None
for video in get_youtube_videos(youtube, playlistid):
match = VIDEO_TITLE_RE.match(video['title'])
if match:
session = _get_session(**match.groupdict())
if session:
url = video['url']
get_or_create_recording_document(url,session)
def get_youtube_playlistid(youtube, title, http=httplib2.Http()):
'''Returns the youtube playlistId matching title string, a string'''
request = youtube.search().list(
q=title,
part='id,snippet',
channelId=settings.YOUTUBE_IETF_CHANNEL_ID,
type='playlist',
maxResults=1
)
search_response = request.execute(http=http)
try:
playlistid = search_response['items'][0]['id']['playlistId']
except (KeyError, IndexError):
return None
return playlistid
def get_youtube_videos(youtube, playlistid, http=httplib2.Http()):
'''Returns list of dictionaries with title, urls keys'''
videos = []
kwargs = dict(part="snippet",playlistId=playlistid,maxResults=50)
playlistitems = youtube.playlistItems()
request = playlistitems.list(**kwargs)
# handle pagination
while request is not None:
playlistitems_doc = request.execute(http=http)
videos.extend(_get_urls_from_json(playlistitems_doc))
request = playlistitems.list_next(request, playlistitems_doc)
return videos
def _get_session(number,name,date,time):
'''Lookup session using data from video title'''
meeting = Meeting.objects.get(number=number)

View file

@ -2,9 +2,6 @@ import debug # pyflakes:ignore
import json
import os
import shutil
from apiclient.discovery import build
from apiclient.http import HttpMock
from mock import patch
from django.conf import settings
from django.urls import reverse
@ -21,7 +18,6 @@ from ietf.utils.mail import outbox
from ietf.secr.proceedings.proc_utils import (import_audio_files,
get_timeslot_for_filename, normalize_room_name, send_audio_import_warning,
get_or_create_recording_document, create_recording, get_next_sequence,
get_youtube_playlistid, get_youtube_videos, import_youtube_video_urls,
_get_session, _get_urls_from_json)
@ -43,47 +39,6 @@ class ProceedingsTestCase(TestCase):
class VideoRecordingTestCase(TestCase):
@patch('ietf.secr.proceedings.proc_utils.get_youtube_videos')
@patch('ietf.secr.proceedings.proc_utils.get_youtube_playlistid')
def test_import_youtube_video_urls(self, mock_playlistid, mock_videos):
meeting = make_meeting_test_data()
session = Session.objects.filter(meeting=meeting, group__acronym='mars').first()
title = self._get_video_title_for_session(session)
url = 'https://youtube.com?v=test'
mock_playlistid.return_value = 'PLC86T-6ZTP5g87jdxNqdWV5475U-yEE8M'
mock_videos.return_value = [{'title':title,'url':url}]
discovery = os.path.join(settings.BASE_DIR, "../test/data/youtube-discovery.json")
http = HttpMock(discovery, {'status': '200'})
import_youtube_video_urls(meeting=meeting, http=http)
doc = Document.objects.get(external_url=url)
self.assertTrue(doc in session.materials.all())
def _get_video_title_for_session(self, session):
'''Returns the youtube video title of a session recording given session'''
timeslot = session.official_timeslotassignment().timeslot
return "{prefix}-{group}-{date}".format(
prefix=session.meeting.type.slug + session.meeting.number,
group=session.group.acronym,
date=timeslot.time.strftime('%Y%m%d-%H%M')).upper()
def test_get_youtube_playlistid(self):
discovery = os.path.join(settings.BASE_DIR, "../test/data/youtube-discovery.json")
http = HttpMock(discovery, {'status': '200'})
youtube = build(settings.YOUTUBE_API_SERVICE_NAME, settings.YOUTUBE_API_VERSION,
developerKey='',http=http)
path = os.path.join(settings.BASE_DIR, "../test/data/youtube-playlistid.json")
http = HttpMock(path, {'status': '200'})
self.assertEqual(get_youtube_playlistid(youtube, 'IETF98', http=http),'PLC86T-test')
def test_get_youtube_videos(self):
discovery = os.path.join(settings.BASE_DIR, "../test/data/youtube-discovery.json")
http = HttpMock(discovery, {'status': '200'})
youtube = build(settings.YOUTUBE_API_SERVICE_NAME, settings.YOUTUBE_API_VERSION,
developerKey='',http=http)
path = os.path.join(settings.BASE_DIR, "../test/data/youtube-playlistitems.json")
http = HttpMock(path, {'status': '200'})
videos = get_youtube_videos(youtube, 'PLC86T', http=http)
self.assertEqual(len(videos),2)
def test_get_session(self):
meeting = make_meeting_test_data()