diff --git a/addon.xml b/addon.xml index 1ac1fe1..8498eeb 100644 --- a/addon.xml +++ b/addon.xml @@ -1,10 +1,14 @@ - + + + + + video diff --git a/changelog.txt b/changelog.txt index 1a154e7..a833e72 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,19 @@ +[B]2.0.000:[/B] 19. 3. 2017 +- přidáno žebříčky csfd (nejlepší filmy, nejlepší seriály, celkově + a podle žánru) (zbyna) +- přidáno ocenění z csfd (Oskary, Zlatá palma) (zbyna) +- pridáno implementace memory cache pro časově a početně náročné operace (zbyna) + možnost vypnout memory cache v nastavení doplňku prozatím není funkční + (čeká se až se tento patch: + https://github.com/marcelveldt/script.module.simplecache/pull/2 + dostane do repozitáře kodi: + https://github.com/xbmc/repo-scripts/tree/jarvis/script.module.simplecache) +- přidáno implementace multithread zpracování u IO operací +- přidáno nastavení doplňku karta Obecné - vynutit anglické názvy +- přidáno nastavení doplňku karta Cache - vyprádnit cache +- přidáno nastavení doplňku karta Služba knihovny - odběr a přidání do knihovny, + pro nastavení možnosti současného provedení těchto položek (zbyna) +- opraveno načítání Nově přidaných seriálů (zbyna) [B]1.2.118:[/B] 1. 1. 2017 - opravena funkčnost menu "Přidej vše do knihovny" pro "Filmy", "Seriály" a "Nově přidané filmy" (zbyna) diff --git a/default.py b/default.py index d570e96..7c0b409 100644 --- a/default.py +++ b/default.py @@ -33,11 +33,15 @@ __language__ = __addon__.getLocalizedString __set__ = __addon__.getSetting -settings = {'downloads': __set__('downloads'), 'quality': __set__( - 'quality'), 'subs': __set__('subs') == 'true'} +settings = {'downloads': __set__('downloads'), + 'quality': __set__('quality'), + 'subs': __set__('subs') == 'true', + 'add_subscribe': __set__('add_subscribe')} reverse_eps = __set__('order-episodes') == '0' +force_english = __set__('force-english') == 'true' +use_memory_cache = __set__('use-memory-cache') == 'true' util.info("URL: " + sys.argv[2]) params = util.params() @@ -45,4 +49,6 @@ xbmcutil.init_usage_reporting(__scriptid__) util.info("Running sosac provider with params: " + str(params)) -XBMCSosac(SosacContentProvider(reverse_eps=reverse_eps), settings, __addon__).run(params) +XBMCSosac(SosacContentProvider(reverse_eps=reverse_eps, force_english=force_english, + use_memory_cache=use_memory_cache), settings, + __addon__).run(params) diff --git a/resources/language/Czech/strings.xml b/resources/language/Czech/strings.xml index 6f9411c..7ce46c9 100644 --- a/resources/language/Czech/strings.xml +++ b/resources/language/Czech/strings.xml @@ -27,13 +27,15 @@ Řazení epizod Od nejstarších Od nejnovějších + Vkládat titulky, jsou li k dispozici + Vynutit anglické názvy + Použít RAM pro cache Složka pro filmy Složka pro seriály Opozdit start služby o (hodiny) Obecné Služba knihovny Výchozí čas pro obnovu seriálu (dny) - Vkládat titulky, jsou li k dispozici Data o použití jsou zaslána pouze v okamžiku, kdy spustíte přehrávání nebo stahování videa doplňkem. Detekován starý formát strm souborů Přehrát video bez vylepšení OSD a automatického statusu SHLÉDNUTO @@ -46,6 +48,10 @@ Pokračovat? od začátku od minulé pozice + Odběr a Přidání do knihovny + Při přidání do knihovny také přihlásit k odběru + Při přihlášení k odběru také přidat do knihovny + Nespojovat přihlášení k odběru a přidání do knihovny [B]Filmy[/B] [B]Seriály[/B] [B]Filmy podle žánrů[/B] @@ -61,4 +67,15 @@ Přihlas k odběru Odhlásit všechny odběry Přihlásit všechny seriály k odběru? + Cache + Vyprázdnit cache + [B]Žebříčky[/B] + [B]Ocenění[/B] + [B]Nejlepší filmy[/B] + [B]Nejlepší filmy podle žánrů[/B] + [B]Nejlepší seriály[/B] + [B]Nejlepší seriály podle žánrů[/B] + [B]Žebříčky a ocenění (csfd)[/B] + Oscar + Zlatá palma diff --git a/resources/language/English/strings.xml b/resources/language/English/strings.xml index 67968fe..3ed5bd6 100644 --- a/resources/language/English/strings.xml +++ b/resources/language/English/strings.xml @@ -28,13 +28,15 @@ Episodes order Oldest first Latest first + Load subtitles if available + Force English titles + Use RAM for cache Movies library TVShow library Subscription service sleep on start (hours) General Subscriptions Default show check time (days) - Load subtitles if available Usage of plugin is tracked whenever you play or download video. Old strm file format detected Play video without osd enhancement and auto watched status @@ -47,6 +49,10 @@ Continue from? beginning last position + Subscription and Add to Library + During adding to library also subscribe + During subscribing also add to library + Do not join Subscription and Add to Library [B]Movies[/B] [B]TV Shows[/B] [B]Movies - by Genres[/B] @@ -62,4 +68,15 @@ Subscribe Remove all from subscription Subscribe all TV Shows? + Cache + Flush cache + [B]Ladders[/B] + [B]Awards[/B] + [B]Best Movies[/B] + [B]Best Movies by Genres[/B] + [B]Best TV Shows[/B] + [B]Best TV Shows by Genres[/B] + [B]Ladders and Awards (csfd)[/B] + Oscars + Golden Palm diff --git a/resources/language/Slovak/strings.xml b/resources/language/Slovak/strings.xml index f221f1c..aa1c66b 100644 --- a/resources/language/Slovak/strings.xml +++ b/resources/language/Slovak/strings.xml @@ -1,41 +1,43 @@ - Počet zapamätaných hľadaní - Video nie je dostupné, skontrolujte,[CR]či funguje prehrávanie na webe. - [B]Najnovšie epizódy[/B] - Vyberte zdroj - Podľa dátumu - Podľa účinkujúceho - Podľa hodnotenia - [B]Predchádzajúci[/B] - [B]Ďalší[/B] - Priečinok pre sťahovanie - Nastavte prosím priečinok pre sťahovanie - Zobrazovať stav sťahovania - - zobraziť stav každých - 10% - 5% - 1% - [B]Stiahnuté súbory[/B] - Kvalita videa - Spýtať sa - Najlepšia - Najhoršia - 720p - 480p - 360p - Radenie epizód - Od najstarších - Od najnovších - Priečinok pre filmy - Priečinok pre seriály - Oneskoriť štart služby o (hodiny) + Počet zapamätaných hľadaní + Video nie je dostupné, skontrolujte,[CR]či funguje prehrávanie na webe. + [B]Najnovšie epizódy[/B] + Vyberte zdroj + Podľa dátumu + Podľa účinkujúceho + Podľa hodnotenia + [B]Predchádzajúci[/B] + [B]Ďalší[/B] + Priečinok pre sťahovanie + Nastavte prosím priečinok pre sťahovanie + Zobrazovať stav sťahovania + - zobraziť stav každých + 10% + 5% + 1% + [B]Stiahnuté súbory[/B] + Kvalita videa + Spýtať sa + Najlepšia + Najhoršia + 720p + 480p + 360p + Radenie epizód + Od najstarších + Od najnovších + Vkladať titulky, ak sú k dispozícii + Vynutit anglické názvy + Použiť RAM pro cache + Priečinok pre filmy + Priečinok pre seriály + Oneskoriť štart služby o (hodiny) Všeobecné Služba knižnice Predvolený čas pre obnovu seriálu (dni) - Vkladať titulky, ak sú k dispozícii - Údaje o použití sú zaslané iba v okamihu, keď spustíte prehrávanie alebo sťahovanie videa doplnkom. - Zistený starý formát súborov strm + Údaje o použití sú zaslané iba v okamihu, keď spustíte prehrávanie alebo sťahovanie videa doplnkom. + Zistený starý formát súborov strm Prehrávanie videa bez vylepšenie OSD a automatického statusa PREZRETÉ Migrovať strm súbory - dialógové okno Výber adresára bude nasledovať Vybrať adresár (Movies or TVShows) @@ -45,7 +47,11 @@ Zmena strm súborov Pokračovať? od začiatku - od minulej pozície + od minulej pozície + Odber a Pridanie do knižnice + Pri pridaní do knižnice tiež prihlásiť k odberu + Pri prihlásení na odber tiež pridať do knižnice + Nespájať prihlásenia na odber a pridanie do knižnice Zmena strm súborov [B]Filmy[/B] [B]Seriály[/B] @@ -62,4 +68,15 @@ Prihlás k odberu Odhlásiť všetky odbery Prihlásiť všetky seriály na odber? + Cache + Vyprázdniť cache + [B]Rebríčky[/B] + [B]Ocenenie[/B] + [B]Najlepšie filmy[/B] + [B]Najlepšie filmy podľa žánrov[/B] + [B]Najlepšie seriály[/B] + [B]Najlepšie seriály podľa žánrov[/B] + [B]Rebríčky a ocenenie (csfd)[/B] + Oscar + Zlatá palma diff --git a/resources/lib/csfd.py b/resources/lib/csfd.py new file mode 100644 index 0000000..c0ff4b9 --- /dev/null +++ b/resources/lib/csfd.py @@ -0,0 +1,50 @@ +# -*- coding: UTF-8 -*- +from translatedStrings import * + +csfd = {'level_0': + [ + { + 'name': CSFD_LADDERS, + 'url': CSFD_BASE + 'zebricky/level_1', + 'type': 'DIR', + 'level_1': [ + { + 'name': BEST_MOVIES, + 'url': CSFD_BASE + ZEBRICKY_FILMY_NEJ, + 'type': 'DIR'}, + { + 'name': BEST_MOVIES_BY_GENRE, + 'url': CSFD_BASE + ZEBRICKY_FILMY_SPEC, + 'type': 'DIR' + }, + { + 'name': BEST_TV_SHOWS, + 'url': CSFD_BASE + ZEBRICKY_TVSHOW_NEJ, + 'type': 'DIR' + }, + { + 'name': BEST_TV_SHOWS_BY_GENRE, + 'url': CSFD_BASE + ZEBRICKY_TVSHOW_SPEC, + 'type': 'DIR' + } + ] + }, + { + 'name': CSFD_AWARDS, + 'url': CSFD_BASE + 'oceneni/level_1', + 'type': 'DIR', + 'level_1': [ + { + 'name': OSCARS, + 'url': CSFD_BASE + OCENENI_OSCAR, + 'type': 'DIR'}, + { + 'name': GOLDEN_PALM, + 'url': CSFD_BASE + OCENENI_ZLATA_PALMA, + 'type': 'DIR' + }, + + ] + } + ] + } diff --git a/resources/lib/sosac.py b/resources/lib/sosac.py index 1cfe651..59bcb9e 100644 --- a/resources/lib/sosac.py +++ b/resources/lib/sosac.py @@ -19,165 +19,123 @@ # * http://www.gnu.org/copyleft/gpl.html # * # */ - import re + import urllib import urllib2 import cookielib -import xml.etree.ElementTree as ET import sys - +import json import util -from provider import ContentProvider, cached, ResolveException -import xbmc +from provider import ContentProvider import xbmcgui +import concurrent.futures +import time +from translatedStrings import * +from csfd import csfd +from bs4 import BeautifulSoup +import requests +import itertools +import simplecache + sys.setrecursionlimit(10000) MOVIES_BASE_URL = "http://movies.prehraj.me" -TV_SHOWS_BASE_URL = "http://tv.prehraj.me" -MOVIES_A_TO_Z_TYPE = "movies-a-z" -MOVIES_GENRE = "filmyxmlzanr.php" -MOVIES_YEAR = "filmyxml.php" -GENRE_PARAM = "zanr" +MOVIES_YEAR = "ROKY/" YEAR_PARAM = "rok" -TV_SHOWS_A_TO_Z_TYPE = "tv-shows-a-z" -XML_LETTER = "xmlpismeno" TV_SHOW_FLAG = "#tvshow#" ISO_639_1_CZECH = "cs" -MOST_POPULAR_TYPE = "most-popular" -RECENTLY_ADDED_TYPE = "recently-added" -SEARCH_TYPE = "search" + +# JSONs +URL = "http://tv.sosac.to" SUBSCRIPTION_MANAGER = "subscription_manager" -ADD_TO_LIBRARY = "" -REMOVE_FROM_SUBSCRIPTION = "" -ADD_ALL_TO_LIBRARY = "" -SUBSCRIBE = "" + +J_MOVIES_GENRE = "/vystupy5981/souboryzanry.json" +J_MOVIES_MOST_POPULAR = "/vystupy5981/moviesmostpopular.json" +J_MOVIES_RECENTLY_ADDED = "/vystupy5981/moviesrecentlyadded.json" +# hack missing json with a-z series +J_MOVIES_A_TO_Z_TYPE = "/vystupy5981/souboryaz.json" +J_TV_SHOWS_A_TO_Z_TYPE = "/vystupy5981/tvpismenaaz/" +J_TV_SHOWS = "/vystupy5981/tvpismena/" +J_SERIES = "/vystupy5981/serialy/" +J_TV_SHOWS_MOST_POPULAR = "/vystupy5981/tvshowsmostpopular.json" +J_TV_SHOWS_RECENTLY_ADDED = "/vystupy5981/tvshowsrecentlyadded.json" +J_SEARCH = "/jsonsearchapi.php?q=" +STREAMUJ_URL = "http://www.streamuj.tv/video/" +IMAGE_URL = "http://movies.sosac.tv/images/" +IMAGE_MOVIE = IMAGE_URL + "75x109/movie-" +IMAGE_SERIES = IMAGE_URL + "558x313/serial-" +IMAGE_EPISODE = URL + +RATING = 'r' +LANG = 'd' +QUALITY = 'q' class SosacContentProvider(ContentProvider): ISO_639_1_CZECH = None par = None - def __init__(self, username=None, password=None, filter=None, reverse_eps=False): - ContentProvider.__init__(self, name='sosac.ph', base_url=MOVIES_BASE_URL, username=username, - password=password, filter=filter) + def __init__(self, username=None, password=None, filter=None, reverse_eps=False, + force_english=False, use_memory_cache=True): + ContentProvider.__init__(self, name='sosac.ph', base_url=MOVIES_BASE_URL, + username=username, password=password, filter=filter) opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookielib.LWPCookieJar())) urllib2.install_opener(opener) self.reverse_eps = reverse_eps + self.force_english = force_english + self.cache = simplecache.SimpleCache() + self.cache.enable_mem_cache = use_memory_cache def on_init(self): - kodilang = self.lang or 'cs' - if kodilang == ISO_639_1_CZECH or kodilang == 'sk': - self.ISO_639_1_CZECH = ISO_639_1_CZECH + '/' + if self.force_english: + self.ISO_639_1_CZECH = 'en' else: - self.ISO_639_1_CZECH = '' + self.ISO_639_1_CZECH = ISO_639_1_CZECH def capabilities(self): return ['resolve', 'categories', 'search'] def categories(self): - MOVIES = self.parent.getString(30300) - TV_SHOWS = self.parent.getString(30301) - MOVIES_BY_GENRES = self.parent.getString(30302) - MOVIES_MOST_POPULAR = self.parent.getString(30303) - TV_SHOWS_MOST_POPULAR = self.parent.getString(30304) - MOVIES_RECENTLY_ADDED = self.parent.getString(30305) - TV_SHOWS_RECENTLY_ADDED = self.parent.getString(30306) - ADD_ALL_TO_LIBRARY = self.parent.getString(30307) - SPRAVCE_ODBERU = self.parent.getString(30310) - MOVIES_BY_YEAR = self.parent.getString(30311) - REMOVE_ALL_FROM_SUBSCRIPTION = self.parent.getString(30313) result = [] for title, url in [ - (MOVIES, MOVIES_BASE_URL), - (TV_SHOWS, TV_SHOWS_BASE_URL), - (MOVIES_BY_GENRES, MOVIES_BASE_URL + "/" + MOVIES_GENRE), - (MOVIES_BY_YEAR, MOVIES_BASE_URL + "/" + MOVIES_YEAR), - (MOVIES_MOST_POPULAR, - MOVIES_BASE_URL + "/" + self.ISO_639_1_CZECH + MOST_POPULAR_TYPE), - (TV_SHOWS_MOST_POPULAR, - TV_SHOWS_BASE_URL + "/" + self.ISO_639_1_CZECH + MOST_POPULAR_TYPE), - (MOVIES_RECENTLY_ADDED, - MOVIES_BASE_URL + "/" + self.ISO_639_1_CZECH + RECENTLY_ADDED_TYPE), - (TV_SHOWS_RECENTLY_ADDED, - TV_SHOWS_BASE_URL + "/" + self.ISO_639_1_CZECH + RECENTLY_ADDED_TYPE), + (MOVIES, URL + J_MOVIES_A_TO_Z_TYPE), + (TV_SHOWS, URL + J_TV_SHOWS_A_TO_Z_TYPE), + (MOVIES_BY_GENRES, URL + J_MOVIES_GENRE), + (MOVIES_BY_YEAR, URL + "/" + MOVIES_YEAR), + (MOVIES_MOST_POPULAR, URL + J_MOVIES_MOST_POPULAR), + (TV_SHOWS_MOST_POPULAR, URL + J_TV_SHOWS_MOST_POPULAR), + (MOVIES_RECENTLY_ADDED, URL + J_MOVIES_RECENTLY_ADDED), + (TV_SHOWS_RECENTLY_ADDED, URL + J_TV_SHOWS_RECENTLY_ADDED), + (CSFD_MAIN, CSFD_BASE + 'level_0'), (SPRAVCE_ODBERU, SUBSCRIPTION_MANAGER)]: item = self.dir_item(title=title, url=url) if title == MOVIES or title == TV_SHOWS or title == MOVIES_RECENTLY_ADDED: item['menu'] = {"[B][COLOR red]" + ADD_ALL_TO_LIBRARY + "[/COLOR][/B]": { - 'action': 'add-all-to-library', 'title': title}} + 'action': 'add-all-to-library', 'title': title, 'url': url}} if title == SPRAVCE_ODBERU: - item['menu'] = {"[B][COLOR yellow]" + REMOVE_ALL_FROM_SUBSCRIPTION + "[/COLOR][/B]": { - 'action': 'remove-all-from-subscription', 'title': title}} + item['menu'] = {"[B][COLOR yellow]" + REMOVE_ALL_FROM_SUBSCRIPTION + + "[/COLOR][/B]": { + 'action': 'remove-all-from-subscription', 'title': title}} result.append(item) return result def search(self, keyword): - return self.list_search('%s/%ssearch?%s' % (MOVIES_BASE_URL, self.ISO_639_1_CZECH, - urllib.urlencode({'q': keyword}))) + if len(keyword) < 3 or len(keyword) > 100: + return [self.dir_item( + title="Search query must be between 3 and 100 characters long!", url="fail")] + return self.list_videos(URL + J_SEARCH + urllib.quote_plus(keyword)) - def a_to_z(self, url_type): + def a_to_z(self, url): result = [] - for letter in ['0-9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'e', 'h', 'i', 'j', 'k', 'l', 'm', - 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']: + for letter in ['0-9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'e', 'h', 'i', 'j', 'k', 'l', + 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']: item = self.dir_item(title=letter.upper()) - if url_type == MOVIES_A_TO_Z_TYPE: - item['url'] = self.base_url + "/filmyxmlpismeno.php?pismeno=" + letter - else: - item['url'] = self.base_url + "/" + self.ISO_639_1_CZECH + url_type + "/" + letter + item['url'] = URL + url + letter + ".json" result.append(item) return result - @staticmethod - def remove_flag_from_url(url, flag): - return url.replace(flag, "", count=1) - - @staticmethod - def is_xml_letter(url): - if XML_LETTER in url: - return True - return False - - @staticmethod - def is_base_url(url): - if url in [MOVIES_BASE_URL, TV_SHOWS_BASE_URL]: - return True - else: - return False - - @staticmethod - def is_movie_url(url): - if MOVIES_BASE_URL in url: - return True - else: - return False - - @staticmethod - def is_tv_shows_url(url): - if TV_SHOWS_BASE_URL in url: - return True - else: - return False - - @staticmethod - def is_most_popular(url): - if MOST_POPULAR_TYPE in url: - return True - else: - return False - - @staticmethod - def is_recently_added(url): - if RECENTLY_ADDED_TYPE in url: - return True - else: - return False - - @staticmethod - def is_search(url): - return SEARCH_TYPE in url - @staticmethod def particular_letter(url): return "a-z/" in url @@ -185,473 +143,465 @@ def particular_letter(url): def has_tv_show_flag(self, url): return TV_SHOW_FLAG in url - def remove_flags(self, url): - return url.replace(TV_SHOW_FLAG, "", 1) - def list(self, url): - global ADD_TO_LIBRARY - ADD_TO_LIBRARY = self.parent.getString(30308) - global REMOVE_FROM_SUBSCRIPTION - REMOVE_FROM_SUBSCRIPTION = self.parent.getString(30309) - global ADD_ALL_TO_LIBRARY - ADD_ALL_TO_LIBRARY = self.parent.getString(30307) - global SUBSCRIBE - SUBSCRIBE = self.parent.getString(30312) util.info("Examining url " + url) - if MOVIES_GENRE in url: - return self.list_by_genres(url) + if J_MOVIES_A_TO_Z_TYPE in url: + return self.load_json_list(url) + if J_MOVIES_GENRE in url: + return self.load_json_list(url) if MOVIES_YEAR in url: return self.list_by_year(url) - if self.is_most_popular(url): - if "movie" in url: - return self.list_movies_by_letter(url) - if "tv" in url: - return self.list_tv_shows_by_letter(url) - if self.is_recently_added(url): - util.debug("is recently added") - if "movie" in url: - return self.list_movie_recently_added(url) - if "tv" in url: - util.debug("is TV") - return self.list_tv_recently_added(url) - if self.is_search(url): - return self.list_search(url) - if self.is_base_url(url): - self.base_url = url - if "movie" in url: - return self.a_to_z(MOVIES_A_TO_Z_TYPE) - if "tv" in url: - return self.a_to_z(TV_SHOWS_A_TO_Z_TYPE) - - if self.particular_letter(url): - if "movie" in url: - return self.list_movies_by_letter(url) - if "tv" in url: - return self.list_tv_shows_by_letter(url) - - if self.has_tv_show_flag(url): - return self.list_tv_show(self.remove_flags(url)) - - if self.is_xml_letter(url): - util.debug("xml letter") - if "movie" in url: - return self.list_xml_letter(url) + if J_MOVIES_MOST_POPULAR in url: + return self.list_videos(url) + if J_MOVIES_RECENTLY_ADDED in url: + return self.list_videos(url) + if J_TV_SHOWS_A_TO_Z_TYPE in url: + return self.a_to_z(J_TV_SHOWS) + if J_TV_SHOWS in url: + return self.list_series_letter(url) + if J_SERIES in url: + return self.list_episodes(url) + if J_TV_SHOWS_MOST_POPULAR in url: + return self.list_series_letter(url) + if J_TV_SHOWS_RECENTLY_ADDED in url: + return self.list_recentlyadded_episodes(url) if SUBSCRIPTION_MANAGER in url: return self.subscription_manager_tvshows_all_xml() + if CSFD_BASE in url: + return self.csfd_lists(url) + return self.list_videos(url) + + def load_json_list(self, url): + result = [] + data = util.request(url) + json_list = json.loads(data) + for key, value in json_list.iteritems(): + item = self.dir_item(title=key.title()) + item['url'] = value + result.append(item) + item['menu'] = {"[B][COLOR red]" + ADD_ALL_TO_LIBRARY + "[/COLOR][/B]": + {'action': 'add-all-to-library', + 'title': MOVIES_BY_GENRES, + 'url': value} + } + return sorted(result, key=lambda i: i['title']) + + def list_videos_create(self, videoArray): + result = [] + for video in videoArray: + item = self.video_item() + namePom = self.get_video_name(video) + item['title'] = namePom + item['img'] = IMAGE_MOVIE + video['i'] + urlPom = video['l'] if video['l'] else "" + item['url'] = urlPom + if RATING in video: + item['rating'] = video[RATING] + if LANG in video: + item['lang'] = video[LANG] + if QUALITY in video: + item['quality'] = video[QUALITY] + item['menu'] = {"[B][COLOR red]" + ADD_TO_LIBRARY + "[/COLOR][/B]": + {'url': urlPom, + 'action': 'add-to-library', + 'name': self.get_library_video_name(video), + 'type': LIBRARY_TYPE_VIDEO}} + result.append(item) + return result - return [self.dir_item(title="I failed", url="fail")] + def list_videos(self, url): + data = util.request(url) + json_video_array = json.loads(data) + return self.list_videos_create(json_video_array) - def list_by_genres(self, url): - MOVIES_BY_GENRES = self.parent.getString(30302) - if "?" + GENRE_PARAM in url: - return self.list_xml_letter(url) - else: - result = [] - page = util.request(url) - data = util.substr(page, '', '([^<]+)', data, - re.IGNORECASE | re.DOTALL))): - if s.group(2) == '0000': - continue - urlPom = url + "?" + YEAR_PARAM + "=" + s.group(1) - item = {'url': urlPom, 'title': s.group(2), 'type': 'dir'} + data = self.all_movies_with_key('y') + for s in sorted(data.keys(), reverse=True): + urlPom = url + "?" + YEAR_PARAM + "=" + s + item = {'url': urlPom, 'title': s, 'type': 'dir'} item['menu'] = {"[B][COLOR red]" + ADD_ALL_TO_LIBRARY + "[/COLOR][/B]": { - 'action': 'add-all-to-library', 'title': MOVIES_BY_YEAR, 'url': urlPom}} + 'action': 'add-all-to-library', + 'title': MOVIES_BY_YEAR, + 'url': urlPom}} self._filter(result, item) return result - def list_xml_letter(self, url): + def list_episodes(self, url): result = [] data = util.request(url) - tree = ET.fromstring(data) - for film in tree.findall('film'): - item = self.video_item() - try: - if ISO_639_1_CZECH in self.ISO_639_1_CZECH: - title = film.findtext('nazevcs').encode('utf-8') - else: - title = film.findtext('nazeven').encode('utf-8') - basetitle = '%s (%s)' % (title, film.findtext('rokvydani')) - item['title'] = '%s - %s' % (basetitle, film.findtext('kvalita').upper()) - item['name'] = item['title'] - item['img'] = film.findtext('obrazekmaly') - item['url'] = self.base_url + '/player/' + self.parent.make_name( - film.findtext('nazeven').encode('utf-8') + '-' + film.findtext('rokvydani')) - item['menu'] = {"[B][COLOR red]" + ADD_TO_LIBRARY + "[/COLOR][/B]": { - 'url': item['url'], 'action': 'add-to-library', 'name': basetitle, }} - self._filter(result, item) - except Exception, e: - util.error("ERR TITLE: " + item['title'] + " | " + str(e)) - pass - util.debug(result) + json_series = json.loads(data) + for series in json_series: + for series_key, episode in series.iteritems(): + for episode_key, video in episode.iteritems(): + item = self.video_item() + item['title'] = series_key + "x" + episode_key + " - " + video['n'] + if video['i'] is not None: + item['img'] = IMAGE_EPISODE + video['i'] + item['url'] = video['l'] if video['l'] else "" + result.append(item) + if not self.reverse_eps: + result.reverse() return result - def list_xml_letter_to_library(self, url): + def list_recentlyadded_episodes(self, url): result = [] data = util.request(url) - tree = ET.fromstring(data) - total = float(len(tree.findall('film'))) - i = 0 - for film in tree.findall('film'): - i += 1 + json_series = json.loads(data) + for episode in json_series: item = self.video_item() - try: - if ISO_639_1_CZECH in self.ISO_639_1_CZECH: - title = film.findtext('nazevcs').encode('utf-8') - else: - title = film.findtext('nazeven').encode('utf-8') - basetitle = '%s (%s)' % (title, film.findtext('rokvydani')) - item['title'] = '%s' % (basetitle) - item['name'] = item['title'] - item['url'] = self.base_url + '/player/' + self.parent.make_name( - film.findtext('nazeven').encode('utf-8') + '-' + film.findtext('rokvydani')) - item['menu'] = {"[B][COLOR red]" + ADD_TO_LIBRARY + "[/COLOR][/B]": { - 'url': item['url'], 'action': 'add-to-library', 'name': basetitle}} - item['update'] = True - item['notify'] = False - procenta = (i / total) * 100 - self.parent.dialog.update(int(procenta), item['title']) - self.parent.add_item(item) - except Exception, e: - util.error("ERR TITLE: " + item['title'] + " | " + str(e)) - pass - - def list_tv_show(self, url): - result = [] - page = util.request(url) - data = util.substr(page, '
', '', data, re.IGNORECASE | re.DOTALL): - serie = s.group(0) - serie_name = re.search('([^<]+)', serie).group(1) - for e in re.finditer('', serie, re.IGNORECASE | re.DOTALL): - episode = e.group(0) - item = self.video_item() - ep_name = re.search('(?P[^<]+)(?P[^<]+)', - episode) - if ep_name: - item['title'] = '%s %s %s' % ( - serie_name, ep_name.group('id'), ep_name.group('name')) - item['epname'] = ep_name.group('name') - item['ep'] = ep_name - i = re.search('
[^\"]+).+?[^\"]+)', episode, re.IGNORECASE | re.DOTALL) - if i: - item['img'] = self._url(i.group('img')) - item['url'] = i.group('url') - if i and ep_name: - self._filter(result, item) - if self.reverse_eps: - result.reverse() + item['title'] = self.get_episode_recently_name(episode) + if episode['i'] is not None: + item['img'] = IMAGE_EPISODE + episode['i'] + item['url'] = episode['l'] + result.append(item) return result - def add_video_flag(self, items): - flagged_items = [] - for item in items: - flagged_item = self.video_item() - flagged_item.update(item) - flagged_items.append(flagged_item) - return flagged_items - - def add_directory_flag(self, items): - flagged_items = [] - for item in items: - flagged_item = self.dir_item() - flagged_item.update(item) - flagged_items.append(flagged_item) - return flagged_items - - @cached(ttl=24) + def get_video_name(self, video): + name = self.get_localized_name(video['n']) + year = (" (" + video['y'] + ") ") if video['y'] else " " + quality = ("- " + video[QUALITY].upper()) if video[QUALITY] else "" + return name + year + quality + + def get_library_video_name(self, video): + name = self.get_localized_name(video['n']) + year = (" (" + video['y'] + ") ") if video['y'] else " " + return (name + year).encode('utf-8') + + def get_episode_recently_name(self, episode): + serial = self.get_localized_name(episode['t']) + ' ' + series = episode['s'] + "x" + number = episode['e'] + " - " + name = self.get_localized_name(episode['n']) + return serial + series + number + name + + def get_localized_name(self, names): + return (names[self.ISO_639_1_CZECH] + if self.ISO_639_1_CZECH in names else names[ISO_639_1_CZECH]) + + # @cached(ttl=24) + @simplecache.use_cache(cache_days=3) def get_data_cached(self, url): return util.request(url) - def list_by_letter(self, url): - result = [] - page = self.get_data_cached(url) - data = util.substr(page, '