The branch, dharma has been updated
via 59f330f8eaf9eccad4177a9d2f59af5446fde141 (commit)
from f2f26afe8896d1e474f028a599a4d5c2cbe20315 (commit)
- Log -----------------------------------------------------------------
http://xbmc.git.sourceforge.net/git/gitweb.cgi?p=xbmc/plugins;a=commit;h=59f330f8eaf9eccad4177a9d2f59af5446fde141
commit 59f330f8eaf9eccad4177a9d2f59af5446fde141
Author: spiff <[email protected]>
Date: Wed Sep 21 23:18:41 2011 +0200
[plugin.video.musicvideojukebox] updated to version 2.0.1
diff --git a/plugin.video.musicvideojukebox/Default.py
b/plugin.video.musicvideojukebox/Default.py
index 872a41c..0b5dc55 100644
--- a/plugin.video.musicvideojukebox/Default.py
+++ b/plugin.video.musicvideojukebox/Default.py
@@ -9,13 +9,26 @@ import urllib,urllib2,re
import xbmc,xbmcplugin,xbmcgui,xbmcaddon #@UnresolvedImport
from xml.dom import minidom
from traceback import print_exc
+from urllib import unquote_plus
''' sys.setdefaultencoding('utf-8') '''
# plugin modes
MODE_SHOW_SEARCH = 10
-MODE_SHOWVIDEOS = 20
MODE_PLAYVIDEO = 30
-MODE_PLAYALL = 40
+MODE_SHOW_RECENT = 60
+MODE_SHOW_GENRELIST = 70
+
+MODE_SHOW_ARTISTLIST = 100
+MODE_SHOW_ARTISTMENU = 110
+MODE_SHOW_ALBUMS = 120
+MODE_SHOW_TRACKS = 130
+MODE_SHOW_GENREMENU = 140
+
+MODE_PLAY_TRACK = 200
+
+MODE_BUILD_ALBUMS_PLAYLIST = 300
+MODE_BUILD_TRACKS_PLAYLIST = 310
+MODE_BUILD_ARTISTS_PLAYLIST = 320
# parameter keys
PARAMETER_KEY_MODE = "mode"
@@ -29,19 +42,20 @@ handle = int(sys.argv[1])
__addonname__ = "plugin.video.musicvideojukebox"
__settings__ = xbmcaddon.Addon(id='plugin.video.musicvideojukebox')
__language__ = __settings__.getLocalizedString
+__lastfmapikey__ = "c8a19b7361e56044be8432c023c30888"
+__handle__ = int(sys.argv[1])
+
+import iZECore
+izecore = iZECore.iZECore()
+import LastFMCore
+lastfmcore = LastFMCore.LastFMCore()
-# utility functions
-def parameters_string_to_dict(parameters):
- ''' Convert parameters encoded in a URL to a dict. '''
- paramDict = {}
- if parameters:
- paramPairs = parameters[1:].split("&")
- for paramsPair in paramPairs:
- paramSplits = paramsPair.split('=')
- if (len(paramSplits)) == 2:
- paramDict[paramSplits[0]] = paramSplits[1]
- return paramDict
+import YoutubeCore
+youtubecore = YoutubeCore.YoutubeCore()
+
+import GoogleSuggestCore
+googlesuggestcore = GoogleSuggestCore.GoogleSuggestCore()
def addDirectoryItem(name, isFolder=True, parameters={},image="",
isVideo=True):
''' Add a list item to the XBMC UI.'''
@@ -55,168 +69,441 @@ def addDirectoryItem(name, isFolder=True,
parameters={},image="", isVideo=True):
url = sys.argv[0] + '?' + urllib.urlencode(parameters)
- xbmcplugin.setContent( handle=int( sys.argv[ 1 ] ), content="movies" )
- return xbmcplugin.addDirectoryItem(handle=int(sys.argv[1]), url=url,
listitem=li, isFolder=isFolder)
+ xbmcplugin.setContent( handle=__handle__, content="movies" )
+ return xbmcplugin.addDirectoryItem(handle=__handle__, url=url,
listitem=li, isFolder=isFolder)
# UI builder functions
def show_root_menu():
+
''' Show the plugin root menu. '''
addDirectoryItem(name=__language__(30201), isFolder=True,
parameters={PARAMETER_KEY_MODE: MODE_SHOW_SEARCH}, isVideo=False)
+ addDirectoryItem(name=__language__(30203), isFolder=True,
parameters={PARAMETER_KEY_MODE: MODE_SHOW_RECENT}, isVideo=False)
+ addDirectoryItem(name=__language__(30204), isFolder=True,
parameters={PARAMETER_KEY_MODE: MODE_SHOW_GENRELIST}, isVideo=False)
+ addDirectoryItem(name=__language__(30202), isFolder=True,
parameters={PARAMETER_KEY_MODE: MODE_SHOW_ARTISTLIST, 'type' :
'chart_topartists'}, isVideo=False)
+ addDirectoryItem(name=__language__(30205), isFolder=True,
parameters={PARAMETER_KEY_MODE: MODE_SHOW_TRACKS, "type" : "chart_toptracks"},
isVideo=False)
+ addDirectoryItem(name=__language__(30206), isFolder=True,
parameters={PARAMETER_KEY_MODE: MODE_SHOW_ARTISTLIST, "type" :
"chart_hypedartists"}, isVideo=False)
+ addDirectoryItem(name=__language__(30207), isFolder=True,
parameters={PARAMETER_KEY_MODE: MODE_SHOW_TRACKS, "type" :
"chart_hypedtracks"}, isVideo=False)
+ addDirectoryItem(name=__language__(30208), isFolder=True,
parameters={PARAMETER_KEY_MODE: MODE_SHOW_TRACKS, "type" :
"chart_lovedtracks"}, isVideo=False)
- ''' show stored searchqueries '''
- searchqueries = getSearchQueries()
-
- for index, query in enumerate(searchqueries):
- addDirectoryItem(name=query, isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_PLAYALL, "artist":query}, isVideo=False)
xbmcplugin.endOfDirectory(handle=handle, succeeded=True)
+ return True
+
+
+def show_artist_list_menu(params):
+ viewmode = izecore.getCurrentViewmode()
+
+ if (params.get('type')=="chart_topartists"):
+ artists = lastfmcore.Chart_getTopArtists()
+ elif (params.get('type')=="tag_topartists"):
+ artists = lastfmcore.Tag_getTopArtists(params.get('genre'))
+ elif (params.get('type')=="artist_similarartists"):
+ artists = lastfmcore.Artist_getSimilar(params.get('artist'))
+ elif (params.get('type')=="chart_hypedartists"):
+ artists = lastfmcore.Chart_getHypedArtists()
+
+ if (artists.length>0):
+ params[PARAMETER_KEY_MODE] = MODE_BUILD_ARTISTS_PLAYLIST
+ addDirectoryItem(name=__language__(30501), isFolder=False,
parameters=params, isVideo=False)
+
+ i = 0
+ for artist in artists:
+ i=i+1
+ name =
artist.getElementsByTagName("name")[0].childNodes.item(0).data
+ image = ""
+ if (artist.getElementsByTagName("image").length>0):
+ image =
artist.getElementsByTagName("image")[artist.getElementsByTagName("image").length-1].childNodes.item(0).data
+
+ addDirectoryItem(name="%d. %s" % (i, name.encode("utf-8")),
isFolder=True, parameters={PARAMETER_KEY_MODE:MODE_SHOW_ARTISTMENU,
"artist":name.encode("utf-8")}, image=image, isVideo=False)
+ else:
+ addDirectoryItem(name=__language__(30402), isFolder=False,
parameters={}, isVideo=False)
+
+ xbmcplugin.endOfDirectory(handle=handle, succeeded=True)
+ xbmc.executebuiltin("Container.SetViewMode(%i)" % viewmode)
-def show_search():
- viewmode = getCurrentViewmode()
- q = getKeyboardInput(title=__language__(30201), default="")
+ return True
+
+def build_artists_playlist(params):
+ if (params.get('type')=="chart_topartists"):
+ artists = lastfmcore.Chart_getTopArtists()
+ elif (params.get('type')=="tag_topartists"):
+ artists = lastfmcore.Tag_getTopArtists(params.get('genre'))
+ elif (params.get('type')=="artist_similarartists"):
+ artists = lastfmcore.Artist_getSimilar(params.get('artist'))
+ elif (params.get('type')=="chart_hypedartists"):
+ artists = lastfmcore.Chart_getHypedArtists()
+
+ playlistStarted = False
- artistname = getArtistName(q)
+ player = xbmc.Player()
+ if player.isPlaying():
+ player.stop()
- artistxml = getArtistMatches(artistname)
+ playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
+ playlist.clear()
- if artistxml.length>0:
- ''' build menu '''
- for artist in artistxml:
+ if (artists.length>0):
+ for artist in artists:
name =
artist.getElementsByTagName("name")[0].childNodes.item(0).data
- addDirectoryItem(name=name.encode("utf-8"), isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_PLAYALL, "artist":name.encode("utf-8")},
isVideo=False)
- xbmcplugin.endOfDirectory(handle=handle, succeeded=True)
- xbmc.executebuiltin("Container.SetViewMode(%i)" % viewmode)
+ tracks = lastfmcore.Artist_getTopTracks(name.encode("utf-8"), 3)
+ for track in tracks:
+ trackartist =
track.getElementsByTagName("artist")[0].getElementsByTagName("name")[0].childNodes.item(0).data
+ trackname =
track.getElementsByTagName("name")[0].childNodes.item(0).data
+
+ image = ""
+ if (track.getElementsByTagName("image").length>0):
+ image =
track.getElementsByTagName("image")[track.getElementsByTagName("image").length-1].childNodes.item(0).data
+
+ parameters={PARAMETER_KEY_MODE:MODE_PLAY_TRACK, "artist" :
trackartist.encode("utf-8"), "track" : trackname.encode("utf-8"), "thumbnail" :
image.encode("utf-8"), "title" : "%s - %s" % (trackartist.encode("utf-8"),
trackname.encode("utf-8")), "plot": ""}
+ listitem=xbmcgui.ListItem(label="%s - %s" % (trackartist,
trackname), iconImage=image, thumbnailImage=image)
+ listitem.setProperty('IsPlayable', 'true')
+ listitem.setProperty( "Video", "true" )
+ listitem.setInfo(type='Video', infoLabels=parameters)
+
+ url = sys.argv[0] + '?' + urllib.urlencode(parameters)
+ playlist.add(url=url, listitem=listitem)
+
+ if not playlistStarted:
+ xbmc.executebuiltin('XBMC.Action(Playlist)')
+ ''' play playlist'''
+ playlistStarted = True
+ xbmc.executebuiltin('playlist.playoffset(video,0)' )
+
else:
- ''' do exact search '''
- xbmc.executebuiltin('XBMC.RunPlugin(%s?%s)' % (sys.argv[0],
urllib.urlencode( { "mode" : MODE_PLAYALL, "artist" : artistname} ) ) )
+ izecore.showMessage(__language__(30401), __language__(30402))
-
-def show_videos(params):
- ''' search on youtube for music videos of the current artist '''
- url =
"http://gdata.youtube.com/feeds/api/videos?max-results=50&v=2&category=Music&format=5&"
+ urllib.urlencode({ "q" : params.get('artist') })
+def show_artist_menu(params):
+ viewmode = izecore.getCurrentViewmode()
+
+ artist = params.get('artist')
+ addDirectoryItem(name="%s - %s" % (__language__(30502), artist),
isFolder=False, parameters={PARAMETER_KEY_MODE: MODE_BUILD_ALBUMS_PLAYLIST,
"type" : "artist_topalbums", "artist":artist}, isVideo=False)
+ addDirectoryItem(name="%s - %s" % (__language__(30503), artist),
isFolder=True, parameters={PARAMETER_KEY_MODE: MODE_SHOW_ALBUMS,
"artist":artist, "type" : "artist_topalbums"}, isVideo=False)
+ addDirectoryItem(name="%s - %s" % (__language__(30504), artist),
isFolder=True, parameters={PARAMETER_KEY_MODE: MODE_SHOW_TRACKS,
"artist":artist, "type" : "artist_toptracks"}, isVideo=False)
+ addDirectoryItem(name="%s - %s" % (__language__(30505), artist),
isFolder=True, parameters={PARAMETER_KEY_MODE: MODE_SHOW_ARTISTLIST,
"artist":artist, "type" : "artist_similarartists"}, isVideo=False)
+
+ xbmcplugin.endOfDirectory(handle=handle, succeeded=True)
+ xbmc.executebuiltin("Container.SetViewMode(%i)" % viewmode)
+
+ return True
- xmldoc = getXmlResponse(url)
+def show_album_menu(params):
+ viewmode = izecore.getCurrentViewmode()
- entries = xmldoc.getElementsByTagName("entry")
+ if (params.get('type')=="artist_topalbums"):
+ albums = lastfmcore.Artist_getTopAlbums(params.get('artist'))
+ if (params.get('type')=="tag_topalbums"):
+ albums = lastfmcore.Tag_getTopAlbums(params.get('genre'))
- for entry in entries:
- title = entry.getElementsByTagName("title")[0].childNodes.item(0).data
- thumbnail =
entry.getElementsByTagNameNS("http://search.yahoo.com/mrss/",
"thumbnail")[0].getAttribute('url')
- videoId =
entry.getElementsByTagNameNS("http://gdata.youtube.com/schemas/2007",
"videoid")[0].childNodes.item(0).data
+ if (albums.length>0):
+ params[PARAMETER_KEY_MODE] = MODE_BUILD_ALBUMS_PLAYLIST
+ addDirectoryItem(name=__language__(30506), isFolder=False,
parameters=params, isVideo=False)
- addDirectoryItem(name=title.encode("utf-8"), isFolder=False,
parameters={PARAMETER_KEY_MODE:MODE_PLAYVIDEO, "title":title.encode("utf-8"),
"videoId":videoId.encode("utf-8"), "thumbnail":thumbnail.encode("utf-8")},
image=thumbnail.encode("utf-8"), isVideo=True)
+ i = 0
+ for album in albums:
+ i = i + 1
+ name =
album.getElementsByTagName("name")[0].childNodes.item(0).data
+ artist =
album.getElementsByTagName("artist")[0].getElementsByTagName("name")[0].childNodes.item(0).data
+ image = ""
+ if (album.getElementsByTagName("image").length>0):
+ image =
album.getElementsByTagName("image")[album.getElementsByTagName("image").length-1].childNodes.item(0).data
+ addDirectoryItem(name="%d. %s - %s" % (i, artist.encode("utf-8"),
name.encode("utf-8")), isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_TRACKS, "type" : "album_getinfo",
"artist":artist.encode("utf-8"), "album": name.encode("utf-8")}, image=image,
isVideo=False)
+ else:
+ addDirectoryItem(name=__language__(30403), isFolder=False,
parameters={}, isVideo=False)
- xbmcplugin.endOfDirectory(handle=handle, succeeded=True)
+ xbmcplugin.endOfDirectory(handle=handle, succeeded=True)
+ xbmc.executebuiltin("Container.SetViewMode(%i)" % viewmode)
+ return True
-def playVideo(params):
- ''' get video url based on guid '''
+def build_albums_playlist(params):
+ if (params.get('type')=="artist_topalbums"):
+ albums = lastfmcore.Artist_getTopAlbums(params.get('artist'))
+ if (params.get('type')=="tag_topalbums"):
+ albums = lastfmcore.Tag_getTopAlbums(params.get('genre'))
- videoId = params.get("videoId")
-
- ''' call the youtube player '''
- url =
"plugin://plugin.video.youtube?path=/root&action=play_video&videoid=%s" %
params.get( "videoId")
-
- listitem=xbmcgui.ListItem(label=params.get('title'),
iconImage=params.get('thumbnail'), thumbnailImage=params.get('thumbnail'),
path=url)
- xbmcplugin.setResolvedUrl(handle=int(sys.argv[1]), succeeded=True,
listitem=listitem)
-
-def playAll(params):
- showMessage(__language__(30302), __language__(30301))
+ playlistStarted = False
- ''' store current search query '''
- artistname = urllib.unquote_plus(params.get("artist"))
- storeSearchQuery( artistname )
-
player = xbmc.Player()
if player.isPlaying():
player.stop()
playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
- playlist.clear()
+ playlist.clear()
+
+ ''' get 3 tracks from every album '''
+ if (albums.length>0):
+
+ for album in albums:
+ if (album.getElementsByTagName("mbid")[0].childNodes.length>0):
+ mbid =
album.getElementsByTagName("mbid")[0].childNodes.item(0).data
+ tracks = lastfmcore.Album_getInfoByMBID(mbid)
+ else:
+ name =
album.getElementsByTagName("name")[0].childNodes.item(0).data
+ artist =
album.getElementsByTagName("artist")[0].getElementsByTagName("name")[0].childNodes.item(0).data
+ tracks =
lastfmcore.Album_getInfo(artist.encode("utf-8"),name.encode("utf-8"))
+
+ i = 0
+ for track in tracks:
+ i = i + 1
+ trackartist =
track.getElementsByTagName("artist")[0].getElementsByTagName("name")[0].childNodes.item(0).data
+ trackname =
track.getElementsByTagName("name")[0].childNodes.item(0).data
+
+ image = ""
+ if (track.getElementsByTagName("image").length>0):
+ image =
track.getElementsByTagName("image")[track.getElementsByTagName("image").length-1].childNodes.item(0).data
+
+ parameters={PARAMETER_KEY_MODE:MODE_PLAY_TRACK, "artist" :
trackartist.encode("utf-8"), "track" : trackname.encode("utf-8"), "thumbnail" :
image.encode("utf-8"), "title" : "%s - %s" % (trackartist.encode("utf-8"),
trackname.encode("utf-8")), "plot": ""}
+ listitem=xbmcgui.ListItem(label="%s - %s" % (trackartist,
trackname), iconImage=image, thumbnailImage=image)
+ listitem.setProperty('IsPlayable', 'true')
+ listitem.setProperty( "Video", "true" )
+ listitem.setInfo(type='Video', infoLabels=parameters)
+
+ url = sys.argv[0] + '?' + urllib.urlencode(parameters)
+ playlist.add(url=url, listitem=listitem)
+
+ if not playlistStarted:
+ xbmc.executebuiltin('XBMC.Action(Playlist)')
+ ''' play playlist'''
+ playlistStarted = True
+ xbmc.executebuiltin('playlist.playoffset(video,0)' )
+
+
+
+
+
+ else:
+ izecore.showMessage(__language__(30401), __language__(30403))
- totalresults = addEntriesToPlaylist( playlist=playlist, q=artistname,
startindex=1)
- if totalresults>50:
- totalresults = addEntriesToPlaylist( playlist=playlist, q=artistname,
startindex=51)
- if totalresults>100:
- totalresults = addEntriesToPlaylist( playlist=playlist, q=artistname,
startindex=101)
- elif totalresults<=0:
- showMessage(__language__(30305), __language__(30306) % artistname)
- shuffle = parseBoolString(__settings__.getSetting("shuffle"))
- if shuffle:
- playlist.shuffle()
- ''' play playlist'''
- xbmc.executebuiltin('playlist.playoffset(video,0)' )
-
-def addEntriesToPlaylist( playlist, q, startindex=1):
- url =
"http://gdata.youtube.com/feeds/api/videos?max-results=50&v=2&category=Music&format=5&start-index=%i&%s"
% ( startindex, urllib.urlencode({ "q" : q }) )
-
- xmldoc = getXmlResponse(url)
-
- entries = xmldoc.getElementsByTagName("entry")
-
- for entry in entries:
- title = entry.getElementsByTagName("title")[0].childNodes.item(0).data
- thumbnail =
entry.getElementsByTagNameNS("http://search.yahoo.com/mrss/",
"thumbnail")[0].getAttribute('url')
- videoId =
entry.getElementsByTagNameNS("http://gdata.youtube.com/schemas/2007",
"videoid")[0].childNodes.item(0).data
-
- description = ""
- if entry.getElementsByTagNameNS("http://search.yahoo.com/mrss/",
"description")[0].childNodes.length>0:
- description =
entry.getElementsByTagNameNS("http://search.yahoo.com/mrss/",
"description")[0].childNodes.item(0).data
-
- author = ""
- if
entry.getElementsByTagName("author")[0].getElementsByTagName("name")[0].childNodes.length>0:
- author =
entry.getElementsByTagName("author")[0].getElementsByTagName("name")[0].childNodes.item(0).data
-
- parameters = {PARAMETER_KEY_MODE:MODE_PLAYVIDEO,
"videoId":videoId.encode("utf-8"), "title": title.encode("utf-8"), "author":
author.encode("utf-8"), "plot":description.encode("utf-8"),"thumbnail":
thumbnail.encode("utf-8") }
+def show_tracks_menu(params):
+ viewmode = izecore.getCurrentViewmode()
+
+ if (params.get("type")=="album_getinfo"):
+ tracks = lastfmcore.Album_getInfo(params.get('artist'),
params.get('album'))
+ elif (params.get("type")=="artist_toptracks"):
+ tracks = lastfmcore.Artist_getTopTracks(params.get('artist'))
+ elif (params.get("type")=="chart_toptracks"):
+ tracks = lastfmcore.Chart_getTopTracks()
+ elif (params.get("type")=="tag_toptracks"):
+ tracks = lastfmcore.Tag_getTopTracks(params.get('genre'))
+ elif (params.get("type")=="chart_hypedtracks"):
+ tracks = lastfmcore.Chart_getHypedTracks()
+ elif (params.get("type")=="chart_lovedtracks"):
+ tracks = lastfmcore.Chart_getLovedTracks()
- listitem=xbmcgui.ListItem(label=title, iconImage=thumbnail,
thumbnailImage=thumbnail)
- listitem.setProperty('IsPlayable', 'true')
- listitem.setProperty( "Video", "true" )
- listitem.setInfo(type='Video', infoLabels=parameters)
-
- url = sys.argv[0] + '?' + urllib.urlencode(parameters)
- playlist.add(url=url, listitem=listitem)
+ if (tracks.length>0):
+ params[PARAMETER_KEY_MODE] = MODE_BUILD_TRACKS_PLAYLIST
+ addDirectoryItem(name=__language__(30507), isFolder=False,
parameters=params, isVideo=False)
+
+ i = 0
+ for track in tracks:
+ i = i + 1
+ name =
track.getElementsByTagName("name")[0].childNodes.item(0).data
+ artist =
track.getElementsByTagName("artist")[0].getElementsByTagName("name")[0].childNodes.item(0).data
+ image = ""
+ if (track.getElementsByTagName("image").length>0):
+ image =
track.getElementsByTagName("image")[track.getElementsByTagName("image").length-1].childNodes.item(0).data
+
- return
int(xmldoc.getElementsByTagNameNS("http://a9.com/-/spec/opensearch/1.1/",
"totalResults")[0].childNodes.item(0).data)
+ addDirectoryItem(name="%d. %s - %s" % (i, artist.encode("utf-8"),
name.encode("utf-8")), isFolder=False,
parameters={PARAMETER_KEY_MODE:MODE_PLAY_TRACK, "artist" :
artist.encode("utf-8"), "track" : name.encode("utf-8"), "thumbnail" :
image.encode("utf-8")},image=image, isVideo=True)
+
+
+ else:
+ addDirectoryItem(name=__language__(30404), isFolder=False,
parameters={}, isVideo=False)
+ xbmcplugin.endOfDirectory(handle=handle, succeeded=True)
+ xbmc.executebuiltin("Container.SetViewMode(%i)" % viewmode)
+
+ return True
-def getArtistName(q):
- ''' search on Google Suggest to get most likely artist name '''
- showMessage(__language__(30303), __language__(30301))
+def build_tracks_playlist(params):
+ if (params.get("type")=="album_getinfo"):
+ tracks = lastfmcore.Album_getInfo(params.get('artist'),
params.get('album'))
+ elif (params.get("type")=="artist_toptracks"):
+ tracks = lastfmcore.Artist_getTopTracks(params.get('artist'))
+ elif (params.get("type")=="chart_toptracks"):
+ tracks = lastfmcore.Chart_getTopTracks()
+ elif (params.get("type")=="tag_toptracks"):
+ tracks = lastfmcore.Tag_getTopTracks(params.get('genre'))
+ elif (params.get("type")=="chart_hypedtracks"):
+ tracks = lastfmcore.Chart_getHypedTracks()
+ elif (params.get("type")=="chart_lovedtracks"):
+ tracks = lastfmcore.Chart_getLovedTracks()
+
+
+ playlistStarted = False
- url =
"http://suggestqueries.google.com/complete/search?hl=en&ds=yt&output=toolbar&"
+ urllib.urlencode({ "q" : q })
+ player = xbmc.Player()
+ if player.isPlaying():
+ player.stop()
- xmldoc = getXmlResponse(url)
+ playlist = xbmc.PlayList(xbmc.PLAYLIST_VIDEO)
+ playlist.clear()
- ''' get the first item '''
- suggestions = xmldoc.getElementsByTagName("CompleteSuggestion")
- if suggestions.length>0:
- firstitem = suggestions[0]
- artist =
firstitem.getElementsByTagName("suggestion")[0].getAttribute('data')
+ if (tracks.length>0):
+ i = 0
+ for track in tracks:
+ i = i + 1
+ name =
track.getElementsByTagName("name")[0].childNodes.item(0).data
+ artist =
track.getElementsByTagName("artist")[0].getElementsByTagName("name")[0].childNodes.item(0).data
+ image = ""
+ if (track.getElementsByTagName("image").length>0):
+ image =
track.getElementsByTagName("image")[track.getElementsByTagName("image").length-1].childNodes.item(0).data
+
+ parameters={PARAMETER_KEY_MODE:MODE_PLAY_TRACK, "artist" :
artist.encode("utf-8"), "track" : name.encode("utf-8"), "thumbnail" :
image.encode("utf-8"), "title" : "%s - %s" % (artist.encode("utf-8"),
name.encode("utf-8")), "plot": "" }
+ listitem=xbmcgui.ListItem(label="%s - %s" % (artist, name),
iconImage=image, thumbnailImage=image)
+ listitem.setProperty('IsPlayable', 'true')
+ listitem.setProperty( "Video", "true" )
+ listitem.setInfo(type='Video', infoLabels=parameters)
+
+ url = sys.argv[0] + '?' + urllib.urlencode(parameters)
+ playlist.add(url=url, listitem=listitem)
+
+ if not playlistStarted:
+ xbmc.executebuiltin('XBMC.Action(Playlist)')
+ ''' play playlist'''
+ playlistStarted = True
+ xbmc.executebuiltin('playlist.playoffset(video,0)' )
+
else:
- artist = q
+ izecore.showMessage(__language__(30401), __language__(30404))
+
+
+def show_genre_menu(params):
+ viewmode = izecore.getCurrentViewmode()
+
+ genre = params.get('genre')
- return artist
+ addDirectoryItem(name=__language__(30508), isFolder=False,
parameters={PARAMETER_KEY_MODE: MODE_BUILD_ARTISTS_PLAYLIST, "type" :
"tag_topartists", "genre" : genre}, isVideo=False)
+ addDirectoryItem(name="%s - %s" % (__language__(30202), genre),
isFolder=True, parameters={PARAMETER_KEY_MODE: MODE_SHOW_ARTISTLIST, "type":
"tag_topartists", "genre" : genre}, isVideo=False)
+ addDirectoryItem(name="%s - %s" % (__language__(30503), genre),
isFolder=True, parameters={PARAMETER_KEY_MODE: MODE_SHOW_ALBUMS, "type":
"tag_topalbums", "genre" : genre}, isVideo=False)
+ addDirectoryItem(name="%s - %s" % (__language__(30504), genre),
isFolder=True, parameters={PARAMETER_KEY_MODE: MODE_SHOW_TRACKS, "type":
"tag_toptracks", "genre" : genre}, isVideo=False)
+
+ xbmcplugin.endOfDirectory(handle=handle, succeeded=True)
+ xbmc.executebuiltin("Container.SetViewMode(%i)" % viewmode)
-def getArtistMatches(artist):
- ''' search on last.fm for matching artist names '''
- showMessage(__language__(30304), __language__(30301))
+def show_recentlyplayed(params):
+ ''' show stored searchqueries '''
+ searchqueries = getSearchQueries()
+
+ for index, query in enumerate(searchqueries):
+ addDirectoryItem(name=query, isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_SEARCH, "artist":query}, isVideo=False)
+
+ xbmcplugin.endOfDirectory(handle=handle, succeeded=True)
+
- url =
"http://ws.audioscrobbler.com/2.0/?method=artist.search&api_key=c8a19b7361e56044be8432c023c30888&"
+ urllib.urlencode({ "artist" : artist })
+def show_search(params):
+ viewmode = izecore.getCurrentViewmode()
+ q = params.get("artist")
+ if (q==None):
+ q = izecore.getKeyboardInput(title=__language__(30201), default="")
- xmldoc = getXmlResponse(url)
+ artistname = googlesuggestcore.search(q)
+
+ storeSearchQuery(artistname.encode("utf-8"))
+
+ artistxml = lastfmcore.Artist_search(artistname)
+
+ if artistxml.length>0:
+ ''' build menu '''
+ for artist in artistxml:
+ name =
artist.getElementsByTagName("name")[0].childNodes.item(0).data
+ addDirectoryItem(name=name.encode("utf-8"), isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_ARTISTMENU,
"artist":name.encode("utf-8")}, isVideo=False)
+
+ xbmcplugin.endOfDirectory(handle=handle, succeeded=True)
+ xbmc.executebuiltin("Container.SetViewMode(%i)" % viewmode)
+ else:
+ ''' do exact search '''
+ '''xbmc.executebuiltin('XBMC.RunPlugin(%s?%s)' % (sys.argv[0],
urllib.urlencode( { "mode" : MODE_SHOW_ARTISTMENU, "artist" : q} ) ) )'''
- return xmldoc.getElementsByTagName('artist')
+ ''' try again '''
+ artistxml = lastfmcore.Artist_search(q)
+
+ if artistxml.length>0:
+ ''' build menu '''
+ for artist in artistxml:
+ name =
artist.getElementsByTagName("name")[0].childNodes.item(0).data
+ addDirectoryItem(name=name.encode("utf-8"), isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_ARTISTMENU,
"artist":name.encode("utf-8")}, isVideo=False)
+ else:
+ addDirectoryItem(name=__language__(30402), isFolder=False,
parameters={}, isVideo=False)
+
+ xbmcplugin.endOfDirectory(handle=handle, succeeded=True)
+ xbmc.executebuiltin("Container.SetViewMode(%i)" % viewmode)
+
+
+
+def show_genre(params):
+ viewmode = izecore.getCurrentViewmode()
+
+ ''' build a list of genres '''
+ addDirectoryItem(name="60s", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"60s"},
isVideo=False)
+ addDirectoryItem(name="70s", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"70s"},
isVideo=False)
+ addDirectoryItem(name="80s", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"80s"},
isVideo=False)
+ addDirectoryItem(name="90s", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"90s"},
isVideo=False)
+ addDirectoryItem(name="Acoustic", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"acoustic"},
isVideo=False)
+ addDirectoryItem(name="Ambient", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"ambient"},
isVideo=False)
+ addDirectoryItem(name="Blues", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"blues"},
isVideo=False)
+ addDirectoryItem(name="Classic Rock", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"classic rock"},
isVideo=False)
+ addDirectoryItem(name="Classical", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"classical"},
isVideo=False)
+ addDirectoryItem(name="Country", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"country"},
isVideo=False)
+ addDirectoryItem(name="Dance", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"dance"},
isVideo=False)
+ addDirectoryItem(name="Disco", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"disco"},
isVideo=False)
+ addDirectoryItem(name="Electronic", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"electronic"},
isVideo=False)
+ addDirectoryItem(name="Folk", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"folk"},
isVideo=False)
+ addDirectoryItem(name="Hardcore", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"hardcore"},
isVideo=False)
+ addDirectoryItem(name="Hardstyle", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"hardstyle"},
isVideo=False)
+ addDirectoryItem(name="Hip hop", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"hip hop"},
isVideo=False)
+ addDirectoryItem(name="Indie", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"indie"},
isVideo=False)
+ addDirectoryItem(name="Jazz", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"jazz"},
isVideo=False)
+ addDirectoryItem(name="Latin", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"latin"},
isVideo=False)
+ addDirectoryItem(name="Metal", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"metal"},
isVideo=False)
+ addDirectoryItem(name="Pop", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"pop"},
isVideo=False)
+ addDirectoryItem(name="Pop punk", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"pop punk"},
isVideo=False)
+ addDirectoryItem(name="Punk", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"punk"},
isVideo=False)
+ addDirectoryItem(name="Reggae", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"reggae"},
isVideo=False)
+ addDirectoryItem(name="R&B", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"rnb"},
isVideo=False)
+ addDirectoryItem(name="Rock", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"rock"},
isVideo=False)
+ addDirectoryItem(name="Soul", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"soul"},
isVideo=False)
+ addDirectoryItem(name="Trance", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"trance"},
isVideo=False)
+ addDirectoryItem(name="World", isFolder=True,
parameters={PARAMETER_KEY_MODE:MODE_SHOW_GENREMENU, "genre":"world"},
isVideo=False)
+ xbmcplugin.endOfDirectory(handle=handle, succeeded=True)
+ xbmc.executebuiltin("Container.SetViewMode(%i)" % viewmode)
+def play_track(params):
+ ''' find the track on youtube'''
+ videos = youtubecore.getVideosByTrackName(params.get('artist'),
params.get('track'))
+
+ if (videos.length>0):
+ video = videos[0];
+
+ ''' get the videoid '''
+ videoId =
video.getElementsByTagNameNS("http://gdata.youtube.com/schemas/2007",
"videoid")[0].childNodes.item(0).data
+
+ '''play the video'''
+ params['videoId'] = videoId
+
+ playVideo(params)
+
+def playVideo(params):
+ ''' get video url based on guid '''
+
+ ''' call the youtube player '''
+ url =
"plugin://plugin.video.youtube?path=/root&action=play_video&videoid=%s" %
params.get( "videoId")
+
+ listitem=xbmcgui.ListItem(label=params.get("videoId"),
iconImage=params.get('thumbnail'), thumbnailImage=params.get('thumbnail'),
path=url)
+ xbmcplugin.setResolvedUrl(handle=__handle__, succeeded=True,
listitem=listitem)
+
+
+
+
def getSearchQueries():
try:
searchqueries = eval(__settings__.getSetting("searchqueries"))
@@ -236,7 +523,7 @@ def storeSearchQuery(query):
maxsearches = (10, 20, 40, 60, 80, 100)[
int(__settings__.getSetting("maxsearches")) ]
searchqueries = [query] + searchqueries[:maxsearches-1]
- searchqueries.sort(myComp)
+ '''searchqueries.sort(myComp)'''
__settings__.setSetting("searchqueries", repr(searchqueries))
return True
@@ -247,65 +534,11 @@ def myComp (a,b):
return -1
-def parseBoolString(theString):
- return theString[0].upper()=='T'
-
-# Log NOTICE
-def log_notice(msg):
- xbmc.output("### [%s] - %s" % (__addonname__,msg,),level=xbmc.LOGNOTICE )
-
-def showMessage(heading, message, duration=10):
- xbmc.executebuiltin('XBMC.Notification("%s", "%s", %s)' % ( heading,
message, duration) )
-
-def getCurrentViewmode():
- for id in range( CONTROL_MAIN_LIST_START, CONTROL_MAIN_LIST_END + 1 ):
- try:
- if xbmc.getCondVisibility( "Control.IsVisible(%i)" % id ):
- break
- except:
- print_exc()
- return id
-
-def getKeyboardInput(title = "Input", default="", hidden=False):
- result = None
-
- kbd = xbmc.Keyboard(default, title)
- kbd.setHiddenInput(hidden)
- kbd.doModal()
-
- if kbd.isConfirmed():
- result = kbd.getText()
-
- return result
-
-def getJsonResponse(url):
-
- response = urllib2.urlopen(url)
- responsetext = response.read()
- objs = xbmc.executeJSONRPC(responsetext)
- response.close()
-
- return objs
-def getXmlResponse(url):
- log_notice("getXmlResponse from " + url)
- response = urllib2.urlopen(url)
- encoding = re.findall("charset=([a-zA-Z0-9\-]+)",
response.headers['content-type'])
- responsetext = unicode( response.read(), encoding[0] );
- xmldoc = minidom.parseString(responsetext.encode("utf-8"))
- response.close()
- return xmldoc
-def getHttpResponse(url):
- log_notice("getHttpResponse from " + url)
- response = urllib2.urlopen(url)
- encoding = re.findall("charset=([a-zA-Z0-9\-]+)",
response.headers['content-type'])
- responsetext = unicode( response.read(), encoding[0] );
- response.close()
- return responsetext.encode("utf-8")
# parameter values
-params = parameters_string_to_dict(sys.argv[2])
+params = izecore.getParameters(sys.argv[2])
mode = int(params.get(PARAMETER_KEY_MODE, "0"))
# Depending on the mode, call the appropriate function to build the UI.
@@ -313,10 +546,29 @@ if not sys.argv[2]:
# new start
ok = show_root_menu()
elif mode == MODE_SHOW_SEARCH:
- ok = show_search()
-elif mode == MODE_SHOWVIDEOS:
- ok = show_videos(params)
+ ok = show_search(params)
elif mode == MODE_PLAYVIDEO:
ok = playVideo(params)
-elif mode == MODE_PLAYALL:
- ok = playAll(params)
\ No newline at end of file
+elif mode == MODE_SHOW_RECENT:
+ ok = show_recentlyplayed(params)
+elif mode == MODE_SHOW_GENRELIST:
+ ok = show_genre(params)
+elif mode == MODE_SHOW_ARTISTLIST:
+ ok = show_artist_list_menu(params)
+elif mode == MODE_SHOW_ARTISTMENU:
+ ok = show_artist_menu(params)
+elif mode == MODE_SHOW_ALBUMS:
+ ok = show_album_menu(params)
+elif mode == MODE_SHOW_TRACKS:
+ ok = show_tracks_menu(params)
+elif mode == MODE_SHOW_GENREMENU:
+ ok = show_genre_menu(params)
+elif mode == MODE_PLAY_TRACK:
+ ok = play_track(params)
+elif mode == MODE_BUILD_ALBUMS_PLAYLIST:
+ ok = build_albums_playlist(params)
+elif mode == MODE_BUILD_TRACKS_PLAYLIST:
+ ok = build_tracks_playlist(params)
+elif mode == MODE_BUILD_ARTISTS_PLAYLIST:
+ ok = build_artists_playlist(params)
+
\ No newline at end of file
diff --git a/plugin.video.musicvideojukebox/addon.xml
b/plugin.video.musicvideojukebox/addon.xml
index fc8128a..f774298 100644
--- a/plugin.video.musicvideojukebox/addon.xml
+++ b/plugin.video.musicvideojukebox/addon.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<addon id="plugin.video.musicvideojukebox"
name="Music Video Jukebox"
- version="1.1.0"
+ version="2.0.1"
provider-name="iZE">
<requires>
<import addon="xbmc.python" version="1.0"/>
diff --git a/plugin.video.musicvideojukebox/changelog.txt
b/plugin.video.musicvideojukebox/changelog.txt
index d336e83..0a91bd4 100644
--- a/plugin.video.musicvideojukebox/changelog.txt
+++ b/plugin.video.musicvideojukebox/changelog.txt
@@ -1,3 +1,25 @@
+Version 2.0.1
+-------------
+- Major update: added more LastFM functionality
+- Updated: Genre browser
+- Updated: Top artists
+- Added: Top tracks
+- Added: Hyped artists
+- Added: Hyped tracks
+- Added: Loved tracks
+- Added: Genre menu; show/play artists, albums and tracks
+- Added: Artist menu; show/play albums, tracks and similar artists
+- Added: Album menu; show/play tracks
+- Added: Tracks menu; show/play tracks
+- Localized strings
+- Cleaned up and sanitized code
+
+Version 1.2.0
+-------------
+- Added: Top 50 artists
+- Added: Genre browser; will play music videos from a specific music genre
+- Added: Recent searches
+
Version 1.1.0
-------------
- now uses the plugin.video.youtube plugin to play videos from youtube
diff --git
a/plugin.video.musicvideojukebox/resources/language/English/strings.xml
b/plugin.video.musicvideojukebox/resources/language/English/strings.xml
index 1f912df..becc450 100644
--- a/plugin.video.musicvideojukebox/resources/language/English/strings.xml
+++ b/plugin.video.musicvideojukebox/resources/language/English/strings.xml
@@ -9,6 +9,13 @@
<string id="30103">Maximum nr of stored searches</string>
<string id="30201">Search for artist</string>
+ <string id="30203">Recent searches</string>
+ <string id="30202">Top artists</string>
+ <string id="30204">Genres</string>
+ <string id="30205">Top tracks</string>
+ <string id="30206">Hyped artists</string>
+ <string id="30207">Hyped tracks</string>
+ <string id="30208">Loved tracks</string>
<string id="30301">One moment please...</string>
<string id="30302">Building playlist</string>
@@ -17,5 +24,19 @@
<string id="30305">No videos found</string>
<string id="30306">No videos found for %s</string>
+ <string id="30401">Information</string>
+ <string id="30402">No artists found.</string>
+ <string id="30403">No albums found.</string>
+ <string id="30404">No tracks found.</string>
+
+ <string id="30501">>>> Play all artists</string>
+ <string id="30502">>>> Play all albums and tracks</string>
+ <string id="30503">Top albums</string>
+ <string id="30504">Top tracks</string>
+ <string id="30505">Similar artists</string>
+ <string id="30506">>>> Play all albums</string>
+ <string id="30507">>>> Play all tracks</string>
+ <string id="30508">>>> Play all artists, albums and tracks</string>
+
</strings>
-----------------------------------------------------------------------
Summary of changes:
plugin.video.musicvideojukebox/Default.py | 618 ++++++++++++++------
.../GoogleSuggestCore.py | 31 +
plugin.video.musicvideojukebox/LastFMCore.py | 121 ++++
plugin.video.musicvideojukebox/YoutubeCore.py | 39 ++
plugin.video.musicvideojukebox/addon.xml | 2 +-
plugin.video.musicvideojukebox/changelog.txt | 22 +
plugin.video.musicvideojukebox/iZECore.py | 91 +++
.../resources/language/English/strings.xml | 21 +
8 files changed, 761 insertions(+), 184 deletions(-)
create mode 100644 plugin.video.musicvideojukebox/GoogleSuggestCore.py
create mode 100644 plugin.video.musicvideojukebox/LastFMCore.py
create mode 100644 plugin.video.musicvideojukebox/YoutubeCore.py
create mode 100644 plugin.video.musicvideojukebox/iZECore.py
hooks/post-receive
--
Plugins
------------------------------------------------------------------------------
All the data continuously generated in your IT infrastructure contains a
definitive record of customers, application performance, security
threats, fraudulent activity and more. Splunk takes this data and makes
sense of it. Business sense. IT sense. Common sense.
http://p.sf.net/sfu/splunk-d2dcopy1
_______________________________________________
Xbmc-addons mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/xbmc-addons