def set_listened_all(showId): items_count = 0 offset = 0 episodeIds = [] data = call_api(url="https://api.mujrozhlas.cz/shows/" + showId + "/episodes?sort=-since&page[limit]=1&page[offset]=0") if "err" in data: xbmcgui.Dialog().notification("ČRo", "Problém při získání pořadů", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit() if "data" in data and len(data["data"]) > 0: items_count = int(data["meta"]["count"]) if items_count > 0: while offset < items_count: data = call_api( url="https://api.mujrozhlas.cz/shows/" + showId + "/episodes?sort=-since&page[limit]=100&page[offset]=" + str(offset)) if "err" in data: xbmcgui.Dialog().notification("ČRo", "Problém při získání pořadů", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit() if "data" in data and len(data["data"]) > 0: for episode in data["data"]: episodeIds.append(episode["id"]) offset = offset + 100 for episodeId in episodeIds: if not get_listened(episodeId): set_listened(episodeId, showId) xbmc.executebuiltin('Container.Refresh')
def list_program_day(stationId, day, label): xbmcplugin.setPluginCategory(_handle, label) day = parse_datetime(day).strftime("%Y-%m-%d") episodeIds = [] data = call_api( url="https://api.mujrozhlas.cz/schedule-day-flat?filter[day]=" + day + "&filter[stations.id]=" + stationId) if "err" in data: xbmcgui.Dialog().notification("ČRo", "Problém při načtení programu", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit() if "data" in data and len(data["data"]) > 0: for item in data["data"]: episodeIds.append(item["id"]) else: xbmcgui.Dialog().notification("ČRo", "Problém při načtení programu", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit() if len(episodeIds) > 0: for episodeId in episodeIds: data = call_api(url="https://api.mujrozhlas.cz/episodes/" + episodeId) if "err" not in data and "data" in data and len(data["data"]) > 0: for item in data["data"]: print(item)
def get_minmax_days(stationId): mindate = "" maxdate = "" data = call_api( url="https://api.mujrozhlas.cz/schedule?filter[stations.id]=" + stationId + "&sort=since&page[limit]=1&page[offset]=0") if "err" in data: xbmcgui.Dialog().notification("ČRo", "Problém při načtení programu", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit() if "data" in data and len(data["data"]) > 0: lastitem = int(data["meta"]["count"]) - 1 for item in data["data"]: mindate = parse_date( item["attributes"]["since"]).strftime("%d.%m.%Y") data = call_api( url="https://api.mujrozhlas.cz/schedule?filter[stations.id]=" + stationId + "&sort=since&page[limit]=1&page[offset]=" + str(lastitem)) if "err" in data: xbmcgui.Dialog().notification("ČRo", "Problém při načtení programu", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit() if "data" in data and len(data["data"]) > 0: lastitem = data["meta"]["count"] for item in data["data"]: maxdate = parse_date( item["attributes"]["since"]).strftime("%d.%m.%Y") return parse_datetime(mindate), parse_datetime(maxdate) else: xbmcgui.Dialog().notification("ČRo", "Problém při načtení programu", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit()
def list_shows_stations_shows(stationId, page, label): xbmcplugin.setPluginCategory(_handle, label) page = int(page) page_size = int(addon.getSetting("page_size")) station = get_station_from_stationId(stationId) data = call_api(url="https://api.mujrozhlas.cz/stations/" + stationId + "/shows?page[limit]=" + str(page_size) + "&page[offset]=" + str((page - 1) * page_size)) if "err" in data: xbmcgui.Dialog().notification("ČRo", "Problém při získání pořadů", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit() if "data" in data and len(data["data"]) > 0: items_count = int(data["meta"]["count"]) for show in data["data"]: cast = [] list_item = xbmcgui.ListItem(label=show["attributes"]["title"]) list_item.setArt({ "thumb": show["attributes"]["asset"]["url"], "icon": show["attributes"]["asset"]["url"] }) list_item.setInfo( "video", { "title": show["attributes"]["title"], "director": [show["attributes"]["asset"]["credit"]["author"]], "plot": show["attributes"]["description"], "studio": station }) if "participants" in show["relationships"] and len( show["relationships"]["participants"]["data"]) > 0: for person in show["relationships"]["participants"]["data"]: cast.append(get_person(person["id"])) list_item.setInfo("video", {"cast": cast}) url = get_url(action='list_show', showId=show["id"], page=1, label=encode(show["attributes"]["title"])) menus = [ ("Přidat k oblíbeným pořadům", "RunPlugin(plugin://plugin.audio.cro?action=add_favourites&showId=" + str(show["id"]) + "&others=0)"), ("Přidat k ostatním obl. pořadům", "RunPlugin(plugin://plugin.audio.cro?action=add_favourites&showId=" + str(show["id"]) + "&others=1)") ] list_item.addContextMenuItems(menus) xbmcplugin.addDirectoryItem(_handle, url, list_item, True) if page * page_size <= items_count: list_item = xbmcgui.ListItem(label="Následující strana") url = get_url(action='list_shows_stations_shows', stationId=stationId, page=page + 1, label=label) xbmcplugin.addDirectoryItem(_handle, url, list_item, True) xbmcplugin.endOfDirectory(_handle) else: xbmcgui.Dialog().notification("ČRo", "Nenalezen žádný pořad", xbmcgui.NOTIFICATION_WARNING, 4000) sys.exit()
def list_topics(label): xbmcplugin.setPluginCategory(_handle, label) data = call_api(url="https://api.mujrozhlas.cz/topics") if "err" in data: xbmcgui.Dialog().notification("ČRo", "Problém při získání seznamu témat", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit() if "data" in data and len(data["data"]) > 0: for topic in data["data"]: if "attributes" in topic and "title" in topic[ "attributes"] and len(topic["attributes"]["title"]) > 0: topicId = topic["id"] list_item = xbmcgui.ListItem( label=topic["attributes"]["title"]) url = get_url(action='list_topic', topicId=topicId, label=label + " / " + encode(topic["attributes"]["title"])) list_item.setArt({ "thumb": topic["attributes"]["asset"]["url"], "icon": topic["attributes"]["asset"]["url"] }) xbmcplugin.addDirectoryItem(_handle, url, list_item, True) xbmcplugin.endOfDirectory(_handle) else: xbmcgui.Dialog().notification("ČRo", "Problém při získání seznamu témat", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit()
def get_show(showId): data = call_api(url = "https://api.mujrozhlas.cz/shows/" + showId) if "err" in data: xbmcgui.Dialog().notification("ČRo","Problém při získání dat o pořadu", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit() if "data" in data and len(data["data"]) > 0 and "attributes" in data["data"]: title = data["data"]["attributes"]["title"] img = data["data"]["attributes"]["asset"]["url"] description = data["data"]["attributes"]["description"] shortDescription = data["data"]["attributes"]["shortDescription"] author = data["data"]["attributes"]["asset"]["credit"]["author"] source = data["data"]["attributes"]["asset"]["credit"]["source"] cast = [] if "participants" in data["data"]["relationships"] and len(data["data"]["relationships"]["participants"]["data"]) > 0: for person in data["data"]["relationships"]["participants"]["data"]: cast.append(get_person(person["id"])) if len(data["data"]["relationships"]["stations"]["data"]) > 0: station = get_station_from_stationId(data["data"]["relationships"]["stations"]["data"][0]["id"]) else: station = "" return { "id" : showId, "title" : title, "img" : img, "description" : description, "shortDescription" : shortDescription, "director" : author, "source" : source, "cast" : cast, "station" : station } else: xbmcgui.Dialog().notification("ČRo","Problém při získání dat o pořadu", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit()
def search_shows(shows, shows_ordered, attribute, query): data = call_api(url="https://api.mujrozhlas.cz/shows?filter[" + attribute + "][like]=" + quote(query) + "&page[limit]=100") if "err" not in data and "data" in data and len(data["data"]) > 0: for item in data["data"]: if item["id"] not in shows.keys(): show = get_show(item["id"]) shows.update({show["id"]: show}) shows_ordered.update({show["id"]: show["title"]}) return shows, shows_ordered
def get_widgets(topicId): widgets = [] data = call_api(url="https://api.mujrozhlas.cz/topics/" + topicId) if "err" in data: xbmcgui.Dialog().notification("ČRo", "Problém při získání pořadů", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit() if "data" in data and len(data["data"]) > 0 and "attributes" in data[ "data"] and "widgets" in data["data"]["attributes"]: for widget in data["data"]["attributes"]["widgets"]: if "title" in widget["attributes"] and len( widget["attributes"]["title"]) > 0: widgets.append(widget["attributes"]["title"]) return widgets
def list_show(showId, page, label, mark_new = 0): page = int(page) page_size = int(addon.getSetting("page_size")) show = get_show(showId) xbmcplugin.setPluginCategory(_handle, label) data = call_api(url = "https://api.mujrozhlas.cz/shows/" + showId + "/episodes?sort=-since&page[limit]=" + str(page_size) + "&page[offset]=" + str((page-1)*page_size)) if "err" in data: xbmcgui.Dialog().notification("ČRo","Problém při získání pořadů", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit() if "data" in data and len(data["data"]) > 0: items_count = int(data["meta"]["count"]) for episode in data["data"]: if "attributes" in episode and "title" in episode["attributes"] and len(episode["attributes"]["title"]) > 0: starttime = parse_date(episode["attributes"]["since"]) if "mirroredSerial" in episode["attributes"] and "totalParts" in episode["attributes"]["mirroredSerial"] and "part" in episode["attributes"]: parts = " (" + str(episode["attributes"]["part"]) + "/" + str(episode["attributes"]["mirroredSerial"]["totalParts"]) + ") " else: parts = "" title = episode["attributes"]["title"] + parts + " (" + starttime.strftime("%d.%m.%Y %H:%M") + ")" from libs.favourites import get_listened link = episode["attributes"]["audioLinks"][0]["url"] if int(mark_new) == 1 and not get_listened(episode["id"]): list_item = xbmcgui.ListItem(label="* " + title) else: list_item = xbmcgui.ListItem(label=title) list_item.setArt({ "thumb" : show["img"], "icon" : show["img"] }) list_item.setInfo( "video", { "tvshowtitle" : show["title"], "title" : title, "aired" : starttime.strftime("%Y-%m-%d"), "director" : [show["director"]] , "plot" : show["description"], "studio" : show["station"] }) if len(show["cast"]) > 0: list_item.setInfo( "video", { "cast" : show["cast"] }) list_item.setProperty("IsPlayable", "true") list_item.setContentLookup(False) url = get_url(action='play', url = encode(link), showId = showId, episodeId = episode["id"], title = encode(title), img = show["img"]) if PY2: xbmcplugin.addDirectoryItem(_handle, url, list_item, False) else: xbmcplugin.addDirectoryItem(_handle, url, list_item, True) if page * page_size <= items_count: list_item = xbmcgui.ListItem(label="Následující strana") url = get_url(action='list_show', showId = showId, page = page + 1, label = label, mark_new = mark_new) xbmcplugin.addDirectoryItem(_handle, url, list_item, True) xbmcplugin.endOfDirectory(_handle, cacheToDisc = False) else: xbmcgui.Dialog().notification("ČRo","Problém při získání pořadů", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit()
def search_episodes(shows, shows_ordered, attribute, query): data = call_api(url="https://api.mujrozhlas.cz/episodes?filter[" + attribute + "][like]=" + quote(query) + "&page[limit]=100") if "err" not in data and "data" in data and len(data["data"]) > 0: for item in data["data"]: if item["type"] == "episode" or item["type"] == "serial": if item["relationships"]["show"]["data"][ "id"] not in shows.keys() and ( "audioLinks" not in item["attributes"] or len(item["attributes"]["audioLinks"]) > 0): show = get_show( item["relationships"]["show"]["data"]["id"]) shows.update({show["id"]: show}) shows_ordered.update({show["id"]: show["title"]}) if item["type"] == "show": if item["id"] not in shows.keys(): show = get_show(item["id"]) shows.update({show["id"]: show}) shows_ordered.update({show["id"]: show["title"]}) return shows, shows_ordered
def get_urls(): urls = {} data = call_api(url="https://api.mujrozhlas.cz/stations") if "err" in data: xbmcgui.Dialog().notification("ČRo", "Problém při načtení streamu", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit() if "data" in data and len(data["data"]): for station in data["data"]: if "attributes" in station and "audioLinks" in station[ "attributes"] and len( station["attributes"]["audioLinks"]) > 0: url = "" aac_urls = {} mp3_urls = {} for audiolink in station["attributes"]["audioLinks"]: if audiolink["linkType"] == "directstream" and len( url) == 0: if audiolink["variant"] == 'aac': aac_urls.update( {audiolink["bitrate"]: audiolink["url"]}) if audiolink["variant"] == 'mp3': mp3_urls.update( {audiolink["bitrate"]: audiolink["url"]}) if audiolink["variant"] == "mp3" and audiolink[ "linkType"] == "directstream" and len(url) == 0: url = audiolink["url"] if addon.getSetting("prefer_aac") == "true": if len(aac_urls) > 0: url = aac_urls[max(aac_urls.keys())] elif len(mp3_urls): url = mp3_urls[max(mp3_urls.keys())] else: if len(mp3_urls) > 0: url = mp3_urls[max(mp3_urls.keys())] elif len(aac_urls): url = aac_urls[max(aac_urls.keys())] if len(url) > 1: urls.update({station["id"]: url}) return urls
def get_current_schedule(): schedule = {} data = call_api(url="https://api.mujrozhlas.cz/schedule-current") if "err" in data: xbmcgui.Dialog().notification("ČRo", "Problém při načtení programu", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit() if "data" in data and len(data["data"]) > 0: for item in data["data"]: now = datetime.now() if now > parse_date( item["attributes"]["since"]) and now < parse_date( item["attributes"]["till"]): if "show" in item["relationships"]: showId = item["relationships"]["show"]["data"]["id"] else: showId = "N/A" schedule.update({ item["relationships"]["station"]["data"]["id"]: { "showId": showId, "show": item["attributes"]["mirroredShow"]["title"], "title": item["attributes"]["title"], "start": parse_date( item["attributes"]["since"]).strftime("%H:%M"), "end": parse_date( item["attributes"]["till"]).strftime("%H:%M") } }) else: xbmcgui.Dialog().notification("ČRo", "Problém při načtení programu", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit() return schedule
def get_unlistened_count(showId): items_count = 0 new = 0 err = 0 data = call_api(url="https://api.mujrozhlas.cz/shows/" + showId + "/episodes?sort=-since&page[limit]=1&page[offset]=0") if "err" in data: # xbmcgui.Dialog().notification("ČRo","Problém při získání pořadů", xbmcgui.NOTIFICATION_ERROR, 4000) return -1 if "data" in data and len(data["data"]) > 0: items_count = int(data["meta"]["count"]) open_db() listened_count = 0 row = None for row in db.execute( 'SELECT count(1) pocet FROM listened WHERE showId = ?', [str(showId)]): listened_count = int(row[0]) close_db() new = items_count - listened_count return new
def get_stations(filtered=1): stations = {} stations_nums = {} max_num = 0 not_found = 0 valid_to = -1 filename = get_userdata_dir() + "stations.txt" try: with codecs.open(filename, "r", encoding="utf-8") as file: for line in file: item = line[:-1] data = json.loads(item) stations = data["stations"] stations_nums_str = data["stations_nums"] for num in stations_nums_str.keys(): stations_nums.update({int(num): stations_nums_str[num]}) valid_to = data["valid_to"] except IOError: not_found = 1 max_num = len(stations_nums) if not_found == 1 or valid_to < int(time.time()): data = call_api(url="https://api.mujrozhlas.cz/stations") if "err" in data: xbmcgui.Dialog().notification("ČRo", "Problém při načtení stanic", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit() if "data" in data and len(data["data"]) > 0: for station in data["data"]: if station["attributes"]["shortTitle"] not in stations.keys(): max_num = max_num + 1 stations_nums.update( {max_num: station["attributes"]["shortTitle"]}) if "url" in station["attributes"]["asset"]: img = station["attributes"]["asset"]["url"] else: img = "" stations.update({ station["attributes"]["shortTitle"]: { "id": station["id"], "title": station["attributes"]["shortTitle"], "img": img, "enabled": 1 } }) try: with codecs.open(filename, "w", encoding="utf-8") as file: data = json.dumps({ "stations": stations, "stations_nums": stations_nums, "valid_to": int(time.time()) + 60 * 60 * 24 }) file.write('%s\n' % data) except IOError: xbmcgui.Dialog().notification("ČRo", "Problém při uložení stanic", xbmcgui.NOTIFICATION_ERROR, 4000) else: xbmcgui.Dialog().notification("ČRo", "Problém při načtení stanic", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit() if int(filtered) == 1: for num in sorted(stations_nums.keys()): if int(stations[stations_nums[num]]["enabled"]) == 0: del stations[stations_nums[num]] del stations_nums[num] return stations, stations_nums
def list_topic_recommended(topicId, filtr, label): xbmcplugin.setPluginCategory(_handle, label) data = call_api(url="https://api.mujrozhlas.cz/topics/" + topicId) if "err" in data: xbmcgui.Dialog().notification("ČRo", "Problém při získání pořadů", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit() if "data" in data and len(data["data"]) > 0 and "attributes" in data[ "data"] and "widgets" in data["data"]["attributes"]: for widget in data["data"]["attributes"]["widgets"]: if "attributes" in widget and "title" in widget[ "attributes"] and encode( widget["attributes"]["title"]) == filtr: if "items" in widget["attributes"]: items = widget["attributes"]["items"] elif "entities" in widget["attributes"]: items = widget["attributes"]["entities"] for item in items: if "entity" in item and "type" in item["entity"]: if item["entity"]["type"] == "show": show = get_show(item["entity"]["id"]) list_item = xbmcgui.ListItem(label=show["title"]) list_item.setArt({ "thumb": show["img"], "icon": show["img"] }) list_item.setInfo( "video", { "title": show["title"], "director": [show["director"]], "plot": show["description"], "studio": show["station"] }) if len(show["cast"]) > 0: list_item.setInfo("video", {"cast": show["cast"]}) menus = [ ("Přidat k oblíbeným pořadům", "RunPlugin(plugin://plugin.audio.cro?action=add_favourites&showId=" + str(show["id"]) + "&others=0)"), ("Přidat k ostatním obl. pořadům", "RunPlugin(plugin://plugin.audio.cro?action=add_favourites&showId=" + str(show["id"]) + "&others=1)") ] list_item.addContextMenuItems(menus) url = get_url(action='list_show', showId=show["id"], page=1, label=encode(show["title"])) xbmcplugin.addDirectoryItem( _handle, url, list_item, True) if item["entity"]["type"] == "episode": show = get_show(item["entity"]["relationships"] ["show"]["data"]["id"]) starttime = parse_date( item["entity"]["attributes"]["since"]) title = item["entity"]["attributes"][ "mirroredShow"]["title"] + " - " + item[ "entity"]["attributes"][ "title"] + " (" + starttime.strftime( "%d.%m.%Y %H:%M") + ")" list_item = xbmcgui.ListItem(label=title) url = item["entity"]["attributes"]["audioLinks"][ 0]["url"] list_item.setArt({ "thumb": show["img"], "icon": show["img"] }) list_item.setInfo( "video", { "tvshowtitle": show["title"], "title": title, "aired": starttime.strftime("%Y-%m-%d"), "director": [show["director"]], "plot": show["description"], "studio": show["station"] }) if len(show["cast"]) > 0: list_item.setInfo("video", {"cast": show["cast"]}) list_item.setProperty("IsPlayable", "true") list_item.setContentLookup(False) url = get_url(action='play', url=url, showId=show["id"], episodeId=item["entity"]["id"], title=encode(title), img=show["img"]) if PY2: xbmcplugin.addDirectoryItem( _handle, url, list_item, False) else: xbmcplugin.addDirectoryItem( _handle, url, list_item, True) if "type" in item and item["type"] == "episode": show = get_show( item["relationships"]["show"]["data"]["id"]) starttime = parse_date(item["attributes"]["since"]) title = item["attributes"]["mirroredShow"][ "title"] + " - " + item["attributes"][ "title"] + " (" + starttime.strftime( "%d.%m.%Y %H:%M") + ")" url = item["attributes"]["audioLinks"][0]["url"] list_item = xbmcgui.ListItem(label=title) list_item.setArt({ "thumb": show["img"], "icon": show["img"] }) list_item.setInfo( "video", { "tvshowtitle": show["title"], "title": title, "aired": starttime.strftime("%Y-%m-%d"), "director": [show["director"]], "plot": show["description"], "studio": show["station"] }) if len(show["cast"]) > 0: list_item.setInfo("video", {"cast": show["cast"]}) list_item.setProperty("IsPlayable", "true") list_item.setContentLookup(False) url = get_url(action='play', url=url, showId=show["id"], episodeId=item["id"], title=encode(title), img=show["img"]) if PY2: xbmcplugin.addDirectoryItem( _handle, url, list_item, False) else: xbmcplugin.addDirectoryItem( _handle, url, list_item, True) xbmcplugin.endOfDirectory(_handle) else: xbmcgui.Dialog().notification("ČRo", "Problém při získání pořadů", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit()
def list_topic(topicId, label): xbmcplugin.setPluginCategory(_handle, label) data = call_api(url="https://api.mujrozhlas.cz/topics/" + topicId + "/episodes?page[limit]=100") if "err" in data: xbmcgui.Dialog().notification("ČRo", "Problém při získání pořadů", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit() if "data" in data and len(data["data"]) > 0: widgets = get_widgets(topicId) for widget in widgets: list_item = xbmcgui.ListItem(label=widget) list_item.setProperty("IsPlayable", "false") url = get_url(action='list_topic_recommended', topicId=topicId, filtr=encode(widget), label=label + " / " + encode(widget)) xbmcplugin.addDirectoryItem(_handle, url, list_item, True) shows = {} shows_added = [] for episode in data["data"]: if "attributes" in episode and "title" in episode[ "attributes"] and len(episode["attributes"]["title"]) > 0: if episode["relationships"]["show"]["data"][ "id"] not in shows_added: show = get_show( episode["relationships"]["show"]["data"]["id"]) shows.update({show["title"]: show}) shows_added.append(show["id"]) for key in sorted(shows.keys()): show = shows[key] list_item = xbmcgui.ListItem(label=show["title"]) list_item.setArt({"thumb": show["img"], "icon": show["img"]}) list_item.setInfo( "video", { "title": show["title"], "director": [show["director"]], "plot": show["description"], "studio": show["station"] }) if len(show["cast"]) > 0: list_item.setInfo("video", {"cast": show["cast"]}) menus = [ ("Přidat k oblíbeným pořadům", "RunPlugin(plugin://plugin.audio.cro?action=add_favourites&showId=" + str(show["id"]) + "&others=0)"), ("Přidat k ostatním obl. pořadům", "RunPlugin(plugin://plugin.audio.cro?action=add_favourites&showId=" + str(show["id"]) + "&others=1)") ] list_item.addContextMenuItems(menus) url = get_url(action='list_show', showId=show["id"], page=1, label=encode(show["title"])) list_item.setContentLookup(False) xbmcplugin.addDirectoryItem(_handle, url, list_item, True) xbmcplugin.endOfDirectory(_handle) else: xbmcgui.Dialog().notification("ČRo", "Problém při získání pořadů", xbmcgui.NOTIFICATION_ERROR, 4000) sys.exit()
def list_favourites_new(label): items = int(addon.getSetting("favourites_new_count")) xbmcplugin.setPluginCategory(_handle, label) favourites = get_favourites(others=0) episodes = {} episodes_ordered = {} for showId in favourites: show = favourites[showId] data = call_api(url="https://api.mujrozhlas.cz/shows/" + showId + "/episodes?sort=-since&page[limit]=" + str(items)) if "err" in data: xbmcgui.Dialog().notification( "ČRo", "Pořad " + show["title"] + " nebyl nalezený", xbmcgui.NOTIFICATION_ERROR, 4000) # sys.exit() if "data" in data and len(data["data"]) > 0: for episode in data["data"]: if "attributes" in episode and "title" in episode[ "attributes"] and len( episode["attributes"]["title"]) > 0: starttime = parse_date(episode["attributes"]["since"]) starttime_ts = time.mktime(starttime.timetuple()) episodes_ordered.update({episode["id"]: starttime_ts}) if "mirroredSerial" in episode[ "attributes"] and "totalParts" in episode[ "attributes"][ "mirroredSerial"] and "part" in episode[ "attributes"]: parts = " (" + str( episode["attributes"]["part"]) + "/" + str( episode["attributes"]["mirroredSerial"] ["totalParts"]) + ") " else: parts = "" title = episode["attributes"][ "title"] + parts + " (" + starttime.strftime( "%d.%m.%Y %H:%M") + ")" link = episode["attributes"]["audioLinks"][0]["url"] episodes.update({ episode["id"]: { "showId": showId, "link": link, "img": show["img"], "tvshowtitle": show["title"], "title": title, "aired": starttime.strftime("%Y-%m-%d"), "director": [show["director"]], "plot": show["description"], "studio": show["station"] } }) if len(episodes) > 0: for key in sorted(episodes_ordered, key=episodes_ordered.get, reverse=True): list_item = xbmcgui.ListItem(label=episodes[key]["title"]) list_item.setArt({ "thumb": episodes[key]["img"], "icon": episodes[key]["img"] }) list_item.setInfo( "video", { "tvshowtitle": episodes[key]["tvshowtitle"], "title": episodes[key]["title"], "aired": episodes[key]["aired"], "director": episodes[key]["director"], "plot": episodes[key]["plot"], "studio": episodes[key]["studio"] }) list_item.setProperty("IsPlayable", "true") list_item.setContentLookup(False) url = get_url(action='play', url=encode(episodes[key]["link"]), showId=episodes[key]["showId"], episodeId=key, title=encode(episodes[key]["title"]), img=episodes[key]["img"]) if PY2: xbmcplugin.addDirectoryItem(_handle, url, list_item, False) else: xbmcplugin.addDirectoryItem(_handle, url, list_item, True) xbmcplugin.endOfDirectory(_handle)