def _getSubtitle(self, item, args, id): log("(Media) Subtitle") subtitle = Cache( "%s.mediainfo.subtitles" % self._mediaSettings.mediaType, ttl=_ttl, readOnly=True, last_changed=self._mediaSettings.subtitle_lastchanged, ).get(id) if not subtitle: try: log("(Media) Getting subtitle") _res = self._handle_param(**self._mediaSettings.subtitles_provider.item(*args)) if not self.stop.is_set(): subtitle = cleanDictList( self._mediaSettings.subtitles_provider.build_item(_res, *args) ) # 1. Get request parameter. 2. Perform request(s). 3. Build info. except: log_error() sys.exc_clear() else: if subtitle: Cache( "%s.mediainfo.subtitles" % self._mediaSettings.mediaType, ttl=_ttl, last_changed=self._mediaSettings.subtitle_lastchanged, )[id] = subtitle if self._callbackfn: log("(Media) Callback with '%s'" % item["label"]) self._callbackfn(self._progressValue, item, subtitle or {}) if subtitle: item.setdefault("stream_info", {})["subtitle"] = subtitle.setdefault("stream_info", {}).get("subtitle", {}) item.setdefault("params", {}).update(subtitle.get("params", {}))
def _getMeta(self, item, args, id): metadata = Cache("%s.mediainfo.metadata" %self._mediaSettings.mediaType, ttl=_ttl, readOnly=True, last_changed=self._mediaSettings.metadata_lastchanged).get(id) if not metadata: try: log("(Media) Getting metadata") _res = self._handle_param(**self._mediaSettings.metadata_provider.item(*args+[_settings.language])) if not self.stop.is_set(): metadata = cleanDictList(self._mediaSettings.metadata_provider.build_item(_res, *args+[_settings.language])) # 1. Get request parameter. 2. Perform request(s). 3. Build info. except: log_error() sys.exc_clear() finally: if self._callbackfn: log("(Media) Callback with '%s'" %item['label']) self._callbackfn(self._progressValue, item, metadata or {}) if not self._mediaSettings.metadata_provider.FALLBACKLANG == _settings.language: fallbackMeta = None try: log("(Media) Getting fallback metadata") _res = self._handle_param(**self._mediaSettings.metadata_provider.item(*args+[_settings.language])) if not self.stop.is_set(): fallbackMeta = self._mediaSettings.metadata_provider.build_item(_res, *args+[_settings.language]) # 1. Get request parameter. 2. Perform request(s). 3. Build info. except: log_error() sys.exc_clear() else: if metadata and fallbackMeta: fallbackMeta.update(metadata) if fallbackMeta: metadata = cleanDictList(fallbackMeta) finally: if self._callbackfn: log("(Media) Callback with '%s'" %item['label']) self._callbackfn(self._progressValue, item, metadata or {}) if metadata: Cache("%s.mediainfo.metadata" %self._mediaSettings.mediaType, ttl=_ttl, last_changed=self._mediaSettings.metadata_lastchanged)[id] = metadata else: if self._callbackfn: log("(Media) Callback with '%s'" %item['label']) self._callbackfn(self._progressValue*(1+(not self._mediaSettings.metadata_provider.FALLBACKLANG == _settings.language)), item, metadata) if metadata: item.setdefault('info', {}).update(dict((key, value) for key, value in metadata.pop('info', {}).items() if value)) item.setdefault('properties', {}).update(dict((key, value) for key, value in metadata.pop('properties', {}).items() if value)) item.setdefault('stream_info', {}).setdefault('video', {}).update(dict((key, value) for key, value in metadata.pop('stream_info', {}).pop('video', {}).items() if value)) item.update(dict((key, value) for key, value in metadata.items() if value))
def build_pre(data): log("(tmdb-build_pre) %s" % data, LOGLEVEL.INFO) if data: _Data.imageUrl = data[0].get("images", {}).get("base_url") if _Data.imageUrl: Cache("movies.metadata.imdb.conf", ttl=24 * 3600)['imageUrl'] = _Data.imageUrl
def pre(): cache = Cache("movies.metadata.imdb.conf", ttl=24 * 3600, readOnly=True) try: _Data.imageUrl = cache["imageUrl"] except KeyError: _Data.limit() return [{ 'domain': _base_url, 'path': "/3/configuration", 'params': { "api_key": _api_key } }] return []
def _getSubtitle(self, item, args, id): log("(Media) Subtitle") subtitle = Cache("%s.mediainfo.subtitles" %self._mediaSettings.mediaType, ttl=_ttl, readOnly=True, last_changed=self._mediaSettings.subtitle_lastchanged).get(id) if not subtitle: try: log("(Media) Getting subtitle") _res = self._handle_param(**self._mediaSettings.subtitles_provider.item(*args)) if not self.stop.is_set(): subtitle = cleanDictList(self._mediaSettings.subtitles_provider.build_item(_res, *args)) # 1. Get request parameter. 2. Perform request(s). 3. Build info. except: log_error() sys.exc_clear() else: if subtitle: Cache("%s.mediainfo.subtitles" %self._mediaSettings.mediaType, ttl=_ttl, last_changed=self._mediaSettings.subtitle_lastchanged)[id] = subtitle if self._callbackfn: log("(Media) Callback with '%s'" %item['label']) self._callbackfn(self._progressValue, item, subtitle or {}) if subtitle: item.setdefault('stream_info', {})['subtitle'] = subtitle.setdefault('stream_info', {}).get("subtitle", {}) item.setdefault('params', {}).update(subtitle.get('params', {}))
def request_proxy(self, proxies, path, proxyid, params={}, headers={}, timeout=10): log("(URL) Proxy domain is activated", LOGLEVEL.NONE) with Cache(proxyid) as proxies_cache: if not proxies_cache or not all(p in proxies_cache['proxies'] for p in proxies): proxies_cache['proxies'] = proxies for proxy in proxies_cache['proxies'][:]: try: if path == 'movie_favs': _favs._create_movie_favs() with open(_json_file) as json_read: _data = json.load(json_read) else: _data = self.request(proxy, path, params, headers, timeout) if _data or _data is None: return _data except (HTTPError, socket.timeout, socket.gaierror, socket.herror, socket.error) as e: if e.__class__.__name__ == 'error': if not e.errno in [ errno.EUSERS, errno.ECONNRESET, errno.ETIMEDOUT, errno.ECONNREFUSED, errno.EHOSTDOWN ]: raise log( "(URL) %s: %s - %s" % (e.__class__.__name__, str(e), self.url), LOGLEVEL.ERROR) sys.exc_clear() log( "(URL) Proxy domain '%s' is not working and will therefore have low priority in the future" % proxy, LOGLEVEL.NOTICE) proxies_cache.extendKey('proxies', [proxies_cache['proxies'].pop(0)]) raise ProxyError("There was not any domains that worked", 30328)
def search(self, **params): log("(Main) Creating search view", LOGLEVEL.INFO) searchString = self.getSearchString() curPageNum = self.getCurPageNum() with closing(Cache("%s.search.query" %self.mediaSettings.mediaType, ttl=24 * 3600, last_changed=self.mediaSettings.lastchanged)) as cache: # Reset cache when we have different search string if cache and not searchString == cache['searchString']: log("(Main) Resetting view cache") cache.trunctate() # Reset page number if the user have cleaned the cache # or we have a different search string if not cache: curPageNum = 1 if not cache or curPageNum > cache['curNumOfPages']: log("(Main) Reading item cache") items = {} pages = 0 with closing(SafeDialogProgress()) as dialog: dialog.create(__addon__.getLocalizedString(30028)) dialog.update(0, __addon__.getLocalizedString(30007), ' ', ' ') _time = time.time() # Getting item list log("(Main) Getting item list") with closing(media.List(self.mediaSettings, 'search', *(searchString, curPageNum,), **params)) as medialist: while not medialist.is_done(0.100): if xbmc.abortRequested or dialog.iscanceled(): raise Abort() res = medialist.get_data() if not res: raise Notify("No search result", 30327, NOTIFYLEVEL.INFO) items = res['items'] pages = res['pages'] # Update progress dialog dialog.set_mentions(len(items)+2) dialog.update(1, __addon__.getLocalizedString(30018), ' ', ' ') def on_data(progressValue, oldItem, newItem): label = ["%s %s" %(__addon__.getLocalizedString(30034), oldItem["label"])] if newItem.get("label") and not oldItem["label"] == newItem["label"]: label = label+["%s %s" %(__addon__.getLocalizedString(30035), newItem["label"])] if newItem.get("stream_info", {}).get("subtitle", {}).get("language"): label = label+["%s %s" %(__addon__.getLocalizedString(30012), isoToLang(newItem["stream_info"]["subtitle"]["language"]))] while len(label) < 3: label = label+[' '] dialog.update(progressValue, *label) # Getting media cache log("(Main) Getting media info") with closing(media.MediaCache(self.mediaSettings, on_data)) as mediadata: [mediadata.submit(item) for item in items] mediadata.start() while not mediadata.is_done(0.100): if xbmc.abortRequested or dialog.iscanceled(): raise Abort() items = mediadata.get_data() if not items: raise Error("Did not receive any data", 30304) log("(Main) Reading time: %s" %(time.time()-_time)) # Done dialog.update(1, __addon__.getLocalizedString(30017), ' ', ' ') log("(Main) Updating view cache") cache.extendKey("items", items) cache.update({"curNumOfPages": curPageNum, "totalPages": pages, "searchString": searchString}) pageCache = cache.copy() log("(Main) Adding items") self.addItems(self.mediaSettings.mediaType, pageCache["items"], 'player', False) # NOTE: # Add show more, but we stop at page 20... yes 20 pages sounds all right... # ... each page cache file can be between 2 and 3 mByt with 20 pages and will have an average of 1 mByt... # This can become substantial problem with movies and tv-shows pages if pageCache['curNumOfPages'] < pageCache['totalPages'] and pageCache['curNumOfPages'] < 21: self.addNextButton(**{'pageNum': pageCache['curNumOfPages']+1, 'searchString': searchString}) update_listing = False if curPageNum > 1: update_listing = True self.finish(self.mediaSettings.mediaType, update_listing)
def build_pre(data): if data: _Data.imageUrl = data[0].get("images", {}).get("base_url") if _Data.imageUrl: Cache("movies.metadata.imdb.conf", ttl=24 * 3600)['imageUrl'] = _Data.imageUrl