The SQL query could also be used in other scripts to retrieve classification text for individual songs.
The dialog box is hacked directly from MagicNodes 1.3 (thanks/sorry Pablo, post a comment if you have any concerns). Just read the comments at the top of the code for how to use it.
Code: Select all
'BackupClassificationToCustom3.vbs by W. Kyle White
' A simple script that runs SQL queries for all songs selected and puts the
' specified classification's text value into the Custom3 tag
' The interface component is entirely hacked from Pablo's excellent MagicNodes script -
' http://students.washington.edu/~shmerkin/magic_nodes
'
'Usage
' *Use at your own risk
' Select a song or songs and then run the script, it will request that you
' specify the classification to copy to custom3, write the name as it appears in
' MediaMonkey's classification node (not case sensitive)
' The text for that classification will be placed into custom3 of each of the
' songs
' i.e. type in "mood" without the quotes to put mood names
' (such as "mellow" and "comatose") into the custom3 field
' Note that this does not write the ID3 tags directly
'
'Place this into the scripts.ini
'-------------------------------------------------
' [BackupClassificationToCustom3]
' FileName=BackupClassificationToCustom3.vbs
' ProcName=BackupClassificationToCustom3
' Order=6
' DisplayName=Copy Specified Classification -> Custom3
' Description=Copy Specified Classification -> Custom3
' Language=VBScript
' ScriptType=0
'-------------------------------------------------
Function Cond(test, a, b) ' Returns a if test evaluates to true, b otherwise
If test Then
Cond = a
Else
Cond = b
End If
End Function
Function CurrentVersion
CurrentVersion = 100 * SDB.VersionHi + SDB.VersionLo
End Function
Function SkinnedInputBox(text, caption, input)
Dim Form, Label, Edt, btnOk, btnCancel, modalResult
' Create the window to be shown
Set Form = SDB.UI.NewForm
Form.Common.SetRect 100, 100, 360, 130
Form.BorderStyle = 2 ' Resizable
Form.FormPosition = 4 ' Screen Center
Form.SavePositionName = "Remember position"
Form.Caption = caption
' Create a button that closes the window
Set Label = SDB.UI.NewLabel(Form)
Label.Caption = text
Label.Common.Left = 5
Label.Common.Top = 10
Set Edt = SDB.UI.NewEdit(Form)
Edt.Common.Left = Label.Common.Left
Edt.Common.Top = Label.Common.Top + Label.Common.Height + 5
Edt.Common.Width = Form.Common.Width - 20
Edt.Common.ControlName = "Edit1"
Edt.Common.Anchors = 1+2+4 'Left+Top+Right
Edt.Text = Input
' Create a button that closes the window
Set BtnOk = SDB.UI.NewButton(Form)
BtnOk.Caption = "&OK"
BtnOk.Common.Top = Edt.Common.Top + Edt.Common.Height + 10
BtnOk.Common.Hint = "OK"
BtnOk.Common.Anchors = 4 ' Right
BtnOk.UseScript = Script.ScriptPath
If currentVersion() >= 204 Then BtnOk.Default = True
BtnOk.ModalResult = 1
Set BtnCancel = SDB.UI.NewButton(Form)
BtnCancel.Caption = "&Cancel"
BtnCancel.Common.Left = Form.Common.Width - BtnCancel.Common.Width - 15
BtnOK.Common.Left = BtnCancel.Common.Left - BtnOK.Common.Width - 10
BtnCancel.Common.Top = BtnOK.Common.Top
BtnCancel.Common.Hint = "Cancel"
BtnCancel.Common.Anchors = 4 ' Right
BtnCancel.UseScript = Script.ScriptPath
If currentVersion() >= 204 Then BtnCancel.Cancel = True
BtnCancel.ModalResult = 2
modalResult = Form.showModal
SkinnedInputBox = Cond(modalResult=1, Edt.Text, "")
End Function
Set ClassificationDict = CreateObject("Scripting.Dictionary")
With ClassificationDict
.Add "TEMPO", "1"
.Add "MOOD", "2"
.Add "OCCASION", "3"
.Add "QUALITY", "4"
End With
Sub BackupClassificationToCustom3
' Define variables
Dim list, iter, itm, i, tmp, classification
classification = UCase(SkinnedInputBox("Enter the classification to back up", "Define Classification", "MOOD"))
if (classification = "") then
Exit Sub
End If
' Get list of selected tracks from MediaMonkey
Set list = SDB.SelectedSongList
If list.count=0 Then
Set list = SDB.AllVisibleSongList
End If
' Process all selected tracks
For i=0 To list.count-1
Set itm = list.Item(i)
Set Iter = SDB.Database.OpenSQL("SELECT Lists.TextData FROM Songs,AddSongInfoInt,Lists WHERE Lists.idListType = "&ClassificationDict.Item(classification)&" AND Lists.Id = AddSongInfoInt.intData AND AddSongInfoInt.idSong = "&itm.ID)
' Swap the fields
itm.Custom3 = Iter.StringByName("TextData")
' Update the changes in DB
itm.UpdateDB
Iter.next
Next
End Sub