def download_video(video_id, background=True): url = YOUTUBE_VIDEO_URL % video_id info = get_video_info(url) if info: log_utils.log('Downloading: |video| video_id: |%s| Background: |%s|' % (video_id, str(background))) _download(info, background)
def get_video_id(url): result = re.search('video_id=(?P<video_id>.+?)(?:&|$)', url) if result: log_utils.log('Found video_id: |%s|' % result.group('video_id')) return result.group('video_id') else: log_utils.log('video_id not found', log_utils.LOGERROR) return None
def get_video_info(url): info = YDStreamExtractor.getVideoInfo(url) if hasattr(info, '_streams'): return info else: log_utils.log('Stream not available: |%s|' % url, log_utils.LOGERROR) kodi.notify(msg=kodi.i18n('stream_not_available'), sound=False) return None
def _get(self): log_utils.log( 'M3UUtils._get from_list: |{0!s}|'.format(self.from_list), log_utils.LOGDEBUG) if self.from_list == 'history': return PlayHistory().get() else: return []
def export(self, row_id): rows = self._get(row_id) if rows: url, content_type, title, thumb = rows[0] play_path = { 'mode': MODES.PLAY, 'player': 'false', 'history': 'false', 'path': quote(url), 'thumb': quote(thumb) } strm = kodi.get_plugin_url(play_path) if strm: log_utils.log( 'STRMUtils.export writing .m3u: |{0!s}|'.format( self.filename), log_utils.LOGDEBUG) try: with open(self.filename, 'w+') as f: f.write(strm) log_utils.log('STRMUtils.export writing .m3u completed.', log_utils.LOGDEBUG) kodi.notify(msg=kodi.i18n('export_success'), sound=False) return except: log_utils.log('STRMUtils.export failed to write .strm', log_utils.LOGDEBUG) kodi.notify(msg=kodi.i18n('export_fail'), sound=False) return log_utils.log('STRMUtils.export no item for export to .strm', log_utils.LOGDEBUG) kodi.notify(msg=kodi.i18n('no_items_export'), sound=False)
def main(argv=None): if sys.argv: argv = sys.argv queries = kodi.parse_query(sys.argv[2]) log_utils.log('Version: |%s| Queries: |%s|' % (kodi.get_version(), queries), log_utils.LOGDEBUG) log_utils.log('Args: |%s|' % argv, log_utils.LOGDEBUG) # don't process params that don't match our url exactly plugin_url = 'plugin://%s/' % (kodi.get_id()) if argv[0] != plugin_url: return mode = queries.get('mode', None) DISPATCHER.dispatch(mode, queries)
def _download(info, background=True): if background: YDStreamExtractor.handleDownload(info, bg=True) else: result = YDStreamExtractor.handleDownload(info, bg=False) if result: log_utils.log('Download complete: |%s|' % result.filepath) elif result.status != 'canceled': log_utils.log('Download failed: |%s|' % result.message, log_utils.LOGERROR) kodi.notify(msg=result.message, sound=True) else: log_utils.log('Download cancelled')
def download(download_type='video', background=True): download_type = download_type.lower() plugin_url = sys.listitem.getfilename() log_utils.log('ListItem.FileNameAndPath: |%s|' % plugin_url) if plugin_url: video_id = get_video_id(plugin_url) if video_id: if download_type == 'video': download_video(video_id, background=background) elif download_type == 'audio': download_audio(video_id, background=background) else: log_utils.log('Requested unknown download_type: |%s|' % download_type, log_utils.LOGERROR) else: kodi.notify(msg=kodi.i18n('not_found_video_id'), sound=False) else: log_utils.log('Plugin URL not found', log_utils.LOGERROR) kodi.notify(msg=kodi.i18n('not_found_plugin_url'), sound=False)
def download(download_type='video', background=True): download_type = download_type.lower() plugin_url = sys.listitem.getfilename() log_utils.log('ListItem.FileNameAndPath: |%s|' % plugin_url) if plugin_url: video_id = get_video_id(plugin_url) if video_id: if download_type == 'video': download_video(video_id, background=background) elif download_type == 'audio': download_audio(video_id, background=background) else: log_utils.log( 'Requested unknown download_type: |%s|' % download_type, log_utils.LOGERROR) else: kodi.notify(msg=kodi.i18n('not_found_video_id'), sound=False) else: log_utils.log('Plugin URL not found', log_utils.LOGERROR) kodi.notify(msg=kodi.i18n('not_found_plugin_url'), sound=False)
def export(self, results='playthis', ctype='video'): if results == 'resolved': from addon_lib.playback import resolve else: def resolve(url): return url rows = self._get() if rows: _m3u = '#EXTM3U\n' m3u = _m3u for item, content_type, title, thumb in rows: if content_type != ctype: continue if results == 'resolved': resolved = resolve(item) else: resolved = None if resolved: log_utils.log( 'M3UUtils.export adding resolved item: |{0!s}| as |{1!s}|' .format(resolved, title), log_utils.LOGDEBUG) m3u += '#EXTINF:{0!s} tvg-logo="{3!s}",{1!s}\n{2!s}\n'.format( '0', title, resolved, thumb) else: if results == 'playthis': pt_url = 'plugin://plugin.video.playthis/?mode=play&player=false&history=false&path={0!s}' \ .format(quote(item)) log_utils.log( 'M3UUtils.export adding PlayThis item: |{0!s}| as |{1!s}|' .format(pt_url, title), log_utils.LOGDEBUG) m3u += '#EXTINF:{0!s} tvg-logo="{3!s}",{1!s}\n{2!s}\n'.format( '0', title, pt_url, thumb) else: log_utils.log( 'M3UUtils.export adding unresolved item: |{0!s}| as |{1!s}|' .format(item, title), log_utils.LOGDEBUG) m3u += '#EXTINF:{0!s} tvg-logo="{3!s}",{1!s}\n{2!s}\n'.format( '0', title, item, thumb) if m3u != _m3u: log_utils.log( 'M3UUtils.export writing .m3u: |{0!s}|'.format( self.filename), log_utils.LOGDEBUG) try: with open(self.filename, 'w+') as f: f.write(m3u) log_utils.log('M3UUtils.export writing .m3u completed.', log_utils.LOGDEBUG) kodi.notify(msg=kodi.i18n('export_success'), sound=False) return except: log_utils.log('M3UUtils.export failed to write .m3u', log_utils.LOGDEBUG) kodi.notify(msg=kodi.i18n('export_fail'), sound=False) return log_utils.log('M3UUtils.export no items for export to .m3u', log_utils.LOGDEBUG) kodi.notify(msg=kodi.i18n('no_items_export'), sound=False)
def history_directory(self, ctype): icon_path = kodi.get_icon() fanart_path = kodi.get_fanart() total_items = None if self.size_limit() != 0: _queries = self.get(include_ids=True) queries = [] for index, (row_id, item, content_type, label, thumbnail) in enumerate(_queries): if content_type == ctype: queries += [_queries[index]] if len(queries) > 0: total_items = len(queries) can_remote_send = HttpJSONRPC().has_connection_details resolve_locally = kodi.get_setting('resolve-locally') == 'true' for row_id, item, content_type, label, thumbnail in queries: play_path = { 'mode': MODES.PLAY, 'player': 'false', 'history': 'false', 'path': quote(item), 'thumb': quote(thumbnail) } if ctype == 'image': play_path = item menu_items = [(kodi.i18n('new_'), 'RunPlugin(%s)' % (kodi.get_plugin_url({ 'mode': MODES.NEW, 'player': 'true' }))), (kodi.i18n('manage'), 'Container.Update(%s)' % (kodi.get_plugin_url({ 'mode': MODES.MANAGE_MENU, 'row_id': row_id, 'title': quote(label) }))), (kodi.i18n('export'), 'Container.Update(%s)' % (kodi.get_plugin_url({ 'mode': MODES.EXPORT_MENU, 'row_id': row_id, 'ctype': content_type }))), (kodi.i18n('clear_history'), 'RunPlugin(%s)' % (kodi.get_plugin_url( { 'mode': MODES.CLEARHISTORY, 'ctype': content_type }))), (kodi.i18n('refresh'), 'Container.Refresh')] if can_remote_send: if resolve_locally: send_path = { 'mode': MODES.PLAY, 'path': quote(item), 'thumb': quote(thumbnail), 'title': quote(label), 'player': 'remote' } else: send_path = { 'mode': MODES.SENDREMOTE, 'path': quote(item), 'thumb': quote(thumbnail), 'title': quote(label) } menu_items.append((kodi.i18n('send_remote_playthis'), 'RunPlugin(%s)' % (kodi.get_plugin_url(send_path)))) is_folder = False thumb = icon_path if content_type == 'image': thumb = item if thumbnail: thumb = thumbnail info = {'title': label} if content_type == 'audio': info.update({'mediatype': 'song'}) elif content_type == 'video': info.update({'mediatype': 'video'}) elif content_type == 'executable': is_folder = True play_path['player'] = 'true' log_utils.log( 'Creating item |{2}|: path |{0}| content type |{1}|'. format(play_path, content_type, label), log_utils.LOGDEBUG) kodi.create_item(play_path, label, thumb=thumb, fanart=fanart_path, is_folder=is_folder, is_playable=True, total_items=total_items, menu_items=menu_items, content_type=content_type, info=info) if not total_items: menu_items = [(kodi.i18n('refresh'), 'Container.Refresh')] kodi.create_item({ 'mode': MODES.NEW, 'player': 'true' }, kodi.i18n('new_'), thumb=icon_path, fanart=fanart_path, is_folder=False, is_playable=False, menu_items=menu_items) kodi.end_of_directory(cache_to_disc=False)
def download_audio(video_id, background=True): url = YOUTUBE_VIDEO_URL % video_id info = get_video_info(url) if info: stream = info._streams[0] ytdl_format = stream.get('ytdl_format', {}) formats = ytdl_format.get('formats', []) best_quality = 0 best_format = None if formats: for fmt in formats: fmt_desc = fmt.get('format', '') log_utils.log('format: |%s|' % fmt_desc) if 'audio only' in fmt_desc.lower(): format_id = fmt.get('format_id', '') asr = fmt.get('asr', '') tbr = fmt.get('tbr', '') abr = fmt.get('abr', '') ext = fmt.get('ext', '') log_utils.log( 'id: |%s| ext: |%s| asr: |%s| tbr: |%s| abr: |%s|' % (format_id, ext, asr, tbr, abr)) if 'm4a' in ext: tbr = int(fmt.get('tbr')) if tbr > best_quality: best_quality = tbr best_format = fmt log_utils.log( 'Updated best_format: |%s| id: |%s| ext: |%s| asr: |%s| tbr: |%s| abr: |%s|' % (fmt_desc, format_id, ext, asr, tbr, abr)) if best_format: stream['xbmc_url'] = best_format[ 'url'] + '|' + urllib.urlencode({'User-Agent': USER_AGENT}) stream['url'] = best_format['url'] stream['ytdl_format'].update(best_format) stream['ytdl_format']['formats'] = [best_format] info._streams = [stream] log_utils.log( 'Downloading: |audio| video_id: |%s| Background: |%s|' % (video_id, str(background))) _download(info, background) else: log_utils.log( 'No audio-only stream formats found: |%s|' % video_id, log_utils.LOGERROR) kodi.notify(msg=kodi.i18n('no_audio_stream_formats'), sound=False) else: log_utils.log('No stream formats found: |%s|' % video_id, log_utils.LOGERROR) kodi.notify(msg=kodi.i18n('no_stream_formats'), sound=False)
def log_version(): log_utils.log('Version: |%s|' % kodi.get_version())
def download_audio(video_id, background=True): url = YOUTUBE_VIDEO_URL % video_id info = get_video_info(url) if info: stream = info._streams[0] ytdl_format = stream.get('ytdl_format', {}) formats = ytdl_format.get('formats', []) best_quality = 0 best_format = None if formats: for fmt in formats: fmt_desc = fmt.get('format', '') log_utils.log('format: |%s|' % fmt_desc) if 'audio only' in fmt_desc.lower(): format_id = fmt.get('format_id', '') asr = fmt.get('asr', '') tbr = fmt.get('tbr', '') abr = fmt.get('abr', '') ext = fmt.get('ext', '') log_utils.log('id: |%s| ext: |%s| asr: |%s| tbr: |%s| abr: |%s|' % (format_id, ext, asr, tbr, abr)) if 'm4a' in ext: tbr = int(fmt.get('tbr')) if tbr > best_quality: best_quality = tbr best_format = fmt log_utils.log('Updated best_format: |%s| id: |%s| ext: |%s| asr: |%s| tbr: |%s| abr: |%s|' % (fmt_desc, format_id, ext, asr, tbr, abr)) if best_format: stream['xbmc_url'] = best_format['url'] + '|' + urllib.urlencode({'User-Agent': USER_AGENT}) stream['url'] = best_format['url'] stream['ytdl_format'].update(best_format) stream['ytdl_format']['formats'] = [best_format] info._streams = [stream] log_utils.log('Downloading: |audio| video_id: |%s| Background: |%s|' % (video_id, str(background))) _download(info, background) else: log_utils.log('No audio-only stream formats found: |%s|' % video_id, log_utils.LOGERROR) kodi.notify(msg=kodi.i18n('no_audio_stream_formats'), sound=False) else: log_utils.log('No stream formats found: |%s|' % video_id, log_utils.LOGERROR) kodi.notify(msg=kodi.i18n('no_stream_formats'), sound=False)