Skip to content

Commit

Permalink
Add tests for resolver
Browse files Browse the repository at this point in the history
  • Loading branch information
dz0ny committed Jan 2, 2015
1 parent e560171 commit ea2a430
Show file tree
Hide file tree
Showing 7 changed files with 560 additions and 44 deletions.
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,7 @@
MANIFEST
build/
dist/
.idea/
.idea/
.tox
build
dist
82 changes: 41 additions & 41 deletions mopidy_youtube/backend.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,22 @@
from __future__ import unicode_literals
import re
import string
from multiprocessing.pool import ThreadPool
from urlparse import urlparse, parse_qs
import unicodedata

import pafy

from mopidy import backend
from mopidy.models import SearchResult, Track, Album, Artist
from mopidy.models import SearchResult, Track, Album
import pykka
import pafy
import requests
import unicodedata
from mopidy_youtube import logger


yt_api_endpoint = 'https://www.googleapis.com/youtube/v3/'
yt_key = 'AIzaSyAl1Xq9DwdE_KD4AtPaE4EJl3WZe2zCqg4'
session = requests.Session()


def resolve_track(track, stream=False):
Expand All @@ -38,25 +43,30 @@ def safe_url(uri):


def resolve_url(url, stream=False):
video = pafy.new(url)
if not stream:
uri = 'youtube:video/%s.%s' % (
safe_url(video.title), video.videoid
)
else:
uri = video.getbestaudio()
if not uri: # get video url
uri = video.getbest()
logger.debug('%s - %s %s %s' % (
video.title, uri.bitrate, uri.mediatype, uri.extension))
uri = uri.url
if not uri:
try:
video = pafy.new(url)
if not stream:
uri = 'youtube:video/%s.%s' % (
safe_url(video.title), video.videoid
)
else:
uri = video.getbestaudio()
if not uri: # get video url
uri = video.getbest()
logger.debug('%s - %s %s %s' % (
video.title, uri.bitrate, uri.mediatype, uri.extension))
uri = uri.url
if not uri:
return
except Exception as e:
# Video is private or doesn't exist
logger.info(e.message)
return

track = Track(
name=video.title,
comment=video.videoid,
length=video.length*1000,
length=video.length * 1000,
album=Album(
name='Youtube',
images=[video.bigthumb, video.bigthumbhd]
Expand All @@ -74,21 +84,21 @@ def search_youtube(q):
'q': q,
'key': yt_key
}
pl = requests.get(yt_api_endpoint+'search', params=query)
playlist = []
for yt_id in pl.json().get('items'):
try:
track = resolve_url(yt_id.get('id').get('videoId'))
playlist.append(track)
except Exception as e:
logger.info(e.message)
return playlist
result = session.get(yt_api_endpoint+'search', params=query)
data = result.json()

resolve_pool = ThreadPool(processes=16)
playlist = [item['id']['videoId'] for item in data['items']]

playlist = resolve_pool.map(resolve_url, playlist)
resolve_pool.close()
return [item for item in playlist if item]


def resolve_playlist(url):
resolve_pool = ThreadPool(processes=16)
logger.info("Resolving Youtube-Playlist '%s'", url)
playlist = []
tracks = []

page = 'first'
while page:
Expand All @@ -102,28 +112,20 @@ def resolve_playlist(url):
logger.debug("Get Youtube-Playlist '%s' page %s", url, page)
params['pageToken'] = page

result = requests.get(yt_api_endpoint+'playlistItems',
params=params)
result = session.get(yt_api_endpoint+'playlistItems', params=params)
data = result.json()
page = data.get('nextPageToken')

for item in data["items"]:
video_id = item['contentDetails']['videoId']
playlist.append(video_id)

for item in playlist:
try:
track = resolve_url(item)
tracks.append(track)
# e.g. IOError "The [...] account [...] has been terminated..."
except Exception as e:
logger.info(e.message)

return tracks
playlist = resolve_pool.map(resolve_url, playlist)
resolve_pool.close()
return [item for item in playlist if item]


class YoutubeBackend(pykka.ThreadingActor, backend.Backend):

def __init__(self, config, audio):
super(YoutubeBackend, self).__init__()
self.config = config
Expand All @@ -134,7 +136,6 @@ def __init__(self, config, audio):


class YoutubeLibraryProvider(backend.LibraryProvider):

def lookup(self, track):
if 'yt:' in track:
track = track.replace('yt:', '')
Expand Down Expand Up @@ -180,7 +181,6 @@ def search(self, query=None, uris=None):


class YoutubePlaybackProvider(backend.PlaybackProvider):

def play(self, track):
track = resolve_track(track, True)
return super(YoutubePlaybackProvider, self).play(track)
1 change: 1 addition & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@ def get_version(filename):
tests_require=[
'nose',
'mock >= 1.0',
'vcrpy',
],
entry_points={
'mopidy.ext': [
Expand Down

0 comments on commit ea2a430

Please sign in to comment.