Hi,
ich habe folgenden Code geschrieben. (Es wird ei CDDB-UDF benötigt):
Spoiler anzeigen
#include <CDDB.au3>
#include <Array.au3>
While 1
;Auslesen der CD-Laufwerke auf dem Rechner
$drives = DriveGetDrive('CDROM')
;Durchlaufen aller gefunden CD-Laufwerke
For $i = 1 To $drives[0]
;Prüfen ob eine CD im Laufwerk ist
If DriveStatus($drives[$i]) = 'READY' Then
;Laufwerk in dem die Musik-CD ist
$abfrage = _CDDBCreateQuery($drives[$i])
;Abfrage wird durchgeführt
$sDatabase = _FreeDBRecvDB($abfrage)
;Prüfen ob mehr als ein Treffer gefunden wurde
If StringInStr($sDatabase, "211 Found inexact matches") Or StringInStr($sDatabase, "210 Found exact matches") Then
;Aufsplitten der gefundene Treffer in einem Array. Es werden von FreeDB nur die ersten 5 Treffer zurückgegeben
$treffer = StringSplit($sDatabase, @CRLF, 3)
;Durchlaufen des Arrays
For $x = 1 To 5 Step 1
;Aufschlüssel der Abfrage
$aQuery = StringSplit($abfrage, " ")
;Aufschlüssel des Treffers
$diskid = StringSplit($treffer[$x], " ")
;Ersetzen der Id in der Abfrage durch die neue id aus den Treffern
$read = "cddb read " & $diskid[1] & " " & $diskid[2]
Local $hSocket
TCPSend($hSocket, $read & @CRLF)
$sDatabase = __TCPRecv2($hSocket)
;Prüfen ob mehr als ein Treffer gefunden wurde
If StringInStr($sDatabase, "211 Found inexact matches") Or StringInStr($sDatabase, "210 Found exact matches") Then
Else
[/autoit] [autoit][/autoit] [autoit];Speichern der CD-Daten
_FreeDBSplit($sDatabase)
ExitLoop (3)
EndIf
Next
EndIf
EndIf
Next
WEnd
Func _FreeDBSplit($sDatabase)
;Aufschlüssel der FreeDB rückgabe in einzelne Arrayelemente
Local $ergebnis = StringSplit($sDatabase, @CRLF, 3)
;Auslesen der Interpreten und des Albumtitels
Local $gruppealbum = _diskinfo("DTITLE", $ergebnis)
$gruppealbum = StringSplit($gruppealbum, " / ", 3)
;Speicherort der Musikdaten
DirCreate(@ScriptDir & "\" & $gruppealbum[0])
Local $diskspeicher = @ScriptDir & "\" & $gruppealbum[0] & "\" & $gruppealbum[1] & ".ini"
;Auslesen der Gesamtmusiklänge
Local $gesamtlaenge = _ArraySearch($ergebnis, "# Disc length: ", 0, 0, 0, 1)
$gesamtlaenge = StringReplace($ergebnis[$gesamtlaenge], "# Disc length: ", "")
;Speichern der CD-ID
IniWrite($diskspeicher, "Info", "id", _diskinfo("DISCID", $ergebnis))
;Speichern des Interpreten
IniWrite($diskspeicher, "Info", "interpret", $gruppealbum[0])
;Speichern das Albumnames
IniWrite($diskspeicher, "Info", "album", $gruppealbum[1])
;Speichern des Erscheinungsjahres
IniWrite($diskspeicher, "Info", "jahr", _diskinfo("DYEAR", $ergebnis))
;Speichern des Genres
IniWrite($diskspeicher, "Info", "genre", _diskinfo("DGENRE", $ergebnis))
;Speichern der Gesamtmusiklänge
IniWrite($diskspeicher, "Info", "laenge", $gesamtlaenge)
;Auslesen des Musiktitel
Local $titelid = _ArrayFindAll($ergebnis, "TTITLE", 0, 0, 0, 1)
;Auslesen des Titeloffsets
Local $offsetsstart = _ArraySearch($ergebnis, "# Track frame offsets:", 0, 0, 0, 1)
Local $offsetid = $offsetsstart
[/autoit] [autoit][/autoit] [autoit];Durchlauf des Musiktitelaaray
For $titel In $titelid
$offsetid += 1
Local $offsetend = $offsetid + 1
;Auslesen des Endoffsets zum passenden Startoffsets
$offetend = StringReplace($ergebnis[$offsetend], "# ", "")
;Beim letzten Titel wird als Endoffsets die Musikgesamtdauer gesetzt
If @extended = 0 Then
$offetend = $gesamtlaenge * 75
EndIf
;Auslesen des Titels
Local $name = StringSplit($ergebnis[$titel], "=", 2)
;Berechnen der Titellänge
Local $titellaenge = Floor(($offetend - StringReplace($ergebnis[$offsetid], "# ", "")) / 75)
;Speichern von Titelnamen und Titellänge
IniWrite($diskspeicher, "Titel", $name[1], $titellaenge)
Next
EndFunc ;==>_FreeDBSplit
;Funktion zum aussplitten der FreeDB-Daten
Func _diskinfo($typ, $ergebnis)
Local $return = StringReplace($ergebnis[_ArraySearch($ergebnis, $typ, 0, 0, 0, 1)], $typ & "=", "")
Return $return
EndFunc ;==>_diskinfo
Nun wollte ich noch den Inhalt der While in eine Funktion machen, doch wenn ich das hier mache:
Spoiler anzeigen
#include <CDDB.au3>
#include <Array.au3>
While 1
_test()
WEnd
Func _test()
;Auslesen der CD-Laufwerke auf dem Rechner
$drives = DriveGetDrive('CDROM')
;Durchlaufen aller gefunden CD-Laufwerke
For $i = 1 To $drives[0]
;Prüfen ob eine CD im Laufwerk ist
If DriveStatus($drives[$i]) = 'READY' Then
;Laufwerk in dem die Musik-CD ist
$abfrage = _CDDBCreateQuery($drives[$i])
;Abfrage wird durchgeführt
$sDatabase = _FreeDBRecvDB($abfrage)
;Prüfen ob mehr als ein Treffer gefunden wurde
If StringInStr($sDatabase, "211 Found inexact matches") Or StringInStr($sDatabase, "210 Found exact matches") Then
;Aufsplitten der gefundene Treffer in einem Array. Es werden von FreeDB nur die ersten 5 Treffer zurückgegeben
$treffer = StringSplit($sDatabase, @CRLF, 3)
;Durchlaufen des Arrays
For $x = 1 To 5 Step 1
;Aufschlüssel der Abfrage
$aQuery = StringSplit($abfrage, " ")
;Aufschlüssel des Treffers
$diskid = StringSplit($treffer[$x], " ")
;Ersetzen der Id in der Abfrage durch die neue id aus den Treffern
$read = "cddb read " & $diskid[1] & " " & $diskid[2]
Local $hSocket
TCPSend($hSocket, $read & @CRLF)
$sDatabase = __TCPRecv2($hSocket)
;Prüfen ob mehr als ein Treffer gefunden wurde
If StringInStr($sDatabase, "211 Found inexact matches") Or StringInStr($sDatabase, "210 Found exact matches") Then
Else
[/autoit] [autoit][/autoit] [autoit];Speichern der CD-Daten
_FreeDBSplit($sDatabase)
ExitLoop (3)
EndIf
Next
EndIf
EndIf
Next
EndFunc ;==>_test
Func _FreeDBSplit($sDatabase)
;Aufschlüssel der FreeDB rückgabe in einzelne Arrayelemente
Local $ergebnis = StringSplit($sDatabase, @CRLF, 3)
;Auslesen der Interpreten und des Albumtitels
Local $gruppealbum = _diskinfo("DTITLE", $ergebnis)
$gruppealbum = StringSplit($gruppealbum, " / ", 3)
;Speicherort der Musikdaten
DirCreate(@ScriptDir & "\" & $gruppealbum[0])
Local $diskspeicher = @ScriptDir & "\" & $gruppealbum[0] & "\" & $gruppealbum[1] & ".ini"
;Auslesen der Gesamtmusiklänge
Local $gesamtlaenge = _ArraySearch($ergebnis, "# Disc length: ", 0, 0, 0, 1)
$gesamtlaenge = StringReplace($ergebnis[$gesamtlaenge], "# Disc length: ", "")
;Speichern der CD-ID
IniWrite($diskspeicher, "Info", "id", _diskinfo("DISCID", $ergebnis))
;Speichern des Interpreten
IniWrite($diskspeicher, "Info", "interpret", $gruppealbum[0])
;Speichern das Albumnames
IniWrite($diskspeicher, "Info", "album", $gruppealbum[1])
;Speichern des Erscheinungsjahres
IniWrite($diskspeicher, "Info", "jahr", _diskinfo("DYEAR", $ergebnis))
;Speichern des Genres
IniWrite($diskspeicher, "Info", "genre", _diskinfo("DGENRE", $ergebnis))
;Speichern der Gesamtmusiklänge
IniWrite($diskspeicher, "Info", "laenge", $gesamtlaenge)
;Auslesen des Musiktitel
Local $titelid = _ArrayFindAll($ergebnis, "TTITLE", 0, 0, 0, 1)
;Auslesen des Titeloffsets
Local $offsetsstart = _ArraySearch($ergebnis, "# Track frame offsets:", 0, 0, 0, 1)
Local $offsetid = $offsetsstart
[/autoit] [autoit][/autoit] [autoit];Durchlauf des Musiktitelaaray
For $titel In $titelid
$offsetid += 1
Local $offsetend = $offsetid + 1
;Auslesen des Endoffsets zum passenden Startoffsets
$offetend = StringReplace($ergebnis[$offsetend], "# ", "")
;Beim letzten Titel wird als Endoffsets die Musikgesamtdauer gesetzt
If @extended = 0 Then
$offetend = $gesamtlaenge * 75
EndIf
;Auslesen des Titels
Local $name = StringSplit($ergebnis[$titel], "=", 2)
;Berechnen der Titellänge
Local $titellaenge = Floor(($offetend - StringReplace($ergebnis[$offsetid], "# ", "")) / 75)
;Speichern von Titelnamen und Titellänge
IniWrite($diskspeicher, "Titel", $name[1], $titellaenge)
Next
EndFunc ;==>_FreeDBSplit
;Funktion zum aussplitten der FreeDB-Daten
Func _diskinfo($typ, $ergebnis)
Local $return = StringReplace($ergebnis[_ArraySearch($ergebnis, $typ, 0, 0, 0, 1)], $typ & "=", "")
Return $return
EndFunc ;==>_diskinfo
kommt immer dieser Fehler und ich finde einfach nicht den Grund dafür:
Zitat: ==> Array variable subscript badly formatted.:
Local $return = StringReplace($ergebnis[_ArraySearch($ergebnis, $typ, 0, 0, 0, 1)], $typ & "=", "")
Local $return = StringReplace($ergebnis[^ ERROR
Edit: Ok hab den Fehler gefunden. Problem war das $hSocket.