""" urlresolver XBMC Addon Copyright (C) 2011 t0mm0 This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If not, see . """ from urlresolver.resolver import UrlResolver, ResolverError from urlresolver.lib import kodi from lib import helpers import re import urllib from urlresolver import common try: import youtube_resolver except ImportError: youtube_resolver = None class YoutubeResolver(UrlResolver): name = "youtube" domains = ['youtube.com', 'youtu.be', 'youtube-nocookie.com'] pattern = '''https?://(?:[0-9A-Z-]+\.)?(?:(youtu\.be|youtube(?:-nocookie)?\.com)/?\S*?[^\w\s-])([\w-]{11})(?=[^\w-]|$)(?![?=&+%\w.-]*(?:['"][^<>]*>|))[?=&+%\w.-]*''' def __init__(self): self.net = common.Net() self.headers = {'User-Agent': common.RAND_UA} def get_media_url(self, host, media_id): try: web_url = self.get_url(host, media_id) html = self.net.http_GET(web_url, headers=self.headers).content stream_map = urllib.unquote(re.findall('url_encoded_fmt_stream_map=([^&]+)',html)[0]) streams = stream_map.split(',') sources = [] streams_mp4 = [item for item in streams if 'video%2Fmp4' in item] for stream in streams_mp4: quality = re.findall('quality=([^&]+)',stream)[0] url=re.findall('url=([^&]+)',stream)[0] sources.append((quality,urllib.unquote(url))) return helpers.pick_source(sources) except: if youtube_resolver is None: return 'plugin://plugin.video.youtube/play/?video_id=' + media_id else: streams = youtube_resolver.resolve(media_id) streams_no_dash = [item for item in streams if item['container'] != 'mpd'] stream_tuples = [(item['title'], item['url']) for item in streams_no_dash] return helpers.pick_source(stream_tuples) def get_url(self, host, media_id): return 'https://www.youtube.com/get_video_info?html5=1&video_id=%s' % media_id @classmethod def _is_enabled(cls): return cls.get_setting('enabled') == 'true' and kodi.has_addon('plugin.video.youtube') @classmethod def get_settings_xml(cls): xml = super(cls, cls).get_settings_xml() if youtube_resolver is None: xml.append('') return xml