Latest Beta release V2.0.0.110917.
The current version of the script is optimised for MediaMonkey 4 and above. It will run on MediaMonkey 3 but the options page will not display correctly.
The next official release is close. At this stage the most outstanding issue is the lag, however as there have been so many positive changes to this point, it is about time for an official release. MonkeySqueezers will find it very useful.
1. MonkeySqueeze now communicates with NAS drives using Linux and running Squeezebox Server (Logitech Media Server)!
Thanks goes to Katteman for the addressing code. At this stage only ReadyNAS and Synology drives have been tested and are known to work. Katteman and I need feedback from people with other drives to see if the settings need to be tweaked.
2. I have revised the options page again, including settings for addressing of NAS drives and rewriting some instructions and tooltips.
1. Major: Lag or buffering between MediaMonkey and the Squeezebox system. Work ongoing with options being investigated. Always on the lookout for someone to assist with the issue.
2. Minor: There are two issues which can occur when re-enabling the connection. The music will not play on LMS the first time play is pressed or music plays on LMS when the enable button is pressed. In both cases stop the track and press play again to return to normal.
Copy the script to Notepad and save as MonkeySqueeze.vbs to one one of the following locations:
C:\Program Files\MediaMonkey\Scripts\Auto or C:\Program Files (x86)\MediaMonkey\Scripts\Auto
Code: Select all
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'
' MonkeySqueeze V2-0-0-110917Beta
'
' ORIGINAL AUTHOR: Todd Nemeth/revel
' DATE STARTED: 26.09.2007
'
' ADDITIONAL AUTHORS: Baz, Big_Berny, Peke, trixmoto, debacle, mccstumble, Gingernut63, booblers, Katteman
' UPDATE DATE: XX.XX.20XX
'
' COMMENT:
' - You will also need Logitech Media Server (Squeezebox Server) installed and running
' - Optional: Install and run SqueezePlay or SoftSqueeze
' - After installation the settings page for this script is located at Tools > Options > MonkeySqueeze
'
'%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
Option Explicit
Public SqueezeBoxSocket
Public ManualTrackChange
Const ForReading = 1, ForWriting = 2, ForAppending = 8
Dim onMonkeySqueezeIcon
Dim offMonkeySqueezeIcon
'**************************************************************
Sub OnStartup
Dim ind, Mnu
Dim UI : Set UI = SDB.UI
onMonkeySqueezeIcon = SDB.RegisterIcon("Scripts\Auto\sbon.ico", 0)
If onMonkeySqueezeIcon < 0 Then
onMonkeySqueezeIcon = 74 'unlocked icon if it doesn't exist
End If
offMonkeySqueezeIcon = SDB.RegisterIcon("Scripts\Auto\sboff.ico", 0)
If offMonkeySqueezeIcon < 0 Then
offMonkeySqueezeIcon = 75 'locked icon if it doesn't exist
End If
Set Mnu = UI.AddMenuItem( UI.Menu_TbStandard, 0, 0)
Mnu.Caption = "MonkeySqueeze"
Mnu.UseScript = Script.ScriptPath
Mnu.OnClickFunc = "SyncToggle"
Mnu.IconIndex = onMonkeySqueezeIcon
Mnu.Hint = "Enable/Disable MonkeySqueeze"
Set SDB.Objects("MonkeySqueezeIcon") = Mnu 'save a reference to it so we can change the icon later.
If SDB.IniFile.BoolValue("MonkeySqueeze","SyncToggle") = True Then
Call registerEvents
Mnu.IconIndex = onMonkeySqueezeIcon
Else
Mnu.IconIndex = offMonkeySqueezeIcon
End If
ind = SDB.UI.AddOptionSheet("MonkeySqueeze",Script.ScriptPath,"InitSheet","SaveSheet",-2)
'InitSqueezeBox
ManualTrackChange = True
End Sub
'**************************************************************
Sub InitSheet(Sheet)
Dim Panel1, Panel2, Edit1, Panel3, Btn1, Edit2, Panel4, Edit3, Edit4, Edit5, Checkbox1, Checkbox2
Set Panel1 = SDB.UI.NewGroupBox(Sheet)
Panel1.Common.SetRect 10,10,450,75
Panel1.Caption = "MonkeySqueeze v2.0.0.110917Beta"
With SDB.UI.NewLabel(Panel1)
.Common.SetRect 15,20,440,40
.Caption = "This script allows MediaMonkey to play music on a Squeezebox System"& vbNewLine _
& vbNewLine _
& "Enable/Disable MonkeySqueeze on the toolbar main menu"
End With
Set Btn1 = SDB.UI.NewButton(Panel1)
Btn1.Common.SetRect 360,40,65,25
Btn1.Caption = "User Guide"
Btn1.Common.Hint = "Click and then open MonkeySqueeze_UserGuide.pdf"
Script.RegisterEvent Btn1, "OnClick", "UserGuide"
Set Panel2 = SDB.UI.NewGroupBox(Sheet)
Panel2.Common.SetRect 10,95,450,125
Panel2.Caption = "Logitech Media Server IP Address and HTTP Port"
With SDB.UI.NewLabel(Panel2)
.Multiline = True
.Common.SetRect 15,20,420,50
.Caption = "Open the LMS (Squeezebox Server) Web Control page > Settings > Information tab and find the Server IP Address, e.g. 192.168.0.102 and enter below. The default HTTP Port number is 9000. See the user guide if you wish to change it"
End With
With SDB.UI.NewLabel(Panel2)
.Common.SetRect 15,74,70,20
.Caption = "IP Address:"
End With
Set Edit1 = SDB.UI.NewEdit(Panel2)
Edit1.Common.ControlName = "SqueezeBoxIP"
Edit1.Common.SetRect 75,70,95,25
Edit1.Text = SDB.IniFile.StringValue("SqueezeBox","IP")
If Edit1.Text = "" Then
Edit1.Text = "XXX.XXX.XXX.XXX"
SDB.IniFile.StringValue("SqueezeBox","IP") = "XXX.XXX.XXX.XXX"
End If
Edit1.Common.Hint = "Copy and paste the LMS IP Address here"
With SDB.UI.NewLabel(Panel2)
.Common.SetRect 215,74,70,20
.Caption = "HTTP Port No:"
End With
Set Edit2 = SDB.UI.NewEdit(Panel2)
Edit2.Common.ControlName = "SqueezeBoxPort"
Edit2.Common.SetRect 287,70,40,25
Edit2.Text = SDB.IniFile.StringValue("SqueezeBox","Port")
If Edit2.Text = "" Then
Edit2.Text = "9000"
SDB.IniFile.StringValue("SqueezeBox","Port") = "9000"
End If
Edit2.Common.Hint = "HTTP port default is 9000. View the port number in LMS: Web Control page > Settings > Information tab. It can be changed, see user guide for more details"
With SDB.UI.NewLabel(Panel2)
.Common.SetRect 15,100,420,20
.Caption = "Press OK and restart the music for the changes to take effect."
End With
Set Panel3 = SDB.UI.NewGroupBox(Sheet)
Panel3.Common.SetRect 10,230,450,125
Panel3.Caption = "Squeezebox Device MAC Address"
With SDB.UI.NewLabel(Panel3)
.Multiline = True
.Common.SetRect 15,20,420,60
.Caption = "The MAC address of the device (Touch, SqueezePlay, etc...) you wish to connect to. Open the LMS Web Control page > Settings page > Information tab and find the relevant device. Enter the MAC address below, e.g. z1:6d:4g:40:1f:32"
End With
With SDB.UI.NewLabel(Panel3)
.Common.SetRect 15,74,70,20
.Caption = "Device MAC Address:"
End With
Set Edit3 = SDB.UI.NewEdit(Panel3)
Edit3.Common.ControlName = "SqueezeBoxMAC"
Edit3.Common.SetRect 122,70,110,25
Edit3.Text = SDB.IniFile.StringValue("SqueezeBox","MAC")
If Edit3.Text = "" Then
Edit3.Text = "xx:xx:xx:xx:xx:xx"
SDB.IniFile.StringValue("SqueezeBox","MAC") = "xx:xx:xx:xx:xx:xx"
End If
Edit3.Common.Hint = "Copy and paste the MAC address here. Use lowercase text for maximum compatibility"
With SDB.UI.NewLabel(Panel3)
.Common.SetRect 15,100,420,20
.Caption = "Press OK and restart the music for the changes to take effect."
End With
Set Panel4 = SDB.UI.NewGroupBox(Sheet)
Panel4.Common.SetRect 10,365,450,165
Panel4.Caption = "Logitech Media Server on a NAS using Linux"
With SDB.UI.NewLabel(Panel4)
.Multiline = True
.Common.SetRect 15,20,420,60
.Caption = "MonkeySqueeze communicates with LMS installed on a NAS however changes must be made to the format of the main music folder address. e.g. X:\Music to /media/Music"
End With
Set CheckBox1 = SDB.UI.NewCheckBox(Panel4)
CheckBox1.Common.SetRect 60,53,260,20
CheckBox1.Checked = SDB.IniFile.BoolValue("NAS","Enabled")
CheckBox1.Common.ControlName = "EnableNAS"
CheckBox1.Common.Hint = SDB.Localize("Select if using LMS on a Linux NAS device this includes Synology units. See user guide for more details")
CheckBox1.Caption = SDB.Localize("Enable")
Script.RegisterEvent CheckBox1.Common, "OnClick", "NASClick"
Set CheckBox2 = SDB.UI.NewCheckBox(Panel4)
CheckBox2.Common.SetRect 260,53,260,20
CheckBox2.Checked = SDB.IniFile.BoolValue("Synology","Enabled")
CheckBox2.Common.ControlName = "EnableSynology"
CheckBox2.Common.Hint = SDB.Localize("Select if the NAS is made by Synology or if communications with LMS don't work")
CheckBox2.Caption = SDB.Localize("Synology NAS")
With SDB.UI.NewLabel(Panel4)
.Common.SetRect 15,84,70,20
.Caption = "MediaMonkey Music Folder:"
End With
Set Edit4 = SDB.UI.NewEdit(Panel4)
Edit4.Common.ControlName = "MediaMonkeyMF"
Edit4.Common.SetRect 150,80,160,25
Edit4.Text = SDB.IniFile.StringValue("MediaMonkey","MF")
If Edit4.Text = "" Then
Edit4.Text = "X:\____\____"
SDB.IniFile.StringValue("MediaMonkey","MF") = "X:\_____\_____"
End If
Edit4.Common.Hint = "Copy from MediaMonkey > File > Add/Rescan Folders or the Path column in the music details section"
With SDB.UI.NewLabel(Panel4)
.Common.SetRect 15,114,70,20
.Caption = "Logitech Media Server Music Folder:"
End With
Set Edit5 = SDB.UI.NewEdit(Panel4)
Edit5.Common.ControlName = "SqueezeboxMF"
Edit5.Common.SetRect 190,110,180,25
Edit5.Text = SDB.IniFile.StringValue("Squeezebox","MF")
If Edit5.Text = "" Then
Edit5.Text = "/_____/_____"
SDB.IniFile.StringValue("SqueezeBox","MF") = "/_____/_____"
End If
Edit5.Common.Hint = "Copy and Paste from: LMS Web Page > Settings > Basic Settings tab > Music Folder"
With SDB.UI.NewLabel(Panel4)
.Common.SetRect 15,140,420,20
.Caption = "Press OK and restart the music for the changes to take effect."
End With
CheckBox2.Common.Enabled = CheckBox1.Checked
Edit4.Common.Enabled = CheckBox1.Checked
Edit5.Common.Enabled = CheckBox1.Checked
End Sub
'**************************************************************
Sub NASClick(ChB)
Dim ChB2, Edt4, Edt5
Set ChB2 = ChB.Common.TopParent.Common.ChildControl("EnableSynology")
Set Edt4 = ChB.Common.TopParent.Common.ChildControl("MediaMonkeyMF")
Set Edt5 = ChB.Common.TopParent.Common.ChildControl("SqueezeboxMF")
ChB2.Common.Enabled = ChB.Checked
Edt4.Common.Enabled = ChB.Checked
Edt5.Common.Enabled = ChB.Checked
End Sub
'**************************************************************
Sub SaveSheet(Sheet)
SDB.IniFile.StringValue("SqueezeBox","IP") = Sheet.Common.ChildControl("SqueezeBoxIP").Text
SDB.IniFile.StringValue("SqueezeBox","Port") = Sheet.Common.ChildControl("SqueezeBoxPort").Text
SDB.IniFile.StringValue("SqueezeBox","MAC") = Sheet.Common.ChildControl("SqueezeBoxMAC").Text
SDB.IniFile.BoolValue("NAS","Enabled") = Sheet.Common.ChildControl( "EnableNAS").Checked
SDB.IniFile.BoolValue("Synology","Enabled") = Sheet.Common.ChildControl( "EnableSynology").Checked
SDB.IniFile.StringValue("MediaMonkey","MF") = Sheet.Common.ChildControl("MediaMonkeyMF").Text
SDB.IniFile.StringValue("Squeezebox","MF") = Sheet.Common.ChildControl("SqueezeboxMF").Text
End Sub
'**************************************************************
Sub UserGuide
On Error Resume Next
Dim OF, FolderToOpen
Set OF = CreateObject("Shell.Application")
FolderToOpen = sdb.ScriptsPath & "Auto\"
OF.Explore FolderToOpen
Set OF = Nothing
End Sub
'**************************************************************
'Sub InitSqueezeBox
'On Error Resume Next
'Set SqueezeBoxSocket = CreateObject("Socket.TCP")
'SqueezeBoxSocket.DoTelnetEmulation = True
'SqueezeBoxSocket.TelnetEmulation = "TTY"
'SqueezeBoxSocket.Host = SDB.IniFile.StringValue("SqueezeBox","IP") & ":9090"
'SqueezeBoxSocket.Open
'End Sub
'**************************************************************
Function SqueezeBoxMode
On Error Resume Next
SqueezeBoxMode = ""
'SqueezeBoxSocket.SendLine "mode ?"
'SqueezeBoxMode = SqueezeBoxSocket.GetLine
End Function
'**************************************************************
Sub Event_OnPlay
Dim strRetVal, TrackPath
TrackPath = CheckPath(SDB.Player.CurrentSong)
If SDB.IniFile.BoolValue("Synology","Enabled") = True Then
TrackPath = Replace(TrackPath,"\","/")
End If
If SDB.IniFile.BoolValue("NAS","Enabled") = True Then
TrackPath = Replace(TrackPath,SDB.IniFile.StringValue("MediaMonkey","MF"),SDB.IniFile.StringValue("SqueezeBox","MF"))
End If
If ManualTrackChange = True Then
slimRequest(formatCommand("""stop"""))
slimRequest(formatCommand("""playlist"", ""play"", """ + perlEscape(TrackPath) + """"))
Else
slimRequest(formatCommand("""playlist"", ""add"", """ + perlEscape(TrackPath) + """"))
ManualTrackChange = True
End If
End Sub
'**************************************************************
Function SyncToggle( itm )
Dim TrackPath, Mnu
TrackPath = CheckPath(SDB.Player.CurrentSong)
If SDB.IniFile.BoolValue("Synology","Enabled") = True Then
TrackPath = Replace(TrackPath,"\","/")
End If
If SDB.IniFile.BoolValue("NAS","Enabled") = True Then
TrackPath = Replace(TrackPath,SDB.IniFile.StringValue("MediaMonkey","MF"),SDB.IniFile.StringValue("SqueezeBox","MF"))
End If
If SDB.IniFile.BoolValue("MonkeySqueeze","SyncToggle") = False Then
SDB.IniFile.BoolValue("MonkeySqueeze","SyncToggle") = True
Call registerEvents
itm.IconIndex = SDB.RegisterIcon("Scripts\Auto\sbon.ico", 0)
'slimRequest(formatCommand("""playlist"", ""play"", """ + perlEscape(TrackPath) + """"))
slimRequest(formatCommand("""time"", """ + CStr(SDB.Player.PlaybackTime*0.001 + 1) + """")) 'added 1 second to try to make up for net and lookup lag
Else
Call unregisterEvents
slimRequest(formatCommand("""stop"""))
SDB.IniFile.BoolValue("MonkeySqueeze","SyncToggle") = False
itm.IconIndex = SDB.RegisterIcon("Scripts\Auto\sboff.ico", 0)
End If
End Function
'**************************************************************
Function CheckPath(SongValue)
If Left(SongValue.Path,1) = "?" Then
If SongValue.Cached Then
CheckPath = SongValue.CachedPath
Else
CheckPath = SongValue.Path
End If
Else
CheckPath = SongValue.Path
End If
End Function
'**************************************************************
Sub Event_OnStop
slimRequest(formatCommand("""stop"""))
End Sub
'**************************************************************
Sub Event_OnShutdown
On Error Resume Next
slimRequest(formatCommand("""stop"""))
End Sub
'**************************************************************
Sub Event_OnPause
If SDB.Player.IsPaused Then
slimRequest(formatCommand("""pause"""))
Else
slimRequest(formatCommand("""play"""))
End If
End Sub
'**************************************************************
Sub Event_OnSeek
Dim strRetVal, TrackPath
strRetVal = SqueezeBoxMode
TrackPath = CheckPath(SDB.Player.CurrentSong)
If SDB.IniFile.BoolValue("Synology","Enabled") = True Then
TrackPath = Replace(TrackPath,"\","/")
End If
If SDB.IniFile.BoolValue("NAS","Enabled") = True Then
TrackPath = Replace(TrackPath,SDB.IniFile.StringValue("MediaMonkey","MF"),SDB.IniFile.StringValue("SqueezeBox","MF"))
End If
If InStr(1,strRetval,"mode stop") > 0 Then
slimRequest(formatCommand("""playlist"", ""play"", """ + perlEscape(TrackPath) + """"))
End If
slimRequest(formatCommand("""time"", """ + CStr(SDB.Player.PlaybackTime*0.001) + """"))
End Sub
'**************************************************************
Function slimRequest(params)
'slimRequest accepts pre-formatted parameter string, returns string of the response'
'logme " >> slimRequest: Begin with " + params
Dim url, prog, objHTTP, str
Dim cnt : cnt = 0
url = "http://" + SDB.IniFile.StringValue("SqueezeBox","IP") + ":" + SDB.IniFile.StringValue("SqueezeBox","Port") + "/jsonrpc.js"
'Dim prog : Set prog = SDB.Objects("LoadXMLBar")
Set prog = SDB.Progress
Set objHTTP = CreateObject("Microsoft.XMLHTTP")
Call objHTTP.open("POST", url, True)
objHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
objHTTP.setRequestHeader "X-Requested-With", "XMLHttpRequest"
objHTTP.setRequestHeader "User-Agent", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1"
objHTTP.send(params)
While (objHTTP.readyState < 4) And (cnt < 300)
Call SDB.Tools.Sleep(100)
SDB.ProcessMessages
cnt = cnt+1
If prog.Terminate Then
cnt = 300
End If
Wend
If objHTTP.readyState < 4 Then
Set slimRequest = Nothing
Else
str = objHTTP.responseText
slimRequest = str
End If
End Function
'*************************************************************
'This is is a JSON RPC call - We're directly calling functions in the Slim::Request module in Perl. See here:
'http://svn.slimdevices.com/repos/slim/7.5/trunk/server/Slim/Control/Request.pm
'the addDispatch section tells you how to use the commands and what the RPC module is looking for in terms of formatting
Function formatCommand(str1)
Dim str2
str2 = "{""id"":1,""method"":""slim.request"",""params"":[""" + SDB.IniFile.StringValue("SqueezeBox","MAC") + """,[" + str1 + "]]}"
formatCommand = str2
End Function
'*************************************************************
'borrowed from a teknojunky - if you want the popups add them to this and then just call logme
Sub logme(msg)
Dim fso, logf
On Error Resume Next
Set fso = CreateObject("Scripting.FileSystemObject")
Set logf = fso.OpenTextFile(Script.ScriptPath&".log",ForAppending,True)
logf.WriteLine Now() & ": " & msg
Set fso = Nothing
Set logf = Nothing
End Sub
'*************************************************************
'Perl is taking the JSON strings directly into variables - "\" is a special character in perl to escape the following string
'wherever we have a "\" we need it to be "\\" in anything that goes to Perl (ie: anything that goes to Squeezebox)
Function perlEscape(str1)
str1 = Replace(str1, "\", "\\")
perlEscape = str1
End Function
'*************************************************************
Sub registerEvents
Call Script.RegisterEvent(SDB,"OnPlay","Event_OnPlay")
Call Script.RegisterEvent(SDB,"OnPause","Event_OnPause")
Call Script.RegisterEvent(SDB,"OnStop","Event_OnStop")
Call Script.RegisterEvent(SDB,"OnSeek","Event_OnSeek")
End Sub
'*************************************************************
Sub unregisterEvents
Script.UnregisterEvents SDB
End Sub
'*************************************************************
'These are what the full JSON strings look like that need to be sent to slimRequest()
'formatRequest() fills in the first part and all you have to do is pick the RPC commands from http://svn.slimdevices.com/repos/slim/7.5/trunk/server/Slim/Control/Request.pm
'Note: there are cleaner ways of doing this - but this is quick and dirty. It just means that you have to use a lot of """ and etc in vbscript.
'This entire script is much easier to write in jscript but I don't know jscript at all so, shrug.
'{"id":1,"method":"slim.request","params":["00:04:20:17:06:xx",["status","-",1,"tags:cgABbehldiqtyrSuoKLN"]]}
'{"id":1,"method":"slim.request","params":["00:04:20:17:06:xx",["status","-",1,"tags:uB"]]}
'{"id":1,"method":"slim.request","params":["00:04:20:17:06:xx",["playlist","index",28]]}
'{"id":1,"method":"slim.request","params":["00:04:20:17:06:xx",["pause"]]}
'{"id":1,"method":"slim.request","params":["00:04:20:17:06:xx",[""playlist"", ""play"", ""D:\\MP3\\filename.mp3""]]}
'You can do ANYTHING you can do from the web interface via this RPC engine because you are directly calling the methods in Perl
'so you could add whole playlists and etc see the docs. Sky's the limit.