diff --git a/addon.xml b/addon.xml index 1ddc277..e14c756 100644 --- a/addon.xml +++ b/addon.xml @@ -1,5 +1,5 @@ - + @@ -23,7 +23,22 @@ https://vidfltr.slashproc.org/ https://kodi.slashproc.org/repo/plugin.video.vidfltr/ - 0.9.5 + + 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 - 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 ef790a4..2c41269 100644 --- a/changelog.txt +++ b/changelog.txt @@ -1,3 +1,11 @@ +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 c0be3f6..1e159d1 100644 --- a/default.py +++ b/default.py @@ -18,11 +18,12 @@ 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/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') +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') 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") @@ -32,8 +33,14 @@ maxFileAge = maxFileAge * 60 mediatype = addon.getSetting("mediatype") # show only official, fanmade or all videos? videoselection = str(addon.getSetting("videoselection")).lower() -# despite this selection show all in similar playlists and more from? -relatedselection = str(addon.getSetting("relatedselection")).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" playLocalFile = str(addon.getSetting("playLocalFile")).lower() filesinlists = int(addon.getSetting("filesinlists")) useYTDL = addon.getSetting("useytdl") @@ -248,9 +255,17 @@ def play(url): ytdl = YDStreamExtractor.getVideoInfo(idVideo) playback_url = ytdl.streamURL() else: - # without youtube_dl - xbmc.log(msg="without ytdl", level=xbmc.LOGDEBUG) - playback_url = entry['url'] + 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'] item = xbmcgui.ListItem(path=playback_url) @@ -265,6 +280,7 @@ 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) @@ -502,12 +518,14 @@ def sortArtists(channel=""): for artist in channels: if artist in [unidecode(name.upper()) for name in entry['artists']]: if entry not in result: - if videoselection == "0": - if "true" in entry['official'].lower(): - result.append(entry) - elif videoselection == "1": - if "false" in entry['official'].lower(): - result.append(entry) + # 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) else: result.append(entry) # show artist @@ -539,21 +557,17 @@ 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) + # limit to hits if hit != "" and hit == "true": for entry in data: if entry['hit'] == "true": - 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) + result.append(entry) data = result result = [] @@ -562,14 +576,7 @@ def sortTitlesBy(limit, sort, start): for entry in data: # played often at provider if int(entry['pcount']) >= pcounthigh: - 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) + result.append(entry) data = result result = [] @@ -577,14 +584,7 @@ def sortTitlesBy(limit, sort, start): if mycount != "" and mycount == "acount" and sort != "count": for entry in data: if int(entry['acount']) >= acounthigh: - 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) + result.append(entry) data = result result = [] @@ -592,14 +592,7 @@ def sortTitlesBy(limit, sort, start): if mycount != "" and mycount == "comments" and sort != "count": for entry in data: if int(entry['comments']) >= ccounthigh: - 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) + result.append(entry) data = result result = [] @@ -607,15 +600,7 @@ def sortTitlesBy(limit, sort, start): if mycount != "" and mycount == "likes" and sort != "count": for entry in data: if int(entry['likes']) >= likecounthigh: - 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) + result.append(entry) data = result result = [] @@ -623,14 +608,7 @@ def sortTitlesBy(limit, sort, start): if mycount != "" and mycount == "dislikes" and sort != "count": for entry in data: if int(entry['dislikes']) >= dislikecounthigh: - 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) + result.append(entry) data = result result = [] @@ -638,14 +616,7 @@ def sortTitlesBy(limit, sort, start): if mycount != "" and mycount == "controversial": for entry in data: if int(entry['controversial']) == int(1): - 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) + result.append(entry) data = result result = [] @@ -653,14 +624,7 @@ def sortTitlesBy(limit, sort, start): if channel != "" and channel != "all" and channel != "year" and channel != "related": for entry in data: if entry['style'] == channel: - 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) + result.append(entry) # or limit to last year # hm, either style or year, not both? elif channel != "" and channel == "year": @@ -674,14 +638,7 @@ 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: - 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) + result.append(entry) # related tracks (generated with musly) elif channel != "" and channel == "related": start = str(start) @@ -692,7 +649,6 @@ 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: @@ -701,15 +657,7 @@ 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): - 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) + 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)} @@ -722,6 +670,9 @@ 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 @@ -738,29 +689,17 @@ 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: - 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) + result.append(entry) + xbmc.log(msg=str(results), level=xbmc.LOGNOTICE) + if relatedselection != "true": + result = limitselection(result) start = 0 - # unfiltered sorted lists (by date and by numbers. But NOT controversial, which is a fixed list) + # sorted lists (by date and by numbers. But NOT controversial, which is a fixed list) else: 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) - + result.append(entry) + if sort != "" and sort == "random": random.shuffle(result) result = result[:filesinlists] @@ -777,10 +716,17 @@ def sortTitlesBy(limit, sort, start): modus = channel else: modus = 'all' - # 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'])) + + 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'])) # 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 @@ -930,13 +876,26 @@ 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, iconImage=icon, thumbnailImage=iconimage) + liz = xbmcgui.ListItem(name, 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 :-) @@ -952,7 +911,12 @@ def addDir(name, url, mode, iconimage, total=0): if iconimage: liz.setProperty("fanart_image", iconimage) else: - liz.setProperty("fanart_image", defaultFanart) + liz.setProperty("fanart_image", fanart) + + if iconimage: + liz.setArt({ 'fanart' : iconimage }) + else: + liz.setArt({ 'fanart' : fanart }) ok = xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=u, listitem=liz, totalItems=total, isFolder=True) return ok @@ -990,7 +954,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 = "" + description = "Provider: " + entry['provider'] + "" if "false" in entry['official'].lower(): description = ( "Unofficial Video by " + director + "\n" + description) diff --git a/icon.png b/icon.png index b088ad4..7023a48 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 new file mode 100644 index 0000000..1f03c92 Binary files /dev/null and b/resources/img/kodi/banner.jpg differ diff --git a/resources/img/kodi/clearlogo.png b/resources/img/kodi/clearlogo.png new file mode 100644 index 0000000..01a2a8c Binary files /dev/null and b/resources/img/kodi/clearlogo.png differ diff --git a/resources/img/kodi/fanart.jpg b/resources/img/kodi/fanart.jpg new file mode 100644 index 0000000..7989df6 Binary files /dev/null and b/resources/img/kodi/fanart.jpg differ diff --git a/resources/img/kodi/icon.png b/resources/img/kodi/icon.png new file mode 100644 index 0000000..7023a48 Binary files /dev/null and b/resources/img/kodi/icon.png differ diff --git a/resources/img/kodi/poster.jpg b/resources/img/kodi/poster.jpg new file mode 100644 index 0000000..b688634 Binary files /dev/null and b/resources/img/kodi/poster.jpg differ diff --git a/resources/language/resource.language.de_de/strings.po b/resources/language/resource.language.de_de/strings.po index dfb9452..cace538 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 "Style (not genre)" -msgstr "Stil (nicht Genre)" +msgid "Genre" +msgstr "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 c70c94c..a3e8630 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 "Style (not genre)" +msgid "Genre" msgstr "" msgctxt "#30025"