I've had a few questions over the past few days.
Bex has been kind enough to help me out with them.
Thanks.
I've want a way of maintaining collections of Albums in MediaMonkey.
I've always used Playlists to do this; they work fine for the most part, but its really hard to maintain an ordered set of Albums with Playlists.
For instance, Rolling Stones 500 Greatest Albums of All Time.
http://www.rollingstone.com/music/lists ... e-19691231
Ideally, I would also love to be able to import a text file that contains a list of Artists & Albums or if possible import it from a website like, ListsOfBests.
http://www.listsofbests.com/list/5413-5 ... f-all-time
My idea would have all the albums listed in a Tree Node.
Lets say this script would make its best attempt to find the album in my library by AlbumArtist & AlbumName.
If they aren't found they would be still be displayed (yet disabled somehow) in the Tree of that particular Album Collection.
As I collect them, I'd like to be able to mark them off by "linking" the Album to an Album in my library.
This is just an initial scratch at the idea.
I wanted to know what people thought, I'm sure someone has a few ideas for me.
The script adds an Album Collection Node to the tree.

You can right click the Album Collection Node to add an Album Collection.
At what point, any song(s) that are dragged onto the Album Collection, crates an entry for the entire Album under the collection.
As of now Collections can be Added/Removed/Renamed, Albums can be Added/Removed.
Besides the magical "list import" & "linking" functionality I would love to add.
I would like Album Collections to be able to be organized in the Tree, in Folders (for lack of a better term).
I'd like Albums in the Album Collection to be easily sortable. Possibly dragging an Album in a collection on top of another Album, would put the prior ahead of the former.
I'd like like to optionally put Numbers ahead of each album in the tree. I'd like an Album collection to optionally group its children into sub-folders (1-50, 51-100, etc.)
These are all things that I try to do with my playlists, but I find it very frustrating at times.
So alas, I wanted to get the thoughts of the community here...
- Is there an addon/script that already does this?
Is this something that others would be interested in?
Does anyone have any other ideas/wishes that I could add to this?
I have to add two tables to the database to do this, what are peoples thoughts on that?
Thanks for checking it out if you do.
-AngrySpade
Code: Select all
' Album Collections
'
' Version: 0.1
' Date: 2011-06-13
' Author: Stanley Goldman
Const KEY_ALBUM_COLLECTION_ROOT_NODE = "SPADE_AlbumCollectionRootNode"
Const KEY_ALBUM_COLLECTION_MENU = "SPADE_AlbumCollectionRootMenu"
Const NODEID_ALBUM_COLLECTION_ROOT = 113113
Const NODEID_ALBUM_COLLECTION = 113114
Const NODEID_ALBUM_COLLECTION_ALBUM = 113115
Sub DebugBox (Message)
SDB.MessageBox Message, mtInformation, Array(mbOk)
End Sub
Sub CreateSystemTables
SDB.Database.ExecSql("CREATE TABLE IF NOT EXISTS SpadeAlbumCollections (ID integer PRIMARY KEY AUTOINCREMENT, Name text NOT NULL COLLATE IUNICODE)")
SDB.Database.ExecSql("CREATE TABLE IF NOT EXISTS SpadeAlbumCollectionList (" & _
"ID integer PRIMARY KEY AUTOINCREMENT," & _
"AlbumCollectionID integer," & _
"AlbumArtist text COLLATE IUNICODE," & _
"Album text COLLATE IUNICODE," & _
"AlbumOrder integer NOT NULL, " & _
"AlbumID integer, " & _
"FOREIGN KEY (AlbumCollectionID) REFERENCES SpadeAlbumCollections(ID) ON DELETE CASCADE," & _
"FOREIGN KEY (AlbumID) REFERENCES Albums(ID) ON DELETE SET NULL)")
End Sub
'*******************************************
'Album Functions
'*******************************************
Function AddAlbum(AlbumCollectionNode, ID, Name)
Dim Tree : Set Tree = SDB.MainTree
Dim AlbumNode : Set AlbumNode = Tree.CreateNode
AlbumNode.CustomData = ID
AlbumNode.Caption = Name
AlbumNode.IconIndex = 17
AlbumNode.UseScript = Script.ScriptPath
Tree.AddNode AlbumCollectionNode, AlbumNode, 3
Script.RegisterEvent AlbumNode, "OnFillTracks", "Album_OnFillTracks"
Script.RegisterEvent AlbumNode, "OnExecMenuItem", "Album_OnExecMenuItem"
Script.RegisterEvent AlbumNode, "OnShowMenuItem", "Album_OnShowMenuItem"
Set AddAlbum = AlbumNode
End Function
'*******************************************
'End Album Functions
'*******************************************
'*******************************************
'Album Events
'*******************************************
Sub Album_OnFillTracks(AlbumNode)
Dim AlbumID : AlbumID = AlbumNode.CustomData
Set Trcks = SDB.MainTracksWindow
Trcks.AddTracksFromCustomQuery("SELECT Songs.* FROM Songs WHERE Songs.IDALBUM = " & AlbumID)
Trcks.FinishAdding
End Sub
Function Album_OnShowMenuItem(iItemIndex)
Select Case iItemIndex
Case 5
Album_OnShowMenuItem = True
Case Else
Album_OnShowMenuItem = False
End Select
End Function
Function Album_OnExecMenuItem(iItemIndex)
If iItemIndex = 5 Then
If Not SDB.MainTree.CurrentNode Is Nothing Then
Dim AblumNode : Set AblumNode = SDB.MainTree.CurrentNode
Dim AlbumID : AlbumID = AblumNode.CustomData
SDB.Database.ExecSql("DELETE FROM SpadeAlbumCollectionList WHERE ID = " & AlbumID)
SDB.MainTree.RemoveNode AblumNode
End If
Album_OnExecMenuItem = True
Else
Album_OnExecMenuItem = False
End If
End Function
'*******************************************
'End Album Events
'*******************************************
'*******************************************
'Album Collection Functions
'*******************************************
Function AddAlbumCollection(ID, Name, HasChildren)
Dim Tree : Set Tree = SDB.MainTree
Dim AlbumCollectionNode : Set AlbumCollectionNode = Tree.CreateNode
AlbumCollectionNode.CustomData = ID
AlbumCollectionNode.Caption = Name
AlbumCollectionNode.IconIndex = 23
AlbumCollectionNode.UseScript = Script.ScriptPath
Tree.AddNode SDB.Objects(KEY_ALBUM_COLLECTION_ROOT_NODE), AlbumCollectionNode, 3
Script.RegisterEvent AlbumCollectionNode, "OnExecMenuItem", "AlbumCollection_OnExecMenuItem"
Script.RegisterEvent AlbumCollectionNode, "OnShowMenuItem", "AlbumCollection_OnShowMenuItem"
Script.RegisterEvent AlbumCollectionNode, "OnCanEditNode", "AlbumCollection_OnCanEditNode"
Script.RegisterEvent AlbumCollectionNode, "OnNodeEditText", "AlbumCollection_OnNodeEditText"
Script.RegisterEvent AlbumCollectionNode, "OnNodeEdited", "AlbumCollection_OnNodeEdited"
Script.RegisterEvent AlbumCollectionNode, "OnNodeDragDrop", "AlbumCollection_OnNodeDragDrop"
Script.RegisterEvent AlbumCollectionNode, "OnFillChildren", "AlbumCollection_OnFillChildren"
Script.RegisterEvent AlbumCollectionNode, "OnFillTracks", "AlbumCollection_OnFillTracks"
AlbumCollectionNode.HasChildren = HasChildren
Set AddAlbumCollection = AlbumCollectionNode
End Function
'*******************************************
'End Album Collection Functions
'*******************************************
'*******************************************
'Album Collection Events
'*******************************************
Sub AlbumCollection_OnFillChildren(AlbumCollectionNode)
AlbumCollectionNode.HasChildren = False
Dim AlbumCollectionID : AlbumCollectionID = AlbumCollectionNode.CustomData
Dim Iter : Set Iter = SDB.Database.OpenSql("SELECT * FROM SpadeAlbumCollectionList WHERE AlbumCollectionID = " & AlbumCollectionID & " ORDER BY AlbumOrder")
While Not Iter.EOF
Dim AlbumNode : Set AlbumNode = AddAlbum(AlbumCollectionNode, Iter.StringByName("ALBUMID"), Iter.StringByName("ALBUM"))
Iter.Next
WEnd
Set Iter = Nothing
End Sub
Sub AlbumCollection_OnFillTracks(AlbumCollectionNode)
Dim AlbumCollectionID : AlbumCollectionID = AlbumCollectionNode.CustomData
Set Trcks = SDB.MainTracksWindow
Trcks.AddTracksFromCustomQuery("SELECT Songs.* FROM Songs INNER JOIN SpadeAlbumCollectionList ON Songs.IDALBUM = AlbumID WHERE SpadeAlbumCollectionList.AlbumCollectionID = " & AlbumCollectionID & " ORDER BY SpadeAlbumCollectionList.AlbumOrder")
Trcks.FinishAdding
End Sub
Function AlbumCollection_OnNodeDragDrop(AlbumCollectionNode, srcNode, SongList, DropType, Test)
If Test Then
AlbumCollection_OnNodeDragDrop = 4
Else
Dim AlbumCollectionExpanded : AlbumCollectionExpanded = AlbumCollectionNode.Expanded
Dim AlbumCollectionID : AlbumCollectionID = AlbumCollectionNode.CustomData
Dim AlbumIndex
For AlbumIndex = 0 To (SongList.Albums.Count - 1)
Dim Album : Set Album = SongList.Albums.Item(AlbumIndex)
Dim Iter : Set Iter = SDB.Database.OpenSql("SELECT COALESCE(MAX(AlbumOrder), 0) as AlbumOrder FROM SpadeAlbumCollectionList WHERE AlbumCollectionID = " & AlbumCollectionID)
Dim AlbumOrder : AlbumOrder = Iter.StringByName("AlbumOrder")
AlbumOrder = AlbumOrder + 1
Set Iter = Nothing
SDB.Database.ExecSql "INSERT INTO SpadeAlbumCollectionList (AlbumCollectionID , AlbumArtist , Album , AlbumOrder , AlbumID ) VALUES (" & AlbumCollectionID & ", """ & Album.Artist.Name & """, """ & Album.Name & """ , " & AlbumOrder & ", " & Album.ID & ")"
Next
AlbumCollection_OnFillChildren AlbumCollectionNode
AlbumCollectionNode.Expanded = AlbumCollectionExpanded
End If
End Function
Function AlbumCollection_OnCanEditNode(AlbumCollectionNode)
AlbumCollection_OnCanEditNode = True
End Function
Function AlbumCollection_OnNodeEditText(AlbumCollectionNode)
AlbumCollection_OnNodeEditText = AlbumCollectionNode.Caption
End Function
Function AlbumCollection_OnNodeEdited(AlbumCollectionNode, NewText)
Dim AlbumCollectionID : AlbumCollectionID = AlbumCollectionNode.CustomData
SDB.Database.ExecSql "UPDATE SpadeAlbumCollections SET Name = """ & NewText & """ WHERE ID = " & AlbumCollectionID
AlbumCollectionNode.Caption = NewText
End Function
Function AlbumCollection_OnShowMenuItem(iItemIndex)
Select Case iItemIndex
Case 5
AlbumCollection_OnShowMenuItem = True
Case Else
AlbumCollection_OnShowMenuItem = False
End Select
End Function
Function AlbumCollection_OnExecMenuItem(iItemIndex)
If iItemIndex = 5 Then
If Not SDB.MainTree.CurrentNode Is Nothing Then
Dim AblumCollectionNode : Set AblumCollectionNode = SDB.MainTree.CurrentNode
Dim AlbumCollectionID : AlbumCollectionID = AblumCollectionNode.CustomData
SDB.Database.ExecSql("DELETE FROM SpadeAlbumCollections WHERE ID = " & AlbumCollectionID)
SDB.MainTree.RemoveNode AblumCollectionNode
End If
AlbumCollection_OnExecMenuItem = True
Else
AlbumCollection_OnExecMenuItem = False
End If
End Function
'*******************************************
'End Album Collection Events
'*******************************************
'*******************************************
'Album Collection Root Functions
'*******************************************
Sub CreateAlbumCollectionRoot
Dim Tree : Set Tree = SDB.MainTree
Dim AlbumCollectionRootNode : Set AlbumCollectionRootNode = Tree.CreateNode
AlbumCollectionRootNode.CustomNodeId = NODEID_ALBUM_COLLECTION_ROOT
AlbumCollectionRootNode.Caption = "Album Collections"
AlbumCollectionRootNode.IconIndex = 10
AlbumCollectionRootNode.UseScript = Script.ScriptPath
AlbumCollectionRootNode.OnFillChildren = "AlbumCollectionRoot_OnFillChildren"
SDB.Objects(KEY_ALBUM_COLLECTION_ROOT_NODE) = AlbumCollectionRootNode
Tree.AddNode Tree.Node_Library, AlbumCollectionRootNode, 1
AlbumCollectionRootNode.HasChildren = True
End Sub
'*******************************************
'End Album Collection Root Functions
'*******************************************
'*******************************************
'Album Collection Root Events
'*******************************************
Sub AlbumCollectionRoot_OnFillChildren(CollectionRootNode)
CollectionRootNode.HasChildren = False
Dim Iter : Set Iter = SDB.Database.OpenSql("SELECT SpadeAlbumCollections.*, COUNT(SpadeAlbumCollectionList.ID) as ChildCount FROM SpadeAlbumCollections LEFT JOIN SpadeAlbumCollectionList ON SpadeAlbumCollections.ID = SpadeAlbumCollectionList.AlbumCollectionID GROUP BY SpadeAlbumCollections.ID")
While Not Iter.EOF
Dim AlbumCollectionNode : Set AlbumCollectionNode = AddAlbumCollection(Iter.StringByName("ID"), Iter.StringByName("NAME"), Iter.StringByName("ChildCount") > 0)
Iter.Next
WEnd
Set Iter = Nothing
End Sub
'*******************************************
'End Album Collection Root Events
'*******************************************
'*******************************************
'Album Collection Menu Function & Events
'*******************************************
Sub CreateAlbumCollectionMenus
Dim AlbumCollectionMenu : Set AlbumCollectionMenu = SDB.UI.AddMenuItem( SDB.UI.Menu_Pop_Tree , -1, 1)
AlbumCollectionMenu.Caption = "Add Album Collection"
AlbumCollectionMenu.IconIndex = 9
AlbumCollectionMenu.UseScript=Script.ScriptPath
AlbumCollectionMenu.OnClickFunc="OnMenuClick_AddAlbumCollection"
AlbumCollectionMenu.Visible = False
SDB.Objects(KEY_ALBUM_COLLECTION_MENU) = AlbumCollectionMenu
End Sub
Sub OnMenuClick_AddAlbumCollection(Item)
Dim NewAlbumName : NewAlbumName = "New Album Collection"
SDB.Database.ExecSql("INSERT INTO SpadeAlbumCollections (Name) VALUES (""" & NewAlbumName & """)")
Dim Iter : Set Iter = SDB.Database.OpenSql("SELECT last_insert_rowid()")
Dim LastID : LastID = Iter.StringByIndex(0)
Dim AlbumCollectionNode : Set AlbumCollectionNode = AddAlbumCollection(LastID, NewAlbumName, False)
Set SDB.MainTree.CurrentNode = AlbumCollectionNode
End Sub
Sub SetVisibleMenus
If Not SDB.MainTree.CurrentNode Is Nothing Then
Dim CurrentNode : Set CurrentNode = SDB.MainTree.CurrentNode
If CurrentNode.CustomNodeId = NODEID_ALBUM_COLLECTION_ROOT Then
SDB.Objects(KEY_ALBUM_COLLECTION_MENU).Visible = True
Else
SDB.Objects(KEY_ALBUM_COLLECTION_MENU).Visible = False
End If
End If
End Sub
'*******************************************
'End Album Collection Menu Function & Events
'*******************************************
Sub OnStartUp()
CreateSystemTables
CreateAlbumCollectionRoot
CreateAlbumCollectionMenus
Script.RegisterEvent SDB, "OnChangedSelection", "SetVisibleMenus"
End Sub