Code: Select all
; dieses Skript wurde geschrieben um mit einem Bose Soundlink Mini II Lautsprecher
; mit der mittleren Taste in MediaMonkey Bewertungen via Bluetooth vorzunehmen.
; Es sollte aber auch mit anderen Bluetooth Geraeten bzw. Tastaturen, welche die (virtuellen) Tasten
; Media_Prev
; bzw.
; Media_Next
; unterstuetzen funktionieren.
; https://autohotkey.com/boards/viewtopic.php?f=10&t=13327 Gerdi
HilfeText=
(
Skript Hilfe
Voraussetzung: MediaMonkey ist installiert, das Geraet ist verbunden
und kann die Taste {Media_Prev} senden. (3-mal kurz hintereinander die mittlere Bose-Taste druecken.)
---------------------------------
. . . Bewertung anheben
---------------------------------
Benutzung:
Waehrend ein Song laeuft, wird mit {Media_Prev} die Bewertung angehoben.
Wenn der Song schon eine Bewertung hat wird beim ersten mal nur die Bewertung ge-beept.
1 Beep enstpricht einem halben *
{Media_Next} beept die aktuelle Song-Bewertung, wechselt (der Standart-
Funktionalitaet entsprechend) zum naechsten und beept dann diesen.
---------------------------------
. . zum naechsten Song
---------------------------------
Eine Umkehrung der Tastenfuktion kann erreicht werden, wenn zuegig die jeweils andere Taste folgt.
Uebertragen auf die mittlere Bose-Taste heist das in symbolisierter Schreibweise:
---------------------------------
. . . . . Bewertung absenken (Tipp: Leere Bewertung wird zu *****)
. . . . . zum vorigen Song
---------------------------------
PS. die Standart-Funktionalitaet Pause / Start wurde nicht angeruehrt
---------------------------------
. Pause / Start (empfohlen bei hohen Bewertungen.)
---------------------------------
Diese Hilfe kann jederzeit uebers Tray-Menue geoeffnet werden.
)
#Persistent
FehlerLog:=false ; bei true erfolgen mehr Logeintraege
WarteAufTastenOption:=2000 ; wer die 2.-Funktionalitaet der Tasten nicht hinbekommt kann mit diesem Parameter spielen
; WarteAufTastenOptionPrev:=0 ; Zeile Aktivieren, um schneller zum naechsten Song zu springen (zurueckspringen wird dabei deaktiviert)
; WarteAufTastenOptionBewertungMinus:=0 ; Zeile Aktivieren, um schneller Bewertungen anzuheben (absenken wird dabei deaktiviert)
LastMedeiaNextTime:=0
DieseMedeiaPrevTime:=0
DieseMedeiaNextTime:=0
LastMedeiaNextTime:=0
if(WarteAufTastenOptionPrev="")
WarteAufTastenOptionPrev:=WarteAufTastenOption ; fuer 2.-Funktionalitaet der Tasten
if(WarteAufTastenOptionBewertungMinus="")
WarteAufTastenOptionBewertungMinus:=WarteAufTastenOption ; fuer 2.-Funktionalitaet der Tasten
LogPath= %A_ScriptDir%\BewertungenViaMediaPrev.txt ; Pfad des Logfiles
IfWinNotExist,ahk_class TFMainWindow
{ ; MM ggf. nachstarten (kann mit Éinfuehrung des Befehls unten MM.ShutdownAfterDisconnect:=false entfallen)
IfExist %LogPath%
{
FileReadLine,MmPath,%LogPath%,1 ; MM-Start-Pfad aus erster Zeile des Logfiles holen
IfExist %MmPath%
{
run, %MmPath% ; MM-Start
sleep 15000
}
}
}
Try
{
MM := ComObjCreate("SongsDB.SDBApplication") ; anlegen/bekannt machen des Com-Objektes ; startet auch falls notwendig Media Monkey
; MM.ShutdownAfterDisconnect
MmVersion:=MM.VersionString ; MediaMonkey-Version lesen
MM.ShutdownAfterDisconnect:=false ; Skriptende zieht MM nicht mit herunter. Naeheres siehe http://www.mediamonkey.com/wiki/index.php/Scripting_Tips_%26_Tricks#Interaction_with_MediaMonkey_from_outside
}
catch,e
gosub MmNichtErreicht ; Fehlerbehandlung
IfNotExist %LogPath% ; Erststart
{
LogUeberschrift:=true
sleep 10000
try
MmPath:=MM.ApplicationPath "MediaMonkey.exe"
catch,e
gosub MmNichtErreicht ; Fehlerbehandlung
FileAppend, %MmPath%`r`n,%LogPath% ; 1. Zeile des Logs wird auch fuer MM-Start verwendet.
gosub SkriptHilfe ; anzeigen der Hilfe
}
FileAppend, %A_Now% Skript-Start: %A_ScriptFullPath% MM-Version=%MmVersion% AHK-Version=%A_AhkVersion% Skript-Version=31.01.2016`r`n,%LogPath% ; Logfile-Eintrag
if LogUeberschrift
FileAppend,`r`nWann Rating vor nach Pfad `r`n`r`n,%LogPath% ; Logfile-Eintrag
; TrayMenue
Menu, tray, add ; Creates a separator line.
Menu, tray, add, Song-Details, ExplorerSelect ; Tray-Menue Eintrag
Menu, tray, add, Log oeffnen, LogOeffnen ; Tray-Menue Eintrag
Menu, tray, add, Skript-Hilfe, SkriptHilfe ; Tray-Menue Eintrag
OnExit, ExitSub
return
; ----------------------------------- Ende Hauptprogramm -------------------------------
ExplorerSelect: ; fuer Menu Song-Infos
try DieserPfad:=MM.Player.CurrentSong.Path ; Pfad des aktuellen Songs holen
catch,e
gosub MMverbinden
; http://www.mediamonkey.com/wiki/index.php/SDBPlayer#ISDBPlayer_objects
Run, properties %DieserPfad% ; Datei-Eigenschaften oeffnen
sleep 400
WinWaitActive,ahk_class #32770,,5
IfWinActive,ahk_class #32770,Allgemein
ControlSend,ahk_parent,{Ctrl Down}{tab}{Ctrl up},ahk_class #32770
sleep 200 ; fuer elegantere Loesung den Reiter Detail zu oeffnen waere ich dankbar.
IfWinActive,ahk_class #32770,Sicherheit
ControlSend,ahk_parent,{Ctrl Down}{tab}{Ctrl up},ahk_class #32770
run, explorer.exe /select`,"%DieserPfad%" ; Explorer mit selektiertem Song oeffnen
return
LogOeffnen: ; Anzeigen der Logdatei
IfExist %LogPath%
run, %LogPath%
else
MsgBox Der Log wurde entfernt.
return
SkriptHilfe: ; Anzeigen der Hilfe
MsgBox %HilfeText%
return
Media_Prev:: ; warten auf Hotkey
LShift & RShift:: ; Alternative direkt am PC
; <TastenWunsch ermitteln>
DieseMedeiaPrevTime:=A_TickCount
if FehlerLog
FileAppend, % A_Now " " A_LineNumber " DieseMedeiaPrevTime -> " DieseMedeiaPrevTime "`r`n",%LogPath%
if(FirstButton="")
{
FirstButton=Media_Prev
if FehlerLog
FileAppend, % A_Now " " A_LineNumber " FirstButton -> " FirstButton "`r`n",%LogPath%
}
else if(FirstButton="Media_Next")
{
if FehlerLog
FileAppend, % A_Now " " A_LineNumber+1 " return -> " "`r`n",%LogPath%
return
}
sleep WarteAufTastenOptionBewertungMinus
if(A_TickCount-DieseMedeiaNextTime<2000 and FirstButton="Media_Prev")
{ ; TastenWunsch Bewertung absenken
; </TastenWunsch ermitteln>
if FehlerLog
FileAppend, % A_Now " " A_LineNumber " BewertungsAdd -> " BewertungsAdd "`r`n",%LogPath%
BewertungsAdd:=-10
SoundBeep,3000,500
}
else
BewertungsAdd:=10 ; Bewertung anheben
try
{
DiesesRating:=MM.Player.CurrentSong.Rating ; Bewertung des aktuellen Songs holen
DieserPfad:=MM.Player.CurrentSong.Path ; Pfad des aktuellen Songs holen
}
catch,e
gosub MMverbinden
If(DiesesRating=-1 or (LastRating=DiesesRating and DieserPfad=LastPfad)) ; Ist Bewertung noch frei?
{
If(DiesesRating=-1 and BewertungsAdd=10)
NeuesRating:=0
else If(DiesesRating=-1 and BewertungsAdd=-10)
NeuesRating:=100
else If(DiesesRating=0 and BewertungsAdd=-10)
NeuesRating:=-1
else
NeuesRating:=DiesesRating+BewertungsAdd ; Neue Bewertung berechnen
if(NeuesRating>100) ; und wieder von vorne
; Empfehlung fuer absichtliches Ueberrunden: Song fuers Bewerten anhalten (mittlere Bose-Taste 1-mal Druecken).
NeuesRating:=0 ; hier kann auch -1 fuer "Unbekannt" eingesetzt werden.
if(NeuesRating<-1) ; sollte nur bei nicht durch 10 teilbaren Bewertungen vorkommen
NeuesRating:=100
try
{
MM.Player.CurrentSong.Rating:=NeuesRating ; Neue Bewertung zwischenspeichern
MM.Player.CurrentSong.WriteTags ; Neue Bewertung schreiben
}
catch,e
gosub MmNichtErreicht ; Fehlerbehandlung
FileAppend, % A_Now " " DiesesRating " -> " NeuesRating " " DieserPfad "`r`n",%LogPath% ; Logeintrag
sleep 1000
try
DiesesRating:=MM.Player.CurrentSong.Rating ; jetztige Bewertung des aktuellen Songs holen
catch,e
gosub MmNichtErreicht ; Fehlerbehandlung
LastRating:=DiesesRating
LastPfad:=DieserPfad
}
else
{
try
LastRating:=MM.Player.CurrentSong.Rating
catch,e
gosub MmNichtErreicht
LastPfad:=DieserPfad
}
sleep 1000
gosub BewertungRueckmelden
FirstButton=
if FehlerLog
FileAppend, % A_Now " " A_LineNumber " FirstButton -> " FirstButton "`r`n",%LogPath%
return
; (2-mal kurz hintereinander die mittlere Bose-Taste druecken)
Media_Next:: ; warten auf Hotkey
; <TastenWunsch ermitteln>
DieseMedeiaNextTime:=A_TickCount
if FehlerLog
FileAppend, % A_Now " " A_LineNumber " DieseMedeiaNextTime -> " DieseMedeiaNextTime "`r`n",%LogPath%
if(FirstButton="")
{
FirstButton=Media_Next
if FehlerLog
FileAppend, % A_Now " " A_LineNumber " FirstButton -> " FirstButton "`r`n",%LogPath%
}
else if(FirstButton="Media_Prev")
{
if FehlerLog
FileAppend, % A_Now " " A_LineNumber+1 " return -> " "`r`n",%LogPath%
return
}
sleep WarteAufTastenOptionPrev
if(A_TickCount-DieseMedeiaPrevTime<2000 and FirstButton="Media_Next")
{ ; </TastenWunsch ermitteln>
try
LastPfad:=MM.Player.CurrentSong.Path
catch,e
gosub MMverbinden
SoundBeep,5000,400
if FehlerLog
FileAppend, % A_Now " " A_LineNumber " MM.Player.Previous -> " "`r`n",%LogPath%
try
{
MM.Player.Previous
sleep 1000
if(LastPfad=MM.Player.CurrentSong.Path)
MM.Player.Previous
sleep 900
DiesesRating:=MM.Player.CurrentSong.Rating
}
catch,e
gosub MmNichtErreicht
gosub BewertungRueckmelden
FirstButton=
if FehlerLog
FileAppend, % A_Now " " A_LineNumber " FirstButton -> " FirstButton "`r`n",%LogPath%
return
}
try
{
DiesesRating:=MM.Player.CurrentSong.Rating ; Bewertung des aktuellen Songs holen
DieserPfad:=MM.Player.CurrentSong.Path ; Pfad des aktuellen Songs holen
}
catch,e
{
gosub MMverbinden
return
}
LastPfad:=DieserPfad ; Pfad merken
gosub BewertungRueckmelden
sleep 500
try
MM.Player.Next ; Naechster Song
catch,e
gosub MmNichtErreicht
gosub BewertungRueckmelden
LastRating:=
LastMedeiaNextTime:=A_TickCount
FirstButton=
if FehlerLog
FileAppend, % A_Now " " A_LineNumber " FirstButton -> " FirstButton "`r`n",%LogPath%
return
BewertungRueckmelden:
try
DiesesRating:=MM.Player.CurrentSong.Rating ; Bewertung des aktuellen Songs holen
If(DiesesRating=0) ; 0-Bewertung rueckmelden
SoundBeep ,250,900
Beeps:=Round(DiesesRating/10)
Loop % Beeps ; Bewertung rueckmelden
{
SoundBeep,1000,400
sleep 500
}
return
MMverbinden:
Try
{
MM := ComObjCreate("SongsDB.SDBApplication") ; anlegen/bekannt machen des Com-Objektes ; startet auch falls notwendig Media Monkey
sleep 9000
MmVersion:=MM.VersionString ; MediaMonkey-Version lesen
MM.ShutdownAfterDisconnect:=false
}
catch,e
gosub MmNichtErreicht
return
MmNichtErreicht:
MsgBox % "Skript-Ende`r`n`r`nMediaMonkey konnte nicht vom Skript angesprochen werden!`r`nDetails: Zeile" e.line " " e.message " " e.extra
gosub ExitSub
return
ExitSub:
MM:="" ; Com-Object bei Skriptende freigeben
ExitApp
Ueber eine kurze Rueckmeldung, wenn das Skript genutzt wird (eventuell auch mit Bluetooth Kopfhoerer), wuerde ich mich freuen.