diff --git a/addon.xml b/addon.xml index e14c756..1ddc277 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@ - + @@ -23,22 +23,7 @@ https://vidfltr.slashproc.org/ https://kodi.slashproc.org/repo/plugin.video.vidfltr/ - - resources/img/kodi/icon.png - resources/img/kodi/fanart.jpg - resources/img/kodi/banner.jpg - resources/img/kodi/clearlogo.png - - - 0.9.7 -- Vimeo Add-on is broken, play with Youtube-DL until it's fixed -0.9.6 -- add display of official/unofficial count in main artist and country folders -- fix pager enumeration in main artist and country if Video Selection isn't set to show all videos -- don't list artists with known country also in Unknown -- add page counter for main artists, countries and sorted folders -- various other fixes and cleanups -0.9.5 + 0.9.5 - fix display of quotation marks in video lists - add pagination for artists on main page and countries - fix Musly (similar music) sort order and filter out dupes diff --git a/changelog.txt b/changelog.txt index 2c41269..ef790a4 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,11 +1,3 @@ -0.9.7 -- Vimeo Add-on is broken, play with Youtube-DL until it's fixed -0.9.6 -- add display of official/unofficial count in main artist and country folders -- fix pager enumeration in main artist and country if Video Selection isn't set to show all videos -- don't list artists with known country also in Unknown -- add page counter for main artists, countries and sorted folders -- various other fixes and cleanups 0.9.5 - fix display of quotation marks in video lists - add pagination for artists on main page and countries diff --git a/default.py b/default.py index 1e159d1..c0be3f6 100644 --- a/default.py +++ b/default.py @@ -18,12 +18,11 @@ addon = xbmcaddon.Addon(id=addonID) pluginhandle = int(sys.argv[1]) translation = addon.getLocalizedString addonDir = xbmc.translatePath(addon.getAddonInfo('path')) -defaultFanart = os.path.join(addonDir, 'resources/img/kodi/noicon.png') -icon = os.path.join(addonDir, 'resources/img/kodi/icon.png') -clearlogo = os.path.join(addonDir, 'resources/img/kodi/clearlogo.png') -fanart = os.path.join(addonDir, 'resources/img/kodi/fanart.png') -banner = os.path.join(addonDir, 'resources/img/kodi/banner.png') -poster = os.path.join(addonDir, 'resources/img/kodi/poster.png') +defaultFanart = os.path.join(addonDir, 'resources/images/noicon.png') +#fanart = os.path.join(addonDir, 'noicon.png') +# don't use special folder icons as long as there is'nt a nice icon for every style +fanart = 'DefaultFolder.png' +icon = os.path.join(addonDir, 'noicon.png') addon_work_folder = xbmc.translatePath("special://profile/addon_data/" + addonID) jsonVideos = xbmc.translatePath("special://profile/addon_data/" + addonID + "/videos.json") jsonArtists = xbmc.translatePath("special://profile/addon_data/" + addonID + "/artists.json") @@ -33,14 +32,8 @@ maxFileAge = maxFileAge * 60 mediatype = addon.getSetting("mediatype") # show only official, fanmade or all videos? videoselection = str(addon.getSetting("videoselection")).lower() -if videoselection != "2": - # videoselection is set to official or fanmade - # despite this selection show all in similar playlists and more from? - relatedselection = str(addon.getSetting("relatedselection")).lower() -else: - # if videoselection is set to show all videos relatedselection should - # also be true if the setting was set to false beforehand - relatedselection = "true" +# despite this selection show all in similar playlists and more from? +relatedselection = str(addon.getSetting("relatedselection")).lower() playLocalFile = str(addon.getSetting("playLocalFile")).lower() filesinlists = int(addon.getSetting("filesinlists")) useYTDL = addon.getSetting("useytdl") @@ -255,17 +248,9 @@ def play(url): ytdl = YDStreamExtractor.getVideoInfo(idVideo) playback_url = ytdl.streamURL() else: - if "vimeo" in entry['provider']: - # quick hard coded workaround - xbmc.log(msg="vimeo addon is broken, playing with ytdl", level=xbmc.LOGNOTICE) - import YDStreamExtractor - idVideo = entry['purl'] - ytdl = YDStreamExtractor.getVideoInfo(idVideo) - playback_url = ytdl.streamURL() - else: - # without youtube_dl - xbmc.log(msg="without ytdl", level=xbmc.LOGDEBUG) - playback_url = entry['url'] + # without youtube_dl + xbmc.log(msg="without ytdl", level=xbmc.LOGDEBUG) + playback_url = entry['url'] item = xbmcgui.ListItem(path=playback_url) @@ -280,7 +265,6 @@ def play(url): # doesn't work # item.setProperty('StartOffset', '56.4') -# Bug? It maybe works with StartPercent, see https://forum.kodi.tv/showthread.php?tid=129188&pid=2443114#pid2443114 # item.setProperty("VolumeAmplification", "7") # xbmc.log(msg=item.getProperty('VolumeAmplification'), level=xbmc.LOGNOTICE) @@ -518,14 +502,12 @@ def sortArtists(channel=""): for artist in channels: if artist in [unidecode(name.upper()) for name in entry['artists']]: if entry not in result: - # limit selection based on videoselection setting if show all isn't activated - if relatedselection != "true" and videoselection != "2": - if videoselection == "0": - if "true" in entry['official'].lower(): - result.append(entry) - elif videoselection == "1": - if "false" in entry['official'].lower(): - result.append(entry) + if videoselection == "0": + if "true" in entry['official'].lower(): + result.append(entry) + elif videoselection == "1": + if "false" in entry['official'].lower(): + result.append(entry) else: result.append(entry) # show artist @@ -557,17 +539,21 @@ def sortTitlesBy(limit, sort, start): start = int(start) end = start + filesinlists nextstart = end + 1 - fanart = getFanart(channel) - # limit selection if "all" isn't activated in videoselection - if videoselection != "2" and channel != "related" and channel != "relartists": - data = limitselection(data) + fanart = getFanart(channel) # limit to hits if hit != "" and hit == "true": for entry in data: if entry['hit'] == "true": - result.append(entry) + if videoselection == "0": + if "true" in entry['official']: + result.append(entry) + elif videoselection == "1": + if "false" in entry['official']: + result.append(entry) + elif videoselection == "2": + result.append(entry) data = result result = [] @@ -576,7 +562,14 @@ def sortTitlesBy(limit, sort, start): for entry in data: # played often at provider if int(entry['pcount']) >= pcounthigh: - result.append(entry) + if videoselection == "0": + if "true" in entry['official']: + result.append(entry) + elif videoselection == "1": + if "false" in entry['official']: + result.append(entry) + elif videoselection == "2": + result.append(entry) data = result result = [] @@ -584,7 +577,14 @@ def sortTitlesBy(limit, sort, start): if mycount != "" and mycount == "acount" and sort != "count": for entry in data: if int(entry['acount']) >= acounthigh: - result.append(entry) + if videoselection == "0": + if "true" in entry['official']: + result.append(entry) + elif videoselection == "1": + if "false" in entry['official']: + result.append(entry) + elif videoselection == "2": + result.append(entry) data = result result = [] @@ -592,7 +592,14 @@ def sortTitlesBy(limit, sort, start): if mycount != "" and mycount == "comments" and sort != "count": for entry in data: if int(entry['comments']) >= ccounthigh: - result.append(entry) + if videoselection == "0": + if "true" in entry['official']: + result.append(entry) + elif videoselection == "1": + if "false" in entry['official']: + result.append(entry) + elif videoselection == "2": + result.append(entry) data = result result = [] @@ -600,7 +607,15 @@ def sortTitlesBy(limit, sort, start): if mycount != "" and mycount == "likes" and sort != "count": for entry in data: if int(entry['likes']) >= likecounthigh: - result.append(entry) + if videoselection == "0": + if "true" in entry['official']: + result.append(entry) + elif videoselection == "1": + if "false" in entry['official']: + result.append(entry) + elif videoselection == "2": + result.append(entry) +# xbmc.log(msg=str(entry['pcount']), level=xbmc.LOGNOTICE) data = result result = [] @@ -608,7 +623,14 @@ def sortTitlesBy(limit, sort, start): if mycount != "" and mycount == "dislikes" and sort != "count": for entry in data: if int(entry['dislikes']) >= dislikecounthigh: - result.append(entry) + if videoselection == "0": + if "true" in entry['official']: + result.append(entry) + elif videoselection == "1": + if "false" in entry['official']: + result.append(entry) + elif videoselection == "2": + result.append(entry) data = result result = [] @@ -616,7 +638,14 @@ def sortTitlesBy(limit, sort, start): if mycount != "" and mycount == "controversial": for entry in data: if int(entry['controversial']) == int(1): - result.append(entry) + if videoselection == "0": + if "true" in entry['official']: + result.append(entry) + elif videoselection == "1": + if "false" in entry['official']: + result.append(entry) + elif videoselection == "2": + result.append(entry) data = result result = [] @@ -624,7 +653,14 @@ def sortTitlesBy(limit, sort, start): if channel != "" and channel != "all" and channel != "year" and channel != "related": for entry in data: if entry['style'] == channel: - result.append(entry) + if videoselection == "0": + if "true" in entry['official']: + result.append(entry) + elif videoselection == "1": + if "false" in entry['official']: + result.append(entry) + elif videoselection == "2": + result.append(entry) # or limit to last year # hm, either style or year, not both? elif channel != "" and channel == "year": @@ -638,7 +674,14 @@ def sortTitlesBy(limit, sort, start): import time dateadded = datetime.fromtimestamp(time.mktime(time.strptime(entry['dateadded'], '%Y-%m-%d %H:%M:%S'))) if dateadded >= lastyear: - result.append(entry) + if videoselection == "0": + if "true" in entry['official']: + result.append(entry) + elif videoselection == "1": + if "false" in entry['official']: + result.append(entry) + elif videoselection == "2": + result.append(entry) # related tracks (generated with musly) elif channel != "" and channel == "related": start = str(start) @@ -649,6 +692,7 @@ def sortTitlesBy(limit, sort, start): slugs.extend(entry['slug'].split(", ")) # and add all related slugs slugs.extend(entry['related'].split(", ")) + #xbmc.log(msg=str(slugs), level=xbmc.LOGNOTICE) for entry in data: # add all related slugs if entry['slug'] in slugs: @@ -657,7 +701,15 @@ def sortTitlesBy(limit, sort, start): # main slug will be filtered out. # In this case we add it again later, after sorting the result if not filter(lambda result: result['title'] == entry['title'], result): - result.append(entry) + if videoselection != "2" and relatedselection != "true": + if videoselection == "0": + if "true" in entry['official']: + result.append(entry) + elif videoselection == "1": + if "false" in entry['official']: + result.append(entry) + else: + result.append(entry) # slugs are sorted newest first because that's how they occur in the json # so we have to sort the result to the order in related aka the musly order (with prepended main slug) order_dict = {slug: index for index, slug in enumerate(slugs)} @@ -670,9 +722,6 @@ def sortTitlesBy(limit, sort, start): for entry in data: if entry['slug'] == start: result.insert(0, entry) - if relatedselection != "true": - result = limitselection(result) - maximum = len(result) # related is a list with max 21 entries, so we have to set start always to 0 start = 0 @@ -689,17 +738,29 @@ def sortTitlesBy(limit, sort, start): xbmc.log(msg=str(artists), level=xbmc.LOGNOTICE) # add all entries with artist in artists if entry['artists'] in artists: - result.append(entry) - xbmc.log(msg=str(results), level=xbmc.LOGNOTICE) - if relatedselection != "true": - result = limitselection(result) + if videoselection != "2" and relatedselection != "true": + if videoselection == "0": + if "true" in entry['official']: + result.append(entry) + elif videoselection == "1": + if "false" in entry['official']: + result.append(entry) + else: + result.append(entry) start = 0 - # sorted lists (by date and by numbers. But NOT controversial, which is a fixed list) + # unfiltered sorted lists (by date and by numbers. But NOT controversial, which is a fixed list) else: for entry in data: - result.append(entry) - + if videoselection == "0": + if "true" in entry['official']: + result.append(entry) + elif videoselection == "1": + if "false" in entry['official']: + result.append(entry) + elif videoselection == "2": + result.append(entry) + if sort != "" and sort == "random": random.shuffle(result) result = result[:filesinlists] @@ -716,17 +777,10 @@ def sortTitlesBy(limit, sort, start): modus = channel else: modus = 'all' - - if mycount != "" and mycount == "controversial": - # controversial is either 0 or 1 so it does not makes sense to sort upon it - # instead sort videos considered controversial by dislikes - # change controversial in videos.json to a float? - result = sorted(result, key = lambda i: (-1*float(i['dislikes']), i['title'])) - else: - # If count would'nt be negated one had to use reverse=true - # but then the second sorting, by title would be reversed also - # sort by negated count first and then by title in lexical order. - result = sorted(result, key = lambda i: (-1*float(i[mycount]), i['title'])) + # sort by negated count first and then by title in lexical order. + # If count would'nt be negated one had to use reverse=true + # But then the second sorting, by title would be reversed also + result = sorted(result, key = lambda i: (-1*float(i[mycount]), i['title'])) # itemgetter, should be faster (hm, but does'nt work: ValueError: could not convert string to float: pcount) # importing "operator" for implementing itemgetter #from operator import itemgetter @@ -876,26 +930,13 @@ def getFanart(channel): fanart = icon return fanart -def limitselection(data): - xbmc.log(msg="limit by videoselection", level=xbmc.DEBUG) - result = [] - for entry in data: - if videoselection == "0": - if "true" in entry['official']: - result.append(entry) - elif videoselection == "1": - if "false" in entry['official']: - result.append(entry) - elif videoselection == "2": - result.append(entry) - return result def addDir(name, url, mode, iconimage, total=0): u = sys.argv[0] + "?url=" + urllib.quote_plus(url.encode('utf-8')) + "&mode=" + str(mode) # xbmc.log(msg=u, level=xbmc.LOGNOTICE) ok = True # if (xbmcversion < 17): - liz = xbmcgui.ListItem(name, thumbnailImage=iconimage) + liz = xbmcgui.ListItem(name, iconImage=icon, thumbnailImage=iconimage) # else: # With offscreen=true large lists (=folder) load much faster (needs >= krypton) # But at the end, the differences are minimal in VIDFLTR, so just drop it :-) @@ -911,12 +952,7 @@ def addDir(name, url, mode, iconimage, total=0): if iconimage: liz.setProperty("fanart_image", iconimage) else: - liz.setProperty("fanart_image", fanart) - - if iconimage: - liz.setArt({ 'fanart' : iconimage }) - else: - liz.setArt({ 'fanart' : fanart }) + liz.setProperty("fanart_image", defaultFanart) ok = xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=u, listitem=liz, totalItems=total, isFolder=True) return ok @@ -954,7 +990,7 @@ def addVideo(entry, mycount="playcount"): if playLocalFile == "true": description = "Provider: " + entry['provider'] + "\nprovider playcount: " + entry['pcount'] + "\nlikes: " + entry['likes'] + "\ndislikes: " + entry['dislikes'] + "\ncomments: " + entry['comments'] else: - description = "Provider: " + entry['provider'] + "" + description = "" if "false" in entry['official'].lower(): description = ( "Unofficial Video by " + director + "\n" + description) diff --git a/icon.png b/icon.png index 7023a48..b088ad4 100644 Binary files a/icon.png and b/icon.png differ diff --git a/resources/img/kodi/banner.jpg b/resources/img/kodi/banner.jpg deleted file mode 100644 index 1f03c92..0000000 Binary files a/resources/img/kodi/banner.jpg and /dev/null differ diff --git a/resources/img/kodi/clearlogo.png b/resources/img/kodi/clearlogo.png deleted file mode 100644 index 01a2a8c..0000000 Binary files a/resources/img/kodi/clearlogo.png and /dev/null differ diff --git a/resources/img/kodi/fanart.jpg b/resources/img/kodi/fanart.jpg deleted file mode 100644 index 7989df6..0000000 Binary files a/resources/img/kodi/fanart.jpg and /dev/null differ diff --git a/resources/img/kodi/icon.png b/resources/img/kodi/icon.png deleted file mode 100644 index 7023a48..0000000 Binary files a/resources/img/kodi/icon.png and /dev/null differ diff --git a/resources/img/kodi/poster.jpg b/resources/img/kodi/poster.jpg deleted file mode 100644 index b688634..0000000 Binary files a/resources/img/kodi/poster.jpg and /dev/null differ diff --git a/resources/language/resource.language.de_de/strings.po b/resources/language/resource.language.de_de/strings.po index cace538..dfb9452 100644 --- a/resources/language/resource.language.de_de/strings.po +++ b/resources/language/resource.language.de_de/strings.po @@ -81,8 +81,8 @@ msgid "Hits, grouped by style" msgstr "Hits, gruppiert nach Musikstil" msgctxt "#30022" -msgid "Genre" -msgstr "Genre" +msgid "Style (not genre)" +msgstr "Stil (nicht Genre)" msgctxt "#30025" msgid "Artists" diff --git a/resources/language/resource.language.en_gb/strings.po b/resources/language/resource.language.en_gb/strings.po index a3e8630..c70c94c 100644 --- a/resources/language/resource.language.en_gb/strings.po +++ b/resources/language/resource.language.en_gb/strings.po @@ -81,7 +81,7 @@ msgid "Hits, grouped by style" msgstr "" msgctxt "#30022" -msgid "Genre" +msgid "Style (not genre)" msgstr "" msgctxt "#30025"