Page 1 of 1

MediaMonkey-Bewertungen via Bluetooth

Posted: 24 Jan 2016, 17:55
by Gerdi

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 Geräten bzw. Tastaturen, welche die (virtuellen) Tasten
; 	Media_Prev
; bzw.
;	Media_Next
; unterstützen funktionieren.

; Voraussetzung:
; Das Gerät ist verbunden und kann {Media_Prev} senden. (3-mal kurz hintereinander die mittlere Bose-Taste drücken 
; im Folgenden mit Media_Prev abgekürzt.)
; Benutzung:
; Während ein Song läuft, 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 zum nächsten und Beept dann diesen.

MM := ComObjCreate("SongsDB.SDBApplication") ; anlegen/bekannt machen des Com-Objektes

Media_Prev::						; warten auf Hotkey
DiesesRating:=MM.Player.CurrentSong.Rating	; Bewertung des aktuellen Songs holen
DieserPfad:=MM.Player.CurrentSong.Path		; Pfad des aktuellen Songs holen
If(DiesesRating=-1 or (LastRating=DiesesRating and DieserPfad=LastPfad))	; Ist Bewertung noch frei?
{
	If(DiesesRating=-1)
		NeuesRating:=0				; wer die Bewertung 0-Sterne weglassen möchte kann hier NeuesRating:=10 einsetzen.
	else
		NeuesRating:=DiesesRating+10			; Neue Bewertung berechnen
	if(NeuesRating>100)				; und wieder von vorne	### eingefuegt 25.01.2016 ###
; Empfehlung fuer absichtliches Ueberrunden: Song fuers Bewerten anhalten (mittlere Bose-Taste 1-mal Druecken).
		NeuesRating:=0				; hier kann auch -1 fuer "Unbekannt" eingesetzt werden. ### eingefuegt 25.01.2016 ###
	MM.Player.CurrentSong.Rating:=NeuesRating	; Neue Bewertung zwischenspeichern
	MM.Player.CurrentSong.WriteTags			; Neue Bewertung schreiben
	sleep 1000
	DiesesRating:=MM.Player.CurrentSong.Rating	; jetztige Bewertung des aktuellen Songs holen
	LastRating:=DiesesRating
	LastPfad:=DieserPfad
}
else
{
	LastRating:=DiesesRating
	LastPfad:=DieserPfad
}
sleep 1000
gosub BewertungRueckmelden
return

; (2-mal kurz hintereinander die mittlere Bose-Taste drücken)  ; dieses Unterprogramm ist optional
Media_Next::							; warten auf Hotkey
DiesesRating:=MM.Player.CurrentSong.Rating	; Bewertung des aktuellen Songs holen
DieserPfad:=MM.Player.CurrentSong.Path		; Pfad des aktuellen Songs holen
LastPfad:=DieserPfad						; Pfad merken
gosub BewertungRueckmelden
sleep 500
MM.Player.Next							; Nächster Song
gosub BewertungRueckmelden
LastRating:=
return

BewertungRueckmelden:
DiesesRating:=MM.Player.CurrentSong.Rating	; Bewertung des aktuellen Songs holen
If(DiesesRating=0)						; 0-Bewertung rückmelden
	SoundBeep ,250,900

Beeps:=Round(DiesesRating/10)
Loop % Beeps							; Bewertung rückmelden
{
	SoundBeep,1000,400
	sleep 500
}
return
Viel Spass
Gerdi

Re: MediaMonkey-Bewertungen via Bluetooth

Posted: 31 Jan 2016, 15:14
by Gerdi
Habe noch ein paar Kleinigkeiten zugefuegt:
- aktuelle Song Bewertung absenken
- zum vorigen Song
- Logfile
- Fehlerbehandlung
- Hilfe

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.
Gerdi