Musicplayer Playlist mit .ini [DENKANSTOSS]

05/24/2013 20:01 .yorliK#1
n'Abend,

Ich hatte vor 3Monaten meinen Musicplayer fertiggestellt, nun habe ich diesen wieder ausgepackt und würde gerne eine Playlist für diesen erstellen. Nur fehlt mir, jetzt der Denkanstoss wie das nun richtig geht.

Erklärung..
Ich habe mir gedacht, das wenn man mit dem Programmbutton "Playlist" eine Playlist erstellen will, wird ein FileOpenDialog geöffnet und dort kann man die Dateien auswählen und diese werden dann in eine Playlist.ini geschrieben. Wenn man jetzt Play drückt wählt er Automatisch das erste Lied dort aus und wechselt wenn dieses zu Ende ist, zum nächsten..startet neu(falls zuende). Falls keine Playlist erstellt werden soll und nur eine Datei gehört wird, soll er diese auch in die Playlist.ini schreiben ohne eine Playlist und unendlich wiederholen. Durch den Button DeletePlaylist löscht man die ganze Playlist wieder.

Habs bisjetzt soweit das er eine Playlist.ini erstellt und diese dann auch wieder löscht.

Hier mal mein Script:

Hoffe auf ein paar Denkanstösse oder vielleicht sogar Lösungsvorschläge.

#Jede gute Antwort = Thanks#

Mfg
Kilroy.
05/24/2013 22:26 WJNeeson#2
- Wenn Playlist ausgewählt ist, dann:
- - Lese erstes Lied aus Playlist
- - Wenn Lied zu Ende, dann:
- - Lese zweites Lied aus Playlist... etc...
- Wenn keine Playlist sondern nur ein Lied ausgewählt ist, dann:
- - Spiele Lied ab
- - Wenn Lied zu Ende ist, dann wiederhole Lied

Wenn du das einzelnde Lied auch in eine Playlist.ini schreiben willst kannst du eine Abfrage machen, die überprüft wieviele Einträge es in der Datei gibt (1 Eintrag = einzelndes Lied; Mehr als 1 Eintrag = Playlist)

#edit
Eigentlich bräuchtest du nichtmal eine .ini du kannst auch einfach alle .mp3 Dateipfade in einer .txt untereinander auflisten
05/25/2013 04:18 BladeTiger12#3
Habe deine Playlist erstellen lassen, deine Progressbar gefixxt und andere Sachen gefixxt.
Die Übersicht auch etwas gebessert.
Nur du musst einstellen: Playlist abspielen
05/25/2013 07:43 YatoDev#4
Eine .ini ist dafuer wenig geignet nimm entweder eine eigene endung oder .txt und schreib dort alles untereinander rein dann wenn lied fertig ist zeile + 1 rechnen bis die maximale anzahl an zeilen erreicht ist . wenn diese ueberschritten ist wieder bei 0 anfangen
05/25/2013 16:09 BladeTiger12#5
Playlist abspielen geht jetzt auch über den Button Play:
Code:
#RequireAdmin
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <ProgressConstants.au3>
#include <SliderConstants.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Sound.au3>
#include <Array.au3>
#include <Misc.au3>

If _Singleton("Musicplayer", 1) = 0 Then
	Exit
EndIf

#region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Mp3 Player", 345, 144, -1, -1)
$Button1 = GUICtrlCreateButton(".mp3", 136, 8, 59, 25)
$Button2 = GUICtrlCreateButton("Play", 8, 8, 59, 25)
$Button3 = GUICtrlCreateButton("Stop", 72, 8, 59, 25)
$Label1 = GUICtrlCreateLabel("Keine Datei ausgewählt.", 8, 40, 327, 33)
GUICtrlSetColor(-1, 0x00FF00)
GUICtrlSetBkColor(-1, 0x000000)
$Progress1 = GUICtrlCreateProgress(8, 80, 326, 9)
$Slider1 = GUICtrlCreateSlider(8, 96, 326, 29)
$Label3 = GUICtrlCreateLabel("low", 13, 123, 20, 17)
$Label4 = GUICtrlCreateLabel("middle", 152, 123, 34, 17)
$Label5 = GUICtrlCreateLabel("high", 312, 123, 24, 17)
$Button4 = GUICtrlCreateButton("Playlist", 200, 8, 59, 25)
$Button5 = GUICtrlCreateButton("Delete Playlist", 264, 8, 75, 25)
GUISetState(@SW_SHOW)
#endregion ### END Koda GUI section ###

Global $hSound, $lol, $Lenght, $Pos, $Open, $Playlistplay, $PlayYet = 0, $PlayOn = 0, $Txt

Dim $ButtonSend = False

AdlibRegister("_Play", 50)

While Sleep(10)
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

		Case $Button1 ;Öffnet FileDialog zum Auswählen einer einzigen Datei
			_OpenMusik()

		Case $Button2 ;Wandelt Play in Pause und umgekehrt Stopt und Played die Musik
			_StartStop()

		Case $Button3 ;Beendet die Musik ganz
			_StopMusik()

		Case $Button4 ;Soll FIleOpenDialog öffnen und man muss dann alle Dateien auswählen und er schreibt die dann in die Playlist.ini
			_CreatePlayList()

		Case $Button5 ;Löscht die Playlist.ini
			_DeletPlaylist()

		Case $Slider1 ;Regelt die Lautstärke
			$Read = GUICtrlRead($Slider1)
			SoundSetWaveVolume($Read)
	EndSwitch
WEnd

Func _PlayPlaylist()
	If $PlayOn <> 1 Then

		$Lied = IniRead(@ScriptDir & "\Playlist.ini", $Playlistplay, "Lied" & $PlayYet, "")
		If $Lied = "" Then
			$PlayYet = 0
			$Lied = IniRead(@ScriptDir & "\Playlist.ini", $Playlistplay, "Lied" & $PlayYet, "")
		EndIf
		$Open = _SoundOpen($Lied)
		$hSound = _SoundPlay($Open,0)
		$PlayOn = 1
	Else
		$Aktuelle_Position = _SoundPos($Open, 2)
		$Maximale_Laenge = _SoundLength($Open, 2)
		If $Aktuelle_Position >= $Maximale_Laenge Then
			$PlayYet += 1
			$PlayOn = 0
			_Play()
		EndIf
	EndIf
EndFunc

Func _StartStop()
	If $ButtonSend Then
		$Input = "Mp3"
	Else
		$Input = InputBox("Abspielen", "Gebe: 'Playlist' oder 'Mp3' ein um eine Playlist oder nur ein Lied abzuspielen!")
		If @error Then
			MsgBox(64, "Information", "Der Vorgang wurde abgebrochen!")
			Return 0
		EndIf
	EndIf

	If $Input = "Mp3" Then
		$ButtonSend = Not $ButtonSend
		If $ButtonSend Then
			GUICtrlSetData($Button2, "Pause")
			_SoundPlay($Open)
		Else
			GUICtrlSetData($Button2, "Play")
			_SoundPause($Open)
		EndIf
	ElseIf $Input = "Playlist" Then
		$ReadSections = IniReadSectionNames(@ScriptDir & "\Playlist.ini")
		If UBound($ReadSections) -1 <= 0 Then
			MsgBox(64, "Information", "Keine Playlist gefunden!")
			Return 0
		Else
			For $iSec = 1 To UBound($ReadSections) -1
				$Txt &= $ReadSections[$iSec] & @CRLF
			Next

			$Play = InputBox("Name", "Gib den Playlistname ein: " & $Txt)
			If @error Or $Play = "" Then
				MsgBox(64, "Information", "Abgebrochen oder Leer!")
				Return 0
			EndIf

			If StringInStr($Txt, $Play) Then
				$Playlistplay = $Play
				$PlayYet = 0
				AdlibRegister("_PlayPlaylist",1000)
			Else
				MsgBox(64, "Information",  "Playlist nicht gefunden!")
				Return 0
			EndIf
		EndIf
	Else
		MsgBox(64, "Information", "Falsche eingabe!")
	EndIf
EndFunc   ;==>_StartStop

Func _StopMusik()
	_SoundStop($Open)
	_SoundClose($Open)
EndFunc   ;==>_StopMusik

Func _OpenMusik()
	$Path = FileOpenDialog("", @UserProfileDir & "\Music", "(*.mp3)", 1)
	GUICtrlSetData($Label1, $Path)
	$Open = _SoundOpen($Path)
EndFunc   ;==>_OpenMusik

Func _DeletPlaylist()
	If FileExists(@ScriptDir & "\Playlist.ini") Then
		FileDelete(@ScriptDir & "\Playlist.ini")
		MsgBox(64, "Information", "Playlist.ini erfolgreich gelöscht!")
	Else
		MsgBox(64, "Information", "Playlist.ini kann nicht gelöscht werden!")
	EndIf
EndFunc   ;==>_DeletPlaylist

Func _Play()
	$Maximale_Laenge = _SoundLength($Open, 2) ;Lässt den Balken so Laden das wenn die Musik zu Ende ist der Balken voll ist.
	$Aktuelle_Position = _SoundPos($Open, 2)
	$Fortschritt = Int($Aktuelle_Position * 100 / $Maximale_Laenge)

	GUICtrlSetData($Progress1, $Fortschritt)
EndFunc   ;==>_Play

Func _CreatePlayList()
	$Files = FileOpenDialog("Wähle die Lieder aus!", "", "MP3 (*.mp3)", 1 + 4, ".mp3")
	If @error Then
		MsgBox(64, "Information", "Abgebrochen!")
		Return 0
	EndIf

	While True
		$rtn = 0
		$fSplit = StringSplit($Files, "|", 2)

		If UBound($fSplit) - 1 < 2 Then
			MsgBox(64, "Information", "Eine Playlist hat mindestens 2 Lieder!")
			Return 0
		EndIf

		$InputName = InputBox("Name", "Gib den Name der Playlist ein!")
		If @error Or $InputName = "" Then
			MsgBox(64, "Information" , "Abgebrochen oder Leer!")
			Return 0
		EndIf

		If FileExists(@ScriptDir & "\Playlist.ini") Then

			$Sections = IniReadSectionNames(@ScriptDir & "\Playlist.ini")
			For $i = 1 To UBound($Sections)-1
				If $InputName = $Sections[$i] Then
					MsgBox(64, "Information", "Der Name ist bereits vorhanden!")
					$rtn = 1
				EndIf
			Next
		EndIf

		If $rtn <> 1 Then
			ExitLoop
		EndIf
	WEnd

	For $i = 1 To UBound($fSplit) - 1
		IniWrite(@ScriptDir & "\Playlist.ini", $InputName, "Lied" & $i - 1, $fSplit[0] & "\" & $fSplit[$i])
	Next

	MsgBox(64, "Information", "Playlist erfolgreich erstellt!")
EndFunc   ;==>_CreatePlayList

Func WM_NCHITTEST($hWnd, $iMsg, $iwParam, $ilParam) ;Return
	If ($hWnd = $Form1) And ($iMsg = $WM_NCHITTEST) Then Return $HTCAPTION
EndFunc   ;==>WM_NCHITTEST
05/25/2013 16:54 .yorliK#6
Vielen Dank!
aber jetzt blick ich gar nicht mehr durch das Script xD, muss ich mal schauen wie du das gemacht hast.. stören tut mich nur die ständige Abfrage von Playlist oder Mp3 abspielen auch wenn man nur Pause gedrückt hat.. Könnte man das nich auch mit ner Checkbox machen wenn die checked is Playlist abspielen wenn nicht, dann nur das einzel ausgewählte Lied abspiele.

Außerdem spielt der gleich das nächste Lied ab wenn man Stop drückt und auf Play und dann Cancel drückt bzw. Pause kann man dann gar nicht drücken..

Hab in deinem Script schon die Änderung vorgenommen das er den Namen der gerade von der Playlist abspielt anzeigt und die Checkbox1 in drin.

Script:

#namentliche Nennung im Script is dir sicher.

Mfg
Kilroy.
05/25/2013 17:20 BladeTiger12#7
In dem Script könnte man noch viel ändern.
Klar geht das mit einer Checkbox nur da müsstest du änderungen vornehmen.
Das ganze spiel wohl gleich das nächste Lied ab weil bei der PlayPlaylistfunktion
abgefragt wir ob die Lied länge gleich zur Maximalen Länge ist.

Code:
Func _PlayPlaylist() 
    If $PlayOn <> 1 Then 

        $Lied = IniRead(@ScriptDir & "\Playlist.tke", $Playlistplay, "Lied" & $PlayYet, "") 
        If $Lied = "" Then 
            $PlayYet = 0 
            $Lied = IniRead(@ScriptDir & "\Playlist.tke", $Playlistplay, "Lied" & $PlayYet, "") 
        EndIf 
        $Open = _SoundOpen($Lied) 
        $hSound = _SoundPlay($Open,0) 
        $PlayOn = 1 
        GUiCtrlSetData($Label1, $Lied) 
    Else 
        $Aktuelle_Position = _SoundPos($Open, 2) 
        $Maximale_Laenge = _SoundLength($Open, 2) 
        If $Aktuelle_Position >= $Maximale_Laenge Then 
            $PlayYet += 1 
            $PlayOn = 0 
            _Play() 
        EndIf 
    EndIf 
EndFunc
Du musst dafür bei der Stop-funktion AdlibUnRegister einbauen:
Code:
Func _StopMusik()
        AdlibUnRegister("_PlayPlaylist")
	_SoundStop($Open)
	_SoundClose($Open)
EndFunc   ;==>_StopMusik
05/25/2013 18:04 .yorliK#8
Ok habe angefangen aber irgendwie drückt er mir immer ein Error auf(Playlist nicht gefunden) wenn ich versuche, die meldung mit dem namen eingeben, wegzumachen
PHP Code:
Func _StartStop()
    

    If 
GuICtrlRead($CheckBox1) = $GUI_UNCHECKED Then
        $ButtonSend 
Not $ButtonSend
        
If $ButtonSend Then
            GUICtrlSetData
($Button2"Pause")
            
_SoundPlay($Open)
        Else
            
GUICtrlSetData($Button2"Play")
            
_SoundPause($Open)
        EndIf
    ElseIf 
GuICtrlRead($CheckBox1) = $GUI_CHECKED Then
        $ReadSections 
IniReadSectionNames(@ScriptDir "\Playlist.tke")
        If 
UBound($ReadSections) -<= 0 Then
            MsgBox
(64"Information""Keine Playlist gefunden!")
            Return 
0
        
Else
            For 
$iSec 1 To UBound($ReadSections) -1
                $Txt 
&= $ReadSections[$iSec] & @CRLF
            Next

            $Play 
= ("Playlist" $Txt)
  
            If 
StringInStr($Txt$PlayThen
                $Playlistplay 
$Play
                $PlayYet 
0
                AdlibRegister
("_PlayPlaylist",1000)
            Else
                
MsgBox(64"Information",  "Playlist nicht gefunden!")
                Return 
0
            
EndIf
        EndIf
    EndIf
EndFunc   ;==>_StartStop 
Weißt du/jemand wieso er mir da den Error(Playlist nicht gefunden) drückt?

Mfg
Kilroy.
05/25/2013 18:17 BladeTiger12#9
Weil in $Txt stehen alle Sectionen der .ini
Sprich in $Txt steht ( beispiel ):
Section1
Section2
Section3
Section4

Und hier abgefragt wird:
Code:
If StringInStr($Txt, $Play) Then
       $Playlistplay = $Play
       $PlayYet = 0
       AdlibRegister("_PlayPlaylist",1000)
Else
       MsgBox(64, "Information",  "Playlist nicht gefunden!")
       Return 0
EndIf
Ob in $Txt das eingegebene existiert.

Lösung(denke ich mal) :
Code:
 $Play = ("Playlist" & $Txt)
zu
Code:
$Play = $Txt
ändern
Code:
Func _StartStop()
    

    If GuICtrlRead($CheckBox1) = $GUI_UNCHECKED Then
        $ButtonSend = Not $ButtonSend
        If $ButtonSend Then
            GUICtrlSetData($Button2, "Pause")
            _SoundPlay($Open)
        Else
            GUICtrlSetData($Button2, "Play")
            _SoundPause($Open)
        EndIf
    ElseIf GuICtrlRead($CheckBox1) = $GUI_CHECKED Then
        $ReadSections = IniReadSectionNames(@ScriptDir & "\Playlist.tke")
        If UBound($ReadSections) -1 <= 0 Then
            MsgBox(64, "Information", "Keine Playlist gefunden!")
            Return 0
        Else
            For $iSec = 1 To UBound($ReadSections) -1
                $Txt &= $ReadSections[$iSec] & @CRLF
            Next

            $Play = $Txt
  
            If StringInStr($Txt, $Play) Then
                $Playlistplay = $Play
                $PlayYet = 0
                AdlibRegister("_PlayPlaylist",1000)
            Else
                MsgBox(64, "Information",  "Playlist nicht gefunden!")
                Return 0
            EndIf
        EndIf
    EndIf
EndFunc   ;==>_StartStop
05/25/2013 18:32 .yorliK#10
Mhh
Es wird doch hier der Name verlangt oder nich?
$Play = InputBox("Name", "Gib den Playlistname ein: " & $Txt)

Das heißt wenn ich es in
$Play = ("Playlist" & $Txt) dann müsste es doch funktioniert, tuts aber nich...
05/25/2013 18:33 BladeTiger12#11
Eben nicht.
Schau dir mal über MsgBox(0, "" , $Txt) das an.
Du siehst was da drinne steht.
05/25/2013 18:43 .yorliK#12
Da steht nirgends
MsgBox(0, "" , $Txt)

Welche Zeile wäre das?

EDIT: achja er sagt jetzt nicht mehr Playlist nicht gefunden, aber er startet sie nicht...
05/25/2013 18:45 BladeTiger12#13
Code:
Func _StartStop()
    

    If GuICtrlRead($CheckBox1) = $GUI_UNCHECKED Then
        $ButtonSend = Not $ButtonSend
        If $ButtonSend Then
            GUICtrlSetData($Button2, "Pause")
            _SoundPlay($Open)
        Else
            GUICtrlSetData($Button2, "Play")
            _SoundPause($Open)
        EndIf
    ElseIf GuICtrlRead($CheckBox1) = $GUI_CHECKED Then
        $ReadSections = IniReadSectionNames(@ScriptDir & "\Playlist.tke")
        If UBound($ReadSections) -1 <= 0 Then
            MsgBox(64, "Information", "Keine Playlist gefunden!")
            Return 0
        Else
            For $iSec = 1 To UBound($ReadSections) -1
                $Txt &= $ReadSections[$iSec] & @CRLF
            Next

            $Play = $Txt

            MsgBox(64, "Info", $Txt)
  
            If StringInStr($Txt, $Play) Then
                $Playlistplay = $Play
                $PlayYet = 0
                AdlibRegister("_PlayPlaylist",1000)
            Else
                MsgBox(64, "Information",  "Playlist nicht gefunden!")
                Return 0
            EndIf
        EndIf
    EndIf
EndFunc   ;==>_StartStop
05/25/2013 18:51 .yorliK#14
Er zeigt mir das an:
[Only registered and activated users can see links. Click Here To Register...]

er zeigt die Meldung(Playlist nicht gefunden) nicht mehr an, nur startet er die Playlist nicht..
05/25/2013 19:00 BladeTiger12#15
Ich bin off schreib mich um 22 Uhr wenn du noch da bist in Skype an:
MrBladeTiger12.

Ich helf dir dann weiter.
Hast du überhaupt in deiner Playlist.ini eine Section also:
[Section]
Lied0=
Lied1=

stehen?