diff --git a/platypush/plugins/media/search/youtube.py b/platypush/plugins/media/search/youtube.py index 7fa8a6fbf..37f019e6f 100644 --- a/platypush/plugins/media/search/youtube.py +++ b/platypush/plugins/media/search/youtube.py @@ -2,13 +2,19 @@ import re import urllib.parse import urllib.request +import requests + from platypush.context import get_plugin -# noinspection PyProtectedMember from platypush.plugins.media.search import MediaSearcher +# pylint: disable=too-few-public-methods class YoutubeMediaSearcher(MediaSearcher): - def search(self, query, **kwargs): + """ + Search YouTube videos by query. + """ + + def search(self, query: str, *_, **__): """ Performs a YouTube search either using the YouTube API (faster and recommended, it requires the :mod:`platypush.plugins.google.youtube` @@ -16,48 +22,59 @@ class YoutubeMediaSearcher(MediaSearcher): slower method) """ - self.logger.info('Searching YouTube for "{}"'.format(query)) + self.logger.info('Searching YouTube for "%s"', query) try: return self._youtube_search_api(query=query) except Exception as e: - self.logger.warning('Unable to load the YouTube plugin, falling ' + - 'back to HTML parse method: {}'.format(str(e))) + self.logger.warning( + ( + 'Unable to load the YouTube plugin, ' + 'falling back to HTML parse method: %s' + ), + e, + ) - return self._youtube_search_html_parse(query=query) + return self._youtube_search_html_parse(query=query) @staticmethod def _youtube_search_api(query): + yt = get_plugin('google.youtube') + assert yt, 'YouTube plugin not configured' return [ { 'url': 'https://www.youtube.com/watch?v=' + item['id']['videoId'], **item.get('snippet', {}), } - for item in get_plugin('google.youtube').search(query=query).output + for item in yt.search(query=query).output if item.get('id', {}).get('kind') == 'youtube#video' ] def _youtube_search_html_parse(self, query): query = urllib.parse.quote(query) url = "https://www.youtube.com/results?search_query=" + query - response = urllib.request.urlopen(url) - html = response.read().decode('utf-8') + html = requests.get(url, timeout=10).content results = [] while html: - m = re.search('()', html) + m = re.search( + r'()', + html, + ) if m: - results.append({ - 'url': 'https://www.youtube.com' + m.group(2), - 'title': m.group(3) - }) + results.append( + {'url': 'https://www.youtube.com' + m.group(2), 'title': m.group(3)} + ) html = html.split(m.group(1))[1] else: html = '' - self.logger.info('{} YouTube video results for the search query "{}"' - .format(len(results), query)) + self.logger.info( + '%d YouTube video results for the search query "%s"', + len(results), + query, + ) return results