def change_thumb(self, row_id, thumb): execute = 'UPDATE {0!s} SET thumbnail=? WHERE id=? AND addon_id=?'.format( self.TABLE) result = DATABASE.execute(execute, (unquote(thumb), row_id, self.ID)) if result != 1: kodi.notify(msg=kodi.i18n('thumbchange_failed'), sound=False) return result
def rename_row_id(self, row_id, label): execute = 'UPDATE {0!s} SET label=? WHERE id=? AND addon_id=?'.format( self.TABLE) result = DATABASE.execute(execute, (label, row_id, self.ID)) if result != 1: kodi.notify(msg=kodi.i18n('rename_failed'), sound=False) return result
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 delete_row_id(self, row_id): execute = 'DELETE FROM {0!s} WHERE id=? AND addon_id=?'.format( self.TABLE) result, rowcount = DATABASE.execute_w_rowcount(execute, (row_id, self.ID)) if result != 1: kodi.notify(msg=kodi.i18n('delete_failed'), sound=False) return result, rowcount
def delete_url(self, url): execute = 'DELETE FROM {0!s} WHERE url=? AND addon_id=?'.format( self.TABLE) result, rowcount = DATABASE.execute_w_rowcount(execute, (url, self.ID)) if result != 1: kodi.notify(msg=kodi.i18n('delete_failed'), sound=False) if rowcount > 0: self.vacuum() return result, rowcount
def clear_cache(): confirmed = kodi.Dialog().yesno(kodi.i18n('confirm'), kodi.i18n('cache_yes_no')) if confirmed: result = cache.reset_cache() if result: kodi.notify(msg=kodi.i18n('cache_success'), sound=False) else: kodi.notify(msg=kodi.i18n('cache_failed'), sound=False)
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 clear(self, ctype=None): if ctype is None: result = DATABASE.execute('DROP TABLE {0!s}'.format(self.TABLE), '') else: result = DATABASE.execute( 'DELETE FROM {0!s} WHERE content_type=?'.format(self.TABLE), (ctype, )) if result == 1: self.vacuum() kodi.notify(msg=kodi.i18n('history_cleared'), sound=False) else: kodi.notify(msg=kodi.i18n('fail_history_clear'), sound=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 clear_cookies(): confirmed = kodi.Dialog().yesno(kodi.i18n('confirm'), kodi.i18n('cookies_yes_no')) if confirmed: try: if kodi.vfs.exists(COOKIE_FILE): result = kodi.vfs.delete(COOKIE_FILE) else: result = True except: result = False if result: kodi.notify(msg=kodi.i18n('cookies_success'), sound=False) else: kodi.notify(msg=kodi.i18n('cookies_failed'), 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 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_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 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 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 play_remote(path, thumb='', title=''): rpc_client = HttpJSONRPC() command = {'jsonrpc': '2.0', 'id': 1, 'method': 'Player.GetActivePlayers'} response = rpc_client.execute_rpc(command) if 'error' in response: kodi.notify(kodi.get_name(), response['error'], duration=7000) return try: player_id = response['result'][0]['playerid'] except IndexError: player_id = None if player_id == 2: # stop picture player if active, it will block command = { 'jsonrpc': '2.0', 'id': 1, 'method': 'Player.Stop', 'params': { 'playerid': player_id } } response = rpc_client.execute_rpc(command) if 'error' in response: kodi.notify(kodi.get_name(), response['error'], duration=7000) return filename = kodi.get_plugin_url({ 'mode': MODES.PLAY, 'player': 'false', 'path': path, 'thumb': thumb, 'title': title }) command = { 'jsonrpc': '2.0', 'id': 1, 'method': 'Player.Open', 'params': { 'item': { 'file': filename } } } response = rpc_client.execute_rpc(command) if 'error' in response: kodi.notify(kodi.get_name(), response['error'], duration=7000) else: if 'No Response' not in response['result']: kodi.notify(kodi.get_name(), kodi.i18n('send_success'))