I totally hacked the heck outta your script to make it work with last.fm version 2.0 api. It really wasn't that hard, although I haven't got everything working 100% yet. I have gotten the similar tracks, similar artist, and artist top tracks working. The tags search will work if there is only one tag. It needs a loop to do a search one tag at a time. In my library I have multiple tags separated by a space and ; The similar tracks works but not completely, sometimes the artist node in the xml is element 5 but most the time it is element 7. I hard coded it for element 7 but a search for the artist node would be better. The user, group, and geo(location) searches are broke. I didn't look too hard at fixing those because I got the DJ working which was really my goal. I think I fixed the loadXML function so those searches can work, but I don't think they are getting the proper input. Again, I didn't look too hard at the other searches. You'll need an api key from last.fm, I used my own key and don't want it floating around out there. Just replace all the hashtags in loadXML with your api key.
I've had to split the code into three replies due to character limit.
Code: Select all
Option Explicit
'==========================================================================
'
' MediaMonkey Script
'
' SCRIPTNAME: LastFM Node
' DEVELOPMENT STARTED: 2008.01.16
Dim Version : Version = "2009.08.17.1000"
' DESCRIPTION: Creates a node where artists/tracks listed based on LastFM charts
' FORUM THREAD: http://www.mediamonkey.com/forum/viewtopic.php?t=24879
'
' INSTALL:
' - download install package @ http://teknojnky.googlepages.com/LastFMNode.mmip
' Recent Updates:
' 2009.8.14
' * added QuickQueue from last.fm menu, selected tracks will be queried and
' each of their similar tracks will be queued (using the queue # in options)
' * added dj queue option (queue a bunch of similar tracks)
' * added avoid twofers option (only applies to PAST and CURRENT artists, not QUEUED'
' 2009.01.25'
' * Optimized auto-dj mode retries (hopefully)'
' * Last.FM node now indicates what track will be used if you click the root node'
' * Misc stuff I've forgotten'
' * fixed a couple event errors'
' * disabled some unnecessary database transactions'
' 2009.01.15'
' * implemented favorites saving and usage (edit/remove not yet functional)'
' * favorite nodes are stored in Auto\LastFmNode.vbs.ini'
' * added menu and dialog to save favorites on the Last.FM toolbar button/menu'
' 2008.12.09
' * updated ini handling to better support mm 3.1'
' * Fixed control names in options sheet
' * Fixed dropdown lists in options sheet and added a couple more sorts'
' * Partially fixed enable dj mode from option sheet (still works from the toolbar menu)'
' * Updated SQL's to use current filter settings. Useful if you want to prevent
' in-accessible or other tracks from being queried'
' * Finally implemented preference saving to ini, you no longer need to manually
' modify the variables at the top of the script. Options > Library > Last.FM Node
' * Updated QueryLibrary() to avoid some case sensitivity and increase speed.
' thx to Bex, ZvezanD and thx for the interesting discussion about it
' * added check for similar artist exists in library before trying to find their
' tracks when similar tracks fails (prevents searching for tracks not in lib)
' * added Order variable to set the preferred sort order when searching for tracks'
' must be a valid ORDER BY <songfield> sql qualifier, default is sort by bitrate
' DESC so the highest bitrate track is used first. Other alternatives might be
' Rating DESC, DateAdded ASC/DESC, PlayCounter ASC/DESC, Year ASC/DESC,
' or Random(). Sort order only matters when you might have multiple copies
' of a track. The previous unspecified behavior appeared to be by songid.
' NOTE: if you choose Random(), you might get a repeat play of a track early
' because a different version may have been played previously.'
' * added db commits before sql iterators to avoid some database errors when
' multiple scripts are running or tags are being updated in the background
' * tweaked default min ratings for better compatibility with some scripts and other
' apps that use slightly different rating values'
' * updated the sql query with many thanks to Bex for a much much faster and less
' resource intensive query'
' * fixed artist check so that differing case doesn't matter (I noticed NoFX vs NOFX)'
' * implemented group tracks/artists, enjoy and don't forget to join "Media Monkey"
' * updated most of the last.fm nodes to be more consistent with stuff I learned later
' * should use new events instead of old onclick stuff'
' * added default variables to customize the prompts to your preferences,
' saving options to ini should be coming soon I hope.
' * added get current track artist/tags to those node, just click fav artist or tags node'
' * I think I have all functionality I originally envisioned and even some I didn't.
' Work soon to start on save/load nodes, optionsheet and whatever optimzations'
' * added a real PAINT IT BLACK icon based on image from Spacefish, Thanks!'
' * functionalized the dj restrictions (shouldn't really have any discernable effect)
' * add qry check for artist before searching artist+title
' I am interested in knowing if this is any noticible improvement
' especially for smaller libraries (shouldn't search for artists you don't have)
' * added check for min rating and size in qry (rating uses 'djminrating' variable)
' this affects the regular nodes to keep crappy tracks out, feedback requested'
' * misc improvements & logging tweaks/details (be sure to delete log occasionally)'
' * implemented related artist + random related artist top tracks failover
' if related tracks comes up empty.
' * implemented last chance add random track from library if all else fails'
' * implemented artist time limit (keeps artist from repeating within # hours)
' * implemented retry counter, script will now try to find more tracks by temporarily
' loosening restrictions (track/artist repeat timer, turn off dupe avoidance)'
' * last.fm node now adds a menu icon to the standard toolbar,
' more stuff will later be added to it'
' * added 'Last.FM DJ Mode... when enabled, this will auto-enqueue related tracks
' similar to auto-dj/scrobblerdj. Currently some options can be set
' script with variable start with DJ. Script uses 'related tracks' feed
' from last.fm, this is different from how scrobblerdj works. In the future
' options will add search similar to SDJ. DJ Mode picks random track from top
' related tracks found library. Be sure to disable SDJ or Auto-DJ.'
' * previously added: tracklist to root Last.FM Node which will display
' all related tracks (in your library) to the current play track. This list
' is the basis on which the dj mode is made.
' * improved status bar info
' * created MMIP install pack, should be able to inplace update without restart.'
' http://teknojnky.googlepages.com/LastFMNode.mmip
' TODO: Lots
' * add ability to save/load at least the first level artist/tags/user'
' * add duplicate filters to prevent having duplicate children within a tree'
' * add caching of each of the tracklists (with a manual refresh option) using sdb.objects
' * cache also probly usable to prevent dupes in trees
' * add dynamic context menus --> enter artist/tag(textbox), add/remove artist/tag
' * add option sheet/panel
' * make black last.fm icon option'
' * add any other feasible views/feeds not yet implemented'
' * there is some kind of problem with KoRn, lastfm returns KoRn with
' a backwards R which causes errors
' * need to check xml result somehow if error 404 (artist/tag/user/etc not found)
' * improve modularity and efficiency by combining like sections etc
Randomize Timer
Const ForReading = 1, ForWriting = 2, ForAppending = 8
' Dim Logging : Logging = False
' Dim Status : Status = True
' Dim Enabled : Enabled = True
' Dim Timeout : Timeout = 25 ' seconds'
' Dim ShowTimeOut: : ShowTimeOut = True 'Messgebox on timeout
' Dim AvoidDupes : AvoidDupes = True 'prevent multiple tracks of same name'
' Dim IconPref : IconPref = "PaintItBlack" 'choose "paintitblack" or "simplyred"'
' Dim DefArtist : DefArtist = "Nine Inch Nails" 'enter your on preferred default'
' Dim DefTag : DefTag = "Rock"
' Dim DefUser : DefUser = "teknojnky"
' Dim DefGroup : DefGroup = "Media Monkey"
' Dim DefLocale : DefLocale = "United States"
' Dim MaxNodes : MaxNodes = 10 ' limit expanded related nodes to #'
' Dim Order1 : Order1 = "Bitrate" 'search sort field'
' Dim Order2 : Order2 = "Desc" 'search sort order'
' misc DJ mode settings, I've set the defaults to be pretty good mix'
' Dim AutoDJMode : AutoDJMode = True
' Dim DJMinRating : DJMinRating = 46 'from -1 to 100, 50 = 2.5 star'
' Dim DJMinDays : DJMinDays = 3.5 'days for track repeat'
' Dim DJMinHours : DJMinHours = 6.5 'hours for artist repeat'
' Dim DJMaxCount : DJMaxCount = 30 'limits the dj mode tracks to top ## found'
' Dim DJRandom : DJRandom = True 'pick random (variety) or top (similar) usable track'
' Dim DJTwoFurs : DJTwoFurs = 1 '# to enqueue from related list (not done)'
' Dim DJShowInfo : DJShowInfo = True 'show statusbar summary info (not done)'
' Dim DJInfoTime : DJInfoTime = 10 'show summary info # seconds (not done)'
' Dim DJRetryMax : DJRetryMax = 2 'retry # times if insufficient tracks'
Dim DJRetryCount : DJRetryCount = 0 'counter for retries, do not modify'
' Dim DJQueue : DJQueue = 3 '# of similar tracks to queue'
' Dim DJAvoidTwofers: DJAvoidTwofers= True 'prevent adding current tracks artist'
Dim Tree : Set Tree = SDB.MainTree
Dim Tracks : Set Tracks = SDB.MainTracksWindow
' Dim Ini : Set Ini = SDB.IniFile
Dim UI : Set UI = SDB.UI
Dim Prefs : Prefs = "LastFMNode"
Dim Favorites
Set Favorites = SDB.Tools.IniFileByPath(Script.ScriptPath & ".ini" )
Sub OnStartUp()
Do While Not SDB.IsRunning
SDB.Tools.Sleep 100
SDB.ProcessMessages
Loop
InitPrefs
Call SDB.UI.AddOptionSheet("Last.FM Node",Script.ScriptPath,"InitSheet","SaveSheet",-3)
If SDB.IniFile.BoolValue(Prefs,"Enabled") = True Then
logme "LastFMNode: OnStartUp mode = Enabled, Version:> " & Version
InitLastFMNode
Else
logme "LastFMNode: OnStartUp mode = Disabled, Version:> " & Version
End If
End Sub
Sub InitLastFMNode()
logme "InitLastFMNode() was called, Version:> " & Version
Dim Node
Set Node = SDB.Objects("LastFMNode")
' this is supposed to check for existing lastfm node and unregister everything
If SDB.Objects("LastFMNode") Is Nothing Then
' msgbox ("no lastfm node object") 'do nothing'
Else
' msgbox ("last fm node object exists, needs reset now")
Script.UnRegisterAllEvents
' msgbox(Node.Caption)
Tree.RemoveNode Node
Set Node = Nothing
SDB.Objects("LastFMNode") = Nothing
'all should be reset now hopefully'
End If
Set Node = Tree.CreateNode
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Root Node'
If SDB.RegisterIcon ("Scripts\Auto\"& SDB.IniFile.StringValue(Prefs,"IconPref") & ".ico",1) <> -1 Then
Node.IconIndex = SDB.RegisterIcon ("Scripts\Auto\" & SDB.IniFile.StringValue(Prefs,"IconPref") & ".ico",1)
Else
Node.IconIndex = 37
End If
Node.Caption = "Last.FM Node"
Node.UseScript = Script.ScriptPath
' Node.OnFillTracksFunct = "FillNode" 'selection trigger'
' Node.OnFillChildren = "ExpandNode"
Script.RegisterEvent Node, "OnFillTracks", "FillNode"
Script.RegisterEvent Node, "OnFillChildren", "ExpandNode"
' Script.RegisterEvent SDB, "OnPlay", "UpdateCaption"
Tree.AddNode Tree.Node_Library, Node, 1
Node.HasChildren = True
LastFMNodeMenu
If SDB.IniFile.BoolValue(Prefs,"AutoDJMode") = True Then
Script.RegisterEvent SDB, "OnPlay", "LastFMDJEvent"
End If
Set SDB.Objects("LastFMNode") = Node
logme "InitLastFMNode() finished"
End Sub
Sub UpdateCaption()
If SDB.IniFile.BoolValue(Prefs,"Enabled") = True Then
SDB.Objects("LastFMNode").Caption = "Last.FM Node" &_
" (" & SDB.Player.CurrentSong.ArtistName &_
" - " & SDB.Player.CurrentSong.Title & ")"
SDB.MainTree.Refresh
End If
End Sub
Sub FillNode(obj) 'root last.fm node select'
logme "FillNode: started"
' msgbox ("Last.FM node Selected")
obj.HasChildren = True
Dim NowPlaying : Set NowPlaying = SDB.Player.CurrentSong
Dim NodeSongList
If Not (NowPlaying Is Nothing) Then
Set NodeSongList = GetSimilarTracks(NowPlaying.ArtistName,NowPlaying.Title)
End if
If Not (NodeSongList Is Nothing) Then
If NodeSonglist.Count > 0 Then
Dim x
For x = 0 to NodeSongList.Count-1
Tracks.AddTrack NodeSongList.Item(x)
SDB.ProcessMessages
Next
Tracks.FinishAdding
Else
' msgbox("SongList was empty, wasn't able to get any tracks")
End If
Else
' msgbox("GetSimilarTracks returned invalid object")
End If
logme "FillNode: Ended"
End Sub
Sub ExpandNode(obj) 'root last.fm node expand'
logme "ExpandNode: Started"
' msgbox("Last.FM Node Expanded")
' Node.Expanded = True
obj.HasChildren = False
obj.HasChildren = True
' msgbox("Ok add fav/tag/user/Location nodes now")
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Last.FM Child nodes'
' Favorite Artists' 'SimArts/TopTracks/TopAblums'
' Lists Artists -> Top artist tracks
' Expands to Related Artists -->
' May eventually also add expand for top albums and related top tags
logme " Adding Favorite Artists Node"
Dim Subnode : Set Subnode = Tree.CreateNode
Subnode.Caption = "Artists"
Subnode.UseScript = Script.ScriptPath
Subnode.IconIndex = 0
' Subnode.OnFillTracksFunct = "FillFavoriteArtistNode" 'selection trigger'
' Subnode.OnFillChildren = "ExpandFavoriteArtistNode" 'expand trigger'
Script.RegisterEvent SubNode, "OnFillTracks", "FillFavoriteArtistNode"
Script.RegisterEvent SubNode, "OnFillChildren", "ExpandFavoriteArtistNode"
' Script.RegisterEvent SDB, "OnPlay", "UpdateCaption"
Tree.AddNode obj, Subnode, 3
Subnode.HasChildren = True
logme " Adding Favorite Tags Node"
' Favorite Tags' 'TopArtists/TopAlbums/TopTracks'
' Lists Tags -> Top Tracks in that tag'
' Expands to Related Tags ->
' May eventually add top artists per tag -> that artists tracks
Set Subnode = Tree.CreateNode
Subnode.Caption = "Tags"
Subnode.UseScript = Script.ScriptPath
Subnode.IconIndex = 32
' Subnode.OnFillTracksFunct = "FillFavoriteTagsNode" 'selection trigger'
' Subnode.OnFillChildren = "ExpandFavoriteTagsNode" 'expand trigger'
Script.RegisterEvent SubNode, "OnFillTracks", "FillFavoriteTagsNode"
Script.RegisterEvent SubNode, "OnFillChildren", "ExpandFavoriteTagsNode"
' Script.RegisterEvent SDB, "OnPlay", "UpdateCaption"
Tree.AddNode obj, Subnode, 3
Subnode.HasChildren = True
'
logme " Adding User Charts Node"
' User Charts' Weekly Artists/Tracks, Top Artists/Tracks, SysRecommended
' User -> Weekly Tracks
' -> Weekly Artists + Tracks'
' User -> Top Tracks'
' -> Top Artists + Tracks
' User -> System Recommended Tracks'
Set Subnode = Tree.CreateNode
Subnode.Caption = "Users"
Subnode.UseScript = Script.ScriptPath
Subnode.IconIndex = 33
' Subnode.OnFillTracksFunct = "FillUserChartsNode" 'selection trigger'
' Subnode.OnFillChildren = "ExpandUserChartsNode" 'expand trigger'
Script.RegisterEvent SubNode, "OnFillTracks", "FillUserChartsNode"
Script.RegisterEvent SubNode, "OnFillChildren", "ExpandUserChartsNode"
Tree.AddNode obj, Subnode, 3
Subnode.HasChildren = True
logme " Adding Group Charts Node"
Set Subnode = Tree.CreateNode
Subnode.Caption = "Groups"
Subnode.UseScript = Script.ScriptPath
Subnode.IconIndex = 48
' Subnode.OnFillTracksFunct = "FillGroupChartsNode" 'selection trigger'
' Subnode.OnFillChildren = "ExpandGroupChartsNode" 'expand trigger'
Script.RegisterEvent SubNode, "OnFillTracks", "FillGroupChartsNode"
Script.RegisterEvent SubNode, "OnFillChildren", "ExpandGroupChartsNode"
Tree.AddNode obj, Subnode, 3
Subnode.HasChildren = True
logme " Adding Location Charts Node"
' Location Weekly Charts - TopArtists/Tracks -- unknown/no xml avail
' Location Weekly Top Tracks
' -> Weekly Top Artists + Tracks'
Set Subnode = Tree.CreateNode
Subnode.Caption = "Locations"
Subnode.UseScript = Script.ScriptPath
Subnode.IconIndex = 48
' Subnode.OnFillTracksFunct = "FillLocationChartsNode" 'selection trigger'
' Subnode.OnFillChildren = "ExpandLocationChartsNode" 'expand trigger'
Script.RegisterEvent SubNode, "OnFillTracks", "FillLocationChartsNode"
Script.RegisterEvent SubNode, "OnFillChildren", "ExpandLocationChartsNode"
Tree.AddNode obj, Subnode, 3
Subnode.HasChildren = True
logme "ExpandNode: Ended"
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Artist Node Section'
Sub FillFavoriteArtistNode(obj)
logme "FillFavoriteArtistNode: entered"
' msgbox("should be in favorite artists node")
' If obj.Expanded = True Then
' logme " Calling AddArtist()"
' AddArtist(obj)
' End If
obj.HasChildren = True
Dim NowPlaying : Set NowPlaying = SDB.Player.CurrentSong
Dim NodeSongList
If Not (NowPlaying Is Nothing) Then
Set NodeSongList = GetArtistTopTracks(NowPlaying.ArtistName)
End If
If Not (NodeSongList Is Nothing) Then
If NodeSonglist.Count > 0 Then
Dim x
For x = 0 to NodeSongList.Count-1
Tracks.AddTrack NodeSongList.Item(x)
SDB.ProcessMessages
Next
Tracks.FinishAdding
Else
' msgbox("SongList was empty, wasn't able to get any tracks")
End If
Else
' msgbox("GetArtistTopTracks returned invalid object")
End If
logme "FillFavoriteArtistNode: exited"
End Sub
Sub ExpandFavoriteArtistNode(obj)
logme "ExpandFavoriteArtistNode(obj): started"
obj.HasChildren = False 'clear old children'
obj.HasChildren = True
ReadFavs(obj)
' msgbox("Expanded Favorite Artists, artists should be visible")
logme "ExpandFavoriteArtistNode(obj): finished"
End Sub
Sub ReadFavs(obj)
'read saved favorites for expanded node'
Dim FavList : Set FavList = Favorites.Keys(obj.Caption)
If FavList.Count > 0 Then
Dim C, Child, Cap
For C = 0 to FavList.Count-1
Cap = Split(FavList.Item(C),"=")
Set Child = Tree.CreateNode
Child.Caption = Cap(1)
Child.IconIndex = obj.IconIndex
Child.SortCriteria = 0
Script.RegisterEvent Child, "OnFillTracks", "Fill" & obj.Caption & "Node"
Script.RegisterEvent Child, "OnFillChildren", "Expand" & obj.Caption & "Node"
Tree.AddNode obj, Child, 3
Child.HasChildren = True
Next
Else
' AddFavs(obj)
' obj.HasChildren = False
' obj.HasChildren = True
End If
End Sub
' Sub AddFavs(obj)
' Dim Input
' Input = InputBox(SDB.Localize("Add new " & obj.Caption))
' If Input <> "" Then
' Dim FavList : Set FavList = Favorites.Keys(obj.Caption)
' Favorites.StringValue(obj.Caption,"Fav" & FavList.Count) = Input
' 'Favorites.Flush
' End If
' End Sub
Sub AddArtist(obj)
logme "AddArtist: Begin"
' msgbox("AddArtist(obj)")
Dim Input
Input = InputBox("Enter Artist Name: ","Add an Artist",SDB.IniFile.StringValue(Prefs,"DefArtist"))
Dim ArtistNode : Set ArtistNode = Tree.CreateNode
If Input <> "" Then
logme " Adding Artist Node: " & Input
ArtistNode.Caption = Input
ArtistNode.IconIndex = 0
ArtistNode.SortCriteria = 0
ArtistNode.UseScript = Script.ScriptPath
' ArtistNode.OnFillTracksFunct = "FillArtistNode"
' ArtistNode.OnFillChildren = "ExpandArtistNode"
Script.RegisterEvent ArtistNode, "OnFillTracks", "FillArtistsNode"
Script.RegisterEvent ArtistNode, "OnFillChildren", "ExpandArtistNode"
Tree.AddNode obj, ArtistNode, 3
ArtistNode.HasChildren = True
Favorites.StringValue("Artists",Input) = Input
'Favorites.Flush
Else
logme " Invalid Artist, node not added"
End If
logme "AddArtist: finished"
End Sub
Sub FillArtistsNode(obj)
logme "FillArtistsNode: begin"
' msgbox ("Should be in an artist subnode")
Dim NodeSongList, Item
Set NodeSongList = GetArtistTopTracks(obj.Caption)
SDB.ProcessMessages
If NodeSonglist.Count > 0 Then
logme " SongList Appears OK, going to add to track list"
Dim x : x = 0
obj.Caption = NodeSongList.Item(x).ArtistName 'makes node same caps as lib'
For x = 0 to NodeSongList.Count-1
Tracks.AddTrack (NodeSongList.item(x))
SDB.ProcessMessages
Next
Tracks.FinishAdding
logme " add to tracklist finished, total tracks: " & NodeSongList.Count
Else
' msgbox("Song List was empty")
logme " Hmmm, songlist was empty... possibly requested artist not in library.."
End If
obj.HasChildren = True
logme "FillArtistsNode: finished"
End Sub
Sub ExpandArtistsNode(obj)
logme "ExpandArtistNode: Entered"
' msgbox("Ok so an artist node got expanded, should be adding similar artists now")
obj.HasChildren = False
obj.HasChildren = True
Dim SimilarArtistsNode, SimilarArtistsXML, Count
Count = 0
Set SimilarArtistsXML = LoadXML("&artist=" & fixurl(obj.Caption), "SimilarArtists")
SDB.ProcessMessages
If Not (SimilarArtistsXML Is Nothing) Then
logme " SimilarArtistXML appears to be OK, proceeding with add sim artist nodes"
Dim Ele
For Each Ele in SimilarArtistsXML.GetElementsByTagName("name")
Count = Count + 1
' msgbox(ele.childnodes.item(0).text)
Set SimilarArtistsNode = Tree.CreateNode
SimilarArtistsNode.Caption = Ele.ChildNodes.Item(0).Text
SimilarArtistsNode.IconIndex = 0
SimilarArtistsNode.UseScript = Script.ScriptPath
' SimilarArtistsNode.OnFillTracksFunct = "FillArtistsNode"
' SimilarArtistsNode.OnFillChildren = "ExpandArtistNode"
Script.RegisterEvent SimilarArtistsNode, "OnFillTracks", "FillArtistsNode"
Script.RegisterEvent SimilarArtistsNode, "OnFillChildren", "ExpandArtistsNode"
Tree.AddNode obj, SimilarArtistsNode, 3
SimilarArtistsNode.HasChildren = True
' obj.HasChildren = True
logme " Added Similar Artist Node: " & SimilarArtistsNode.Caption
SDB.ProcessMessages
If Count => SDB.IniFile.IntValue(Prefs,"MaxNodes") Then
logme " Similar Artist Count reached limit, exiting early"
Exit For
End If
Next
' obj.Expanded = True
Else
logme "SimilarArtistXML did not appear to load.. check loadxml() or network connection"
' msgbox ("Failed to get XML from LoadXML()")
End If
logme "ExpandArtistNode: exited with " & Count & " Artist sub nodes"
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Favorite Tags Section'
Sub FillFavoriteTagsNode(obj)
logme ">> Fill Favorite Tags Node: begin"
' msgbox("fillfavtags")
' If obj.Expanded = True Then
' logme " Calling AddArtist()"
' AddTag(obj)
' End If
Dim NowPlaying : Set NowPlaying = SDB.Player.CurrentSong
Dim NodeSongList
If Not (NowPlaying Is Nothing) Then
Set NodeSongList = GetTopTracksByTag(NowPlaying.Genre)
End If
If Not (NodeSongList Is Nothing) Then
If NodeSonglist.Count > 0 Then
Dim x
For x = 0 to NodeSongList.Count-1
Tracks.AddTrack NodeSongList.Item(x)
SDB.ProcessMessages
Next
Tracks.FinishAdding
Else
' msgbox("SongList was empty, wasn't able to get any tracks")
End If
Else
' msgbox("GetTopTracksByTag returned invalid object")
End If
obj.HasChildren = True
logme "<< Fill Favorite Tags Node: finish"
End Sub
Sub ExpandFavoriteTagsNode(obj)
logme ">> Fill Favorite Tags Node: begin"
' msgbox("favorite tags expanded")
obj.HasChildren = False ' clear old children'
obj.HasChildren = True
' AddTag(obj)
ReadFavs(obj)
logme "<< Fill Favorite Tags Node: finish"
End Sub
Sub AddTag(obj)
logme "AddTag: begin"
Dim TagNode : Set TagNode = Tree.CreateNode
Dim Input : Input = InputBox("Enter a Tag: ", "Add a Tag Node", SDB.IniFile.StringValue(Prefs,"DefTag"))
If Input <> "" Then
TagNode.Caption = Input
TagNode.IconIndex = 32
TagNode.SortCriteria = 0
TagNode.UseScript = Script.ScriptPath
' TagNode.OnFillTracksFunct = "FillTagNode" 'select trigger'
' TagNode.OnFillChildren = "ExpandTagNode" 'expand trigger'
Script.RegisterEvent TagNode, "OnFillTracks", "FillTagsNode"
Script.RegisterEvent TagNode, "OnFillChildren", "ExpandTagsNode"
Tree.AddNode obj, TagNode, 3
TagNode.HasChildren = True
Else
logme " Invalid Tag, node not added"
End If
logme "AddTag: finished"
End Sub
Sub FillTagsNode(obj)
logme "FillTagNode: begin"
' msgbox("fill tag node")
Dim NodeSongList, Item
Set NodeSongList = GetTopTracksByTag(obj.Caption)
SDB.ProcessMessages
If NodeSonglist.Count > 0 Then
logme " SongList Appears OK, going to add to track list"
Dim x : x = 0
' obj.Caption = NodeSongList.Item(x).ArtistName 'makes node same caps as lib'
For x = 0 to NodeSongList.Count-1
Tracks.AddTrack (NodeSongList.item(x))
SDB.ProcessMessages
Next
Tracks.FinishAdding
logme " add to tracklist finished, total tracks: " & NodeSongList.Count
Else
' msgbox("Song List was empty")
logme " Hmmm, songlist was empty... possibly requested tracks not in library.."
End If
obj.HasChildren = True
logme "FillTagNode: finished"
End Sub
Sub ExpandTagsNode(obj)
logme "ExpandTagNode: begin"
' msgbox ("Expand Tag Node()")
obj.HasChildren = False
obj.HasChildren = True
Dim TagArtistsNode, TagArtistsXML, StartTimer
StartTimer = Timer
Set TagArtistsXML = LoadXML("&tag=" & fixurl(obj.Caption), "TopArtistsByTag")
SDB.ProcessMessages
If Not (TagArtistsXML Is Nothing) Then
Dim Ele, TrackAttr, TrackTitle, ArtistAttr, ArtistName, NodeSongList
logme " TagArtistsXML appears to be OK, proceeding"
Dim Count : Count = 0
For Each Ele in TagArtistsXML.GetElementsByTagName("artist")
Count = Count + 1
Set ArtistAttr = Ele.Attributes
ArtistName = ArtistAttr.GetNamedItem("name").value 'get value of name attr'
Set TagArtistsNode = Tree.CreateNode
TagArtistsNode.Caption = ArtistName
TagArtistsNode.IconIndex = 0
TagArtistsNode.UseScript = Script.ScriptPath
' TagArtistsNode.OnFillTracksFunct = "FillArtistsNode"
' TagArtistsNode.OnFillChildren = "ExpandArtistTagNode" 'should be ExpandArtistTagNode'
Script.RegisterEvent TagArtistsNode, "OnFillTracks", "FillArtistsNode"
Script.RegisterEvent TagArtistsNode, "OnFillChildren", "ExpandArtistTagNode"
Tree.AddNode obj, TagArtistsNode, 3
TagArtistsNode.HasChildren = True
' obj.HasChildren = True
logme " Added Tag Artist Node: " & TagArtistsNode.Caption
SDB.ProcessMessages
If Count => SDB.IniFile.IntValue(Prefs,"MaxNodes") Then
Exit For
End If
SDB.ProcessMessages
Next
Else
logme "TagArtistXML did not appear to load.. check loadxml() or network connection"
' msgbox ("Failed to get XML from LoadXML()")
End If
logme "ExpandTagNode: finished"
End Sub
Sub ExpandArtistTagNode(obj)
' msgbox("expanding the artist top tags")
logme "ExpandArtistTagNode: begin"
obj.HasChildren = False ' clear existing subnodes'
obj.HasChildren = True
Dim ArtistTagNode, ArtistTagXML, StartTimer
StartTimer = Timer
Set ArtistTagXML = LoadXML("&artist=" & fixurl(obj.Caption), "ArtistTags")
If NOT (ArtistTagXML Is Nothing) Then
Dim Ele, ArtistAttr, ArtistName, Count
logme " ArtistTagXML appears to be OK, proceeding"
Count = 0
For Each Ele In ArtistTagXML.GetElementsByTagName("tag")
Count = Count + 1
Set ArtistTagNode = Tree.CreateNode
ArtistTagNode.Caption = Ele.ChildNodes.Item(0).Text
ArtistTagNode.IconIndex = 32
ArtistTagNode.UseScript = Script.ScriptPath
' ArtistTagNode.OnFillTracksFunct = "FillTagNode"
' ArtistTagNode.OnFillChildren = "ExpandTagNode"
Script.RegisterEvent ArtistTagNode, "OnFillTracks", "FillTagsNode"
Script.RegisterEvent ArtistTagNode, "OnFillChildren", "ExpandTagsNode"
Tree.AddNode obj, ArtistTagNode, 3
ArtistTagNode.HasChildren = True
logme " Added Node: " & ArtistTagNode.Caption
SDB.ProcessMessages
If Count => SDB.IniFile.IntValue(Prefs,"MaxNodes") Then
Exit For
End If
SDB.ProcessMessages
Next
Else
logme "ArtistTagXML did not appear to load.. check loadxml() or network connection"
' msgbox ("Failed to get XML from LoadXML()")
End If
logme "ExpandArtistTagNode: finished"
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' User Charts Section'
Sub FillUserChartsNode(obj)
' msgbox("fillusercharts")
If obj.Expanded = True Then
logme " Calling AddUser()"
AddUser(obj)
End If
obj.HasChildren = True
End Sub
Sub ExpandUserChartsNode(obj)
' msgbox("user charts expanded")
obj.HasChildren = False ' clear old children'
obj.HasChildren = True
' AddUser(obj)
ReadFavs(obj)
End Sub
Sub AddUser(obj)
Dim UserChartNode : Set UserChartNode = Tree.CreateNode
Dim Input : Input = InputBox("Enter a Last.FM User", "Add a User", SDB.IniFile.StringValue(Prefs,"DefUser"))
If Input <> "" Then
UserChartNode.Caption = Input
UserChartNode.IconIndex = 33
UserChartNode.SortCriteria = 0
UserChartNode.UseScript = Script.ScriptPath
' UserChartNode.OnFillTracksFunct = "FillUserNode"
' UserChartNode.OnFillChildren = "ExpandUserNode"
Script.RegisterEvent UserChartNode, "OnFillTracks", "FillUsersNode"
Script.RegisterEvent UserChartNode, "OnFillChildren", "ExpandUsersNode"
Tree.AddNode obj, UserChartNode, 3
UserChartNode.HasChildren = True
Else
logme " Invalid Tag, node not added"
End If
End Sub
Sub FillUsersNode(obj)
logme "FillUserNode: begin"
' msgbox("fill user node")
' user node needs weekly artists, weekly tracks, top artist, top tracks, top tags'
' not sure what to fill here since the tracks are filled in the subnodes'
obj.HasChildren = True
' If obj.Expanded = False Then ' no fill tracks here, so auto-expand'
' obj.Expanded = True
' End If
logme "FillUserNode: finished"
End Sub
Sub ExpandUsersNode(obj)
logme "ExpandUserNode: begin"
' Expand user node for sysrecartists, weekly/top artists and tags'
obj.HasChildren = False
obj.HasChildren = True
Dim SubNode
Set Subnode = Tree.CreateNode
Subnode.Caption = "Weekly"
Subnode.UseScript = Script.ScriptPath
Subnode.IconIndex = 33
' Subnode.OnFillTracksFunct = "FillUserWeeklyChartsNode" 'selection trigger'
' Subnode.OnFillChildren = "ExpandUserWeeklyChartsNode" 'expand trigger'
Script.RegisterEvent SubNode, "OnFillTracks", "FillUserWeeklyChartsNode"
Script.RegisterEvent SubNode, "OnFillChildren", "ExpandUserWeeklyChartsNode"
Tree.AddNode obj, Subnode, 3
Subnode.HasChildren = True
Set Subnode = Tree.CreateNode
Subnode.Caption = "Overall"
Subnode.UseScript = Script.ScriptPath
Subnode.IconIndex = 33
' Subnode.OnFillTracksFunct = "FillUserTopChartsNode" 'selection trigger'
' Subnode.OnFillChildren = "ExpandUserTopChartsNode" 'expand trigger'
Script.RegisterEvent SubNode, "OnFillTracks", "FillUserTopChartsNode"
Script.RegisterEvent SubNode, "OnFillChildren", "ExpandUserTopChartsNode"
Tree.AddNode obj, Subnode, 3
Subnode.HasChildren = True
Set Subnode = Tree.CreateNode
Subnode.Caption = "Recommended Artists"
Subnode.UseScript = Script.ScriptPath
Subnode.IconIndex = 33
' Subnode.OnFillTracksFunct = "FillRecommendedNode" 'selection trigger' not sure what to fill here
' Subnode.OnFillChildren = "ExpandRecommendedNode" 'expand trigger'
Script.RegisterEvent SubNode, "OnFillTracks", "FillRecommendedNode"
Script.RegisterEvent SubNode, "OnFillChildren", "ExpandRecommendedNode"
Tree.AddNode obj, Subnode, 3
Subnode.HasChildren = True
logme "ExpandUserNode: finished"
End Sub
Sub FillUserWeeklyChartsNode(obj)
logme "FillUserWeeklyChartsNode: begin"
' msgbox("fill user weekly charts node tracks " & obj.caption)
Dim NodeSongList, Item, ParentNode
Set ParentNode = Tree.ParentNode(obj)
Set NodeSongList = GetChartTracks(ParentNode.Caption,"UserTracks")
SDB.ProcessMessages
If NodeSonglist.Count > 0 Then
logme " SongList Appears OK, going to add to track list"
Dim x : x = 0
' obj.Caption = NodeSongList.Item(x).ArtistName 'makes node same caps as lib'
For x = 0 to NodeSongList.Count-1
Tracks.AddTrack (NodeSongList.item(x))
SDB.ProcessMessages
Next
Tracks.FinishAdding
logme " add to tracklist finished, total tracks: " & NodeSongList.Count
Else
' msgbox("Song List was empty")
logme " Hmmm, songlist was empty... possibly requested tracks not in library.."
End If
obj.HasChildren = True
logme "FillUserWeeklyChartsNode: finished"
End Sub
Sub ExpandUserWeeklyChartsNode(obj)
logme "ExpandUserWeeklyChartsNode: begin"
obj.HasChildren = False
obj.HasChildren = True
Dim WeeklyArtistNode, WeeklyArtistXML, StartTimer, ParentNode
Set ParentNode = Tree.ParentNode(obj)
StartTimer = Timer
Set WeeklyArtistXML = LoadXML("&user=" & ParentNode.Caption, "UserArtists")
SDB.ProcessMessages
If NOT (WeeklyArtistXML Is Nothing) Then
Dim Ele, ArtistAttr, ArtistName, Count
logme " WeeklyArtistXML appears to be OK, proceeding"
Count = 0
For Each Ele In WeeklyArtistXML.GetElementsByTagName("artist")
Count = Count + 1
Set WeeklyArtistNode = Tree.CreateNode
WeeklyArtistNode.Caption = Ele.ChildNodes.Item(0).Text
WeeklyArtistNode.IconIndex = 0
WeeklyArtistNode.UseScript = Script.ScriptPath
' WeeklyArtistNode.OnFillTracksFunct = "FillArtistsNode"
' WeeklyArtistNode.OnFillChildren = "ExpandAlbumNode" 'havent decided what'
Script.RegisterEvent WeeklyArtistNode, "OnFillTracks", "FillArtistsNode"
' Script.RegisterEvent WeeklyArtistNode, "OnFillChildren", "ExpandArtistNode"
Tree.AddNode obj, WeeklyArtistNode, 3
WeeklyArtistNode.HasChildren = False
' obj.HasChildren = True
logme " Added Node: " & WeeklyArtistNode.Caption
SDB.ProcessMessages
If Count => SDB.IniFile.IntValue(Prefs,"MaxNodes") Then
Exit For
End If
SDB.ProcessMessages
Next
Else
logme "WeeklyArtistXML did not appear to load.. check loadxml() or network connection"
' msgbox ("Failed to get XML from LoadXML()")
End If
logme "ExpandUserWeeklyChartsNode: finished"
End Sub
Sub FillUserTopChartsNode(obj)
logme "FillUserTopChartsNode: begin"
' msgbox("fill user Top charts node tracks " & obj.caption)
Dim NodeSongList, Item, ParentNode
Set ParentNode = Tree.ParentNode(obj)
Set NodeSongList = GetChartTracks(ParentNode.Caption,"TopTracksChart")
SDB.ProcessMessages
If NodeSonglist.Count > 0 Then
logme " SongList Appears OK, going to add to track list"
Dim x : x = 0
' obj.Caption = NodeSongList.Item(x).ArtistName 'makes node same caps as lib'
For x = 0 to NodeSongList.Count-1
Tracks.AddTrack (NodeSongList.item(x))
SDB.ProcessMessages
Next
Tracks.FinishAdding
logme " add to tracklist finished, total tracks: " & NodeSongList.Count
Else
' msgbox("Song List was empty")
logme " Hmmm, songlist was empty... possibly requested tracks not in library.."
End If
obj.HasChildren = True
logme "FillUserTopChartsNode: finished"
End Sub
Sub ExpandUserTopChartsNode(obj)
logme "ExpandUserTopChartsNode: begin"
obj.HasChildren = False
obj.HasChildren = True
Dim TopArtistNode, TopArtistXML, StartTimer, ParentNode
Set ParentNode = Tree.ParentNode(obj)
StartTimer = Timer
Set TopArtistXML = LoadXML("&user=" & ParentNode.Caption, "TopArtistsChart")
SDB.ProcessMessages
If NOT (TopArtistXML Is Nothing) Then
Dim Ele, ArtistAttr, ArtistName, Count
logme " TopArtistXML appears to be OK, proceeding"
Count = 0
For Each Ele In TopArtistXML.GetElementsByTagName("artist")
Count = Count + 1
Set TopArtistNode = Tree.CreateNode
TopArtistNode.Caption = Ele.ChildNodes.Item(0).Text
TopArtistNode.IconIndex = 0
TopArtistNode.UseScript = Script.ScriptPath
' TopArtistNode.OnFillTracksFunct = "FillArtistsNode"
' TopArtistNode.OnFillChildren = "ExpandAlbumNode" 'havent decided what'
Script.RegisterEvent TopArtistNode, "OnFillTracks", "FillArtistsNode"
' Script.RegisterEvent TopArtistNode, "OnFillChildren", "ExpandArtistNode"
Tree.AddNode obj, TopArtistNode, 3
TopArtistNode.HasChildren = False
logme " Added Node: " & TopArtistNode.Caption
SDB.ProcessMessages
If Count => SDB.IniFile.IntValue(Prefs,"MaxNodes") Then
Exit For
End If
SDB.ProcessMessages
Next
Else
logme "TopArtistXML did not appear to load.. check loadxml() or network connection"
' msgbox ("Failed to get XML from LoadXML()")
End If
logme "ExpandUserTopChartsNode: finished"
End Sub
Sub FillRecommendedNode(obj)
logme "FillRecommendedNode: begin"
obj.HasChildren = True
' If obj.Expanded = False Then ' no fill tracks here, so auto-expand'
' obj.Expanded = True
' End If
logme "FillRecommendedNode: finished"
End Sub
Sub ExpandRecommendedNode(obj)
logme "ExpandRecommendedNode: begin"
obj.HasChildren = False
obj.HasChildren = True
Dim RecommendedArtistNode, RecommendedArtistXML, StartTimer, ParentNode
Set ParentNode = Tree.ParentNode(obj)
StartTimer = Timer
Set RecommendedArtistXML = LoadXML("&user=" & ParentNode.Caption, "Recommended")
SDB.ProcessMessages
If NOT (RecommendedArtistXML Is Nothing) Then
Dim Ele, ArtistAttr, ArtistName, Count
logme " RecommendedArtistXML appears to be OK, proceeding"
Count = 0
For Each Ele In RecommendedArtistXML.GetElementsByTagName("artist")
Count = Count + 1
Set RecommendedArtistNode = Tree.CreateNode
RecommendedArtistNode.Caption = Ele.ChildNodes.Item(0).Text
RecommendedArtistNode.IconIndex = 0
RecommendedArtistNode.UseScript = Script.ScriptPath
' RecommendedArtistNode.OnFillTracksFunct = "FillArtistsNode"
' RecommendedArtistNode.OnFillChildren = "ExpandAlbumNode" 'havent decided what'
Script.RegisterEvent RecommendedArtistNode, "OnFillTracks", "FillArtistsNode"
' Script.RegisterEvent RecommendedArtistNode, "OnFillChildren", "ExpandArtistNode"
Tree.AddNode obj, RecommendedArtistNode, 3
RecommendedArtistNode.HasChildren = True
logme " Added Node: " & RecommendedArtistNode.Caption
SDB.ProcessMessages
If Count => SDB.IniFile.IntValue(Prefs,"MaxNodes") Then
Exit For
End If
SDB.ProcessMessages
Next
Else
logme "RecommendedArtistXML did not appear to load.. check loadxml() or network connection"
' msgbox ("Failed to get XML from LoadXML()")
End If
logme "ExpandRecommendedNode: finished"
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Group Charts Section'
' Script.RegisterEvent SubNode, "OnFillTracks", "FillGroupChartsNode"
' Script.RegisterEvent SubNode, "OnFillChildren", "ExpandGroupChartsNode"
Sub FillGroupChartsNode(obj)
logme "FillGroupChartsNode: begin"
' msgbox("fill group charts node event fired")
obj.HasChildren = True
' AddGroupNode(obj)
logme "FillGroupChartsNode: finished"
End Sub
Sub ExpandGroupChartsNode(obj)
logme "ExpandGroupChartsNode: begin"
' msgbox("expand group charts node event fired")
obj.HasChildren = False
obj.HasChildren = True
' AddGroupNode(obj)
ReadFavs(obj)
logme "ExpandGroupChartsNode: finished"
End Sub
Function AddGroupNode(obj)
logme "AddGroupNode: begin "
Dim Input : Input = InputBox("Enter Group Name: ", "Add a Group",SDB.IniFile.StringValue(Prefs,"DefGroup"))
If Input <> "" Then
logme " Adding Group Node: " & Input
Dim GroupNode : Set GroupNode = Tree.CreateNode
GroupNode.Caption = Input
GroupNode.IconIndex = 48
GroupNode.SortCriteria = 0
GroupNode.UseScript = Script.ScriptPath
' GroupNode.OnFillTracksFunct = "FillGroupNode"
' GroupNode.OnFillChildren = "ExpandGroupNode"
Script.RegisterEvent GroupNode, "OnFillTracks", "FillGroupsNode"
Script.RegisterEvent GroupNode, "OnFillChildren", "ExpandGroupsNode"
Tree.AddNode obj, GroupNode, 3
GroupNode.HasChildren = True
Else
logme " Invalid Group, node not added"
End If
logme "AddGroupNode: finished with :> " & Input
End Function
Sub FillGroupsNode(obj)
logme "FillGroupNode: begin"
Dim NodeSongList, Item
Set NodeSongList = GetChartTracks(obj.Caption,"GroupTracks")
SDB.ProcessMessages
If NodeSonglist.Count > 0 Then
logme " SongList Appears OK, going to add to track list"
Dim x : x = 0
' obj.Caption = NodeSongList.Item(x).ArtistName 'makes node same caps as lib'
For x = 0 to NodeSongList.Count-1
Tracks.AddTrack (NodeSongList.item(x))
SDB.ProcessMessages
Next
Tracks.FinishAdding
logme " add to tracklist finished, total tracks: " & NodeSongList.Count
Else
' msgbox("Song List was empty")
logme " Hmmm, songlist was empty... possibly requested tracks not in library.."
End If
obj.HasChildren = True
logme "FillGroupNode: finished"
End Sub
Sub ExpandGroupsNode(obj)
logme "ExpandGroupNode: begin"
' msgbox("expandgroupnode")
obj.HasChildren = False
obj.HasChildren = True
Dim GroupNode, GroupXML, StartTimer, ParentNode
Set ParentNode = Tree.ParentNode(obj)
StartTimer = Timer
logme " calling LoadXML with :> " & obj.Caption & ", GroupArtists"
Set GroupXML = LoadXML("&group=" & fixurl(obj.Caption), "GroupArtists")
SDB.ProcessMessages
If NOT (GroupXML Is Nothing) Then
Dim Ele, ArtistAttr, ArtistName, Count
logme " GroupXML appears to be OK, proceeding"
Count = 0
For Each Ele In GroupXML.GetElementsByTagName("artist")
Count = Count + 1
' msgbox(ele.childnodes.item(0).text)
Set GroupNode = Tree.CreateNode
GroupNode.Caption = Ele.ChildNodes.Item(0).Text
GroupNode.IconIndex = 0
GroupNode.UseScript = Script.ScriptPath
Script.RegisterEvent GroupNode, "OnFillTracks", "FillArtistsNode"
' Script.RegisterEvent GroupNode, "OnFillChildren", "ExpandArtistNode"
Tree.AddNode obj, GroupNode, 3
GroupNode.HasChildren = True
logme " Added Node: " & GroupNode.Caption
SDB.ProcessMessages
If Count => SDB.IniFile.IntValue(Prefs,"MaxNodes") Then
Exit For
End If
SDB.ProcessMessages
Next
Else
logme "GroupXML did not appear to load.. check loadxml() or network connection"
' msgbox ("Failed to get XML from LoadXML()")
End If
logme "ExpandGroupNode: finished"
End Sub
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' Location Charts Section'
'there is no overall charts, but there are top artist/tracks by PLACE (UK/US etc)
Sub FillLocationChartsNode(obj)
logme "FillLocationChartsNode: begin"
' msgbox("fillLocationcharts not yet implemented")
If obj.Expanded = True Then
' AddLocation(obj)
End If
obj.HasChildren = True
logme "FillLocationChartsNode: finished"
End Sub
Sub ExpandLocationChartsNode(obj)
logme "ExpandLocationChartsNode: begin"
' msgbox("Location charts expanded")
obj.HasChildren = False
obj.HasChildren = True
' AddLocation(obj)
ReadFavs(obj)
logme "ExpandLocationChartsNode: finished"
End Sub
Sub AddLocation(obj)
logme "AddLocation: begin"
Dim Input : Input = InputBox("Enter Location Name: ", "Add a Location",SDB.IniFile.StringValue(Prefs,"DefLocale"))
If Input <> "" Then
logme " Adding Location Node: " & Input
Dim LocationNode : Set LocationNode = Tree.CreateNode
LocationNode.Caption = Input
LocationNode.IconIndex = 48
LocationNode.SortCriteria = 0
LocationNode.UseScript = Script.ScriptPath
' LocationNode.OnFillTracksFunct = "FillLocationNode"
' LocationNode.OnFillChildren = "ExpandLocationNode"
Script.RegisterEvent LocationNode, "OnFillTracks", "FillLocationsNode"
Script.RegisterEvent LocationNode, "OnFillChildren", "ExpandLocationsNode"
Tree.AddNode obj, LocationNode, 3
LocationNode.HasChildren = True
Else
logme " Invalid Location, node not added"
End If
logme "AddLocation: finished"
End Sub
Sub FillLocationsNode(obj)
logme "FillLocationNode: begin"
Dim LocationTracks, LocationTracksXML, StartTimer, StatusBar
Set StatusBar = SDB.Progress
StatusBar.MaxValue = 100
StartTimer = Timer
StatusBar.Text = "Last.FM Node:> Elapsed Time:> " & Int(Timer-StartTimer) &_
" Calling LoadXML with: " & obj.Caption & ", LocationTracks"
Set LocationTracksXML = LoadXML("&geo=" & fixrl(obj.Caption),"LocationTracks")
SDB.ProcessMessages
If NOT (LocationTracksXML Is Nothing) Then
logme " LocationTracksXML appears to be OK, proceeding"
StatusBar.Text = "Last.FM Node:> Elapsed Time: " & Int(Timer-StartTimer) & " LoadXML Returned OK"
Dim Ele, TrackAttr, TrackTitle, ArtistAttr, ArtistName, NodeSongList, Count
Count = 0
Set NodeSonglist = SDB.NewSongList
For Each Ele in LocationTracksXML.GetElementsByTagName("track")
'Set TrackAttr = Ele.Attributes
'TrackTitle = TrackAttr.GetNamedItem("name").Value 'get value of name attr'
'Set ArtistAttr = Ele.ChildNodes(7).Attributes
'ArtistName = ArtistAttr.GetNamedItem("name").Value 'get value of name attr'
TrackTitle = Ele.ChildNodes(0).Text
ArtistName = Ele.ChildNodes(7).ChildNodes(0).Text
'Set TrackAttr = Ele.Attributes
'TrackTitle = TrackAttr.GetNamedItem("name").Value 'get value of name attr'
'Set ArtistAttr = TrackAttr.GetNamedItem("artist").Value
'ArtistName = ArtistAttr.GetNamedItem("name").Value 'get value of name attr'
StatusBar.Text = "Last.FM Node:> Elapsed Time: " & Int(Timer-StartTimer) &_
" < Found:> " & Count & " < Searching for:> " &_
ArtistName & " - " & TrackTitle
logme StatusBar.Text
StatusBar.Increase
SDB.ProcessMessages
'ok should have artist - title, now need to query database and add..'
Set NodeSongList = QueryLibrary (ArtistName,TrackTitle)
If NodeSongList.Count > 0 Then
Dim x
For x = 0 to NodeSongList.Count-1
Tracks.AddTrack (NodeSongList.Item(x))
Count = Count +1
SDB.ProcessMessages
Next
End If
If StatusBar.Terminate Then
Exit Sub
End If
SDB.ProcessMessages
Next
End If
Tracks.FinishAdding
obj.HasChildren = True
logme "FillLocationNode: finished"
End Sub
Sub ExpandLocationsNode(obj)
logme "ExpandLocationsNode: begin"
obj.HasChildren = False
obj.HasChildren = True
' msgbox("expand location artists here")
Dim LocationArtistsNode, LocationArtistsXML, StartTimer
StartTimer = Timer
Set LocationArtistsXML = LoadXML("&geo=" & fixurl(obj.Caption), "LocationArtists")
SDB.ProcessMessages
If Not (LocationArtistsXML Is Nothing) Then
logme " LocationArtistsXML appears to be OK, proceeding"
Dim Count : Count = 0
Dim Ele, TrackAttr, TrackTitle, ArtistAttr, ArtistName, NodeSongList
For Each Ele in LocationArtistsXML.GetElementsByTagName("artist")
Count = Count + 1
Set ArtistAttr = Ele.Attributes
ArtistName = ArtistAttr.GetNamedItem("name").value 'get value of name attr'
Set LocationArtistsNode = Tree.CreateNode
LocationArtistsNode.Caption = ArtistName
LocationArtistsNode.IconIndex = 0
LocationArtistsNode.UseScript = Script.ScriptPath
' LocationArtistsNode.OnFillTracksFunct = "FillArtistsNode"
' LocationArtistsNode.OnFillChildren = "ExpandArtistNode"
Script.RegisterEvent LocationArtistsNode, "OnFillTracks", "FillArtistsNode"
Script.RegisterEvent LocationArtistsNode, "OnFillChildren", "ExpandArtistsNode"
Tree.AddNode obj, LocationArtistsNode, 3
LocationArtistsNode.HasChildren = True
logme " Added Location Artist Node: " & LocationArtistsNode.Caption
SDB.ProcessMessages
If Count => SDB.IniFile.IntValue(Prefs,"MaxNodes") Then
Exit For
End If
SDB.ProcessMessages
Next
Else
logme "LocationArtistXML did not appear to load.. check loadxml() or network connection"
' msgbox ("Failed to get XML from LoadXML()")
End If
logme "ExpandLocationNode: finished"
End Sub
'=============================================================================='
' Menu Functions'
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' add context menus' 'note not completed yet'
' commented out until further work can be done'
' Dim Sep : Set Sep = SDB.UI.AddMenuItemSep(SDB.UI.Menu_Pop_Tree,0,0)
' Set SDB.Objects("mAddArt") = SDB.UI.AddMenuItem(SDB.UI.Menu_Pop_Tree,0,0)
' SDB.Objects("mAddArt").Caption = "Add Artist to Last.FM Node"
' SDB.Objects("mAddArt").OnClickFunc = "AddArtist"
'
' Set SDB.Objects("mRemArt") = SDB.UI.AddMenuItem(SDB.UI.Menu_Pop_Tree,0,0)
' SDB.Objects("mRemArt").Caption = "Remove Artist from Last.FM Node"
' SDB.Objects("mRemArt").OnClickFunc = "RemoveArtist"
'
' Set SDB.Objects("mAvoidDupes") = SDB.UI.AddMenuItem(SDB.UI.Menu_Pop_Tree,0,0)
' SDB.Objects("mAvoidDupes").Caption = "Toggle Avoid Dupes"
' SDB.Objects("mAvoidDupes").OnClickFunc = "ToggleAvoidDupes"
'
' Set SDB.Objects("mRefresh") = SDB.UI.AddMenuItem(SDB.UI.Menu_Pop_Tree,0,0)
' SDB.Objects("mRefresh").Caption = "Re-Query Last.FM servers"
' SDB.Objects("mRefresh").OnClickFunc = "ReQuery"
'
' Set SDB.Objects("mGetRelated") = SDB.UI.AddMenuItem(SDB.UI.Menu_Pop_Tree,0,0)
' SDB.Objects("mGetRelated").Caption = "Get Related Artists"
' SDB.Objects("mGetRelated").OnClickFunc = "GetRelated"
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'''''' Toolbar Menu Mockup '''''''''''''''''''''''''''''''''''''''''''''''''''''
' Last.FM Icon toolbar menu >
' Similar (selected track) Tracks / Artists
' Top (selected track) > ArtistTracks / ArtistTags / ArtistListeners
' Save To > Favorite Artists > Favorite Tags (library genre or top artist tag?)
' ----------'
' Last.FM DJ Mode (checkmark enable/disable)
' ----------'
' Refresh Selected Node'
' Remove Selected Node'
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''