Skript zum Auslesen der Inhalte eines Verzeichnisses und Weitergabe in eine Textdatei

  • Hallo zusammen,


    ich hab mal wieder ein Problem und weiß nicht, wie ich es angehen soll.

    Also,

    ich möchte ein Skript erstellen, mit dem ich die Titel von MP3-Dateien, die in einem bestimmten Verzeichnis liegen, auslesen und in einer Textdatei speichern. Der Pfad zum Verzeichnis muss nicht definiert werden. Das Skript soll sich im gleichen Verzeichnis befinden, wie die MP3-Dateien und von dort gestartet werden.

    Leider habe ich keine Idee, wie ich das umsetzen kann.

    Schon mal Danke für Eure Hilfe und Anregungen.


    Gruß Tom

    • Offizieller Beitrag
    Spoiler anzeigen
    [autoit]

    #Include <File.au3>
    #Include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $SongLength = 85, $songCounted=0
    Global $directory = FileSelectFolder("Ordner auswählen aus dem die MP3-Dateien zu einer Playlist umgewandelt werden sollen: ", "", 4, "d:") & "\"

    [/autoit] [autoit][/autoit] [autoit]

    Global $FileList = _FileListToArray($directory, '*.mp3')

    [/autoit] [autoit][/autoit] [autoit]

    If (Not IsArray($FileList)) and (@error = 1) Then
    MsgBox(0, "", "No Files\Folders Found.")
    Exit
    EndIf
    $file = FileOpen(@DesktopDir & '\Playlist_' & @MDAY & '_' & @MON & '_' & @YEAR & '.txt', 2 + 8)

    [/autoit] [autoit][/autoit] [autoit]

    If $file = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    ; Headline
    FileWriteLine($file, 'Nr.' & " | " & 'Song ' & "| " & 'Duration')
    FileWriteLine($file, '-------------------------------------------------------------------------------------------------------')

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($FileList) - 1
    If StringLen($FileList[$i]) >= $SongLength Then
    $songCounted = StringLeft($FileList[$i], $SongLength)
    FileWriteLine($file, StringFormat('%0.3d' ,$i) & " | " & $FileList[$i] & " | " & _GetExtProperty($directory & $FileList[$i], 21))
    Else
    $FileList[$i] = fullfill($SongLength, $FileList[$i], ' ')
    FileWriteLine($file, StringFormat('%0.3d' ,$i) & " | " & $FileList[$i] & " | " & _GetExtProperty($directory & $FileList[$i], 21))
    EndIf
    Next
    FileWriteLine($file, '-------------------------------------------------------------------------------------------------------')
    MsgBox(64, 'Info', 'Die Playlist wurde in' & @CRLF & @CRLF & _
    @DesktopDir & '\Playlist_' & @MDAY & '_' & @MON & '_' & @YEAR & '.txt' & @CRLF & @CRLF & "gespeichert.")
    FileClose($file)

    [/autoit] [autoit][/autoit] [autoit]

    Func _GetExtProperty($sPath, $iProp)
    Local $iExist, $sFile, $sDir, $oShellApp, $oDir, $oFile, $aProperty, $sProperty
    $iExist = FileExists($sPath)
    If $iExist = 0 Then
    SetError(1)
    Return 0
    Else
    $sFile = StringTrimLeft($sPath, StringInStr($sPath, "\", 0, -1))
    $sDir = StringTrimRight($sPath, (StringLen($sPath) - StringInStr($sPath, "\", 0, -1)))
    $oShellApp = ObjCreate("shell.application")
    $oDir = $oShellApp.NameSpace ($sDir)
    $oFile = $oDir.Parsename ($sFile)
    If $iProp = -1 Then
    Local $aProperty[35]
    For $i = 0 To 34
    $aProperty[$i] = $oDir.GetDetailsOf ($oFile, $i)
    Next
    Return $aProperty
    Else
    $sProperty = $oDir.GetDetailsOf ($oFile, $iProp)
    If $sProperty = "" Then
    Return 0
    Else
    Return $sProperty
    EndIf
    EndIf
    EndIf
    EndFunc ;==>_GetExtProperty

    [/autoit] [autoit][/autoit] [autoit]

    ; ----------------------------------------------------------------------------
    ; Author: Thorsten Meger
    ; Script Function: Func fullfill
    ; ----------------------------------------------------------------------------

    [/autoit] [autoit][/autoit] [autoit]

    Func fullfill($maxLength, $string, $fullFillChar)
    ; $maxLength = maximum string size
    ; $fullFillChar = char to fullfill the string
    While 1
    If StringLen($string) < $maxLength Then
    $string &= $fullFillChar
    ContinueLoop
    EndIf
    ExitLoop
    WEnd
    Return $string
    EndFunc ;==>fullfill

    [/autoit]

    Probiers mal aus :)

    Mega

  • Hallo,

    und vielen Dank für die schnelle Arbeit.

    Das ist genau das, was ich gesucht habe.

    Beide Lösungen funktionieren.

    Das ist genau das, was ich mir als Hilfe bei der Erstellung von Playlists vorgesetllt habe. Vielen Dank dafür.


    Das einzige Problem ist, dass bei MP3-Dateien, die fortlaufend nummeriert sind, die Reihenfolge durcheinander ist.


    Beispiel mit einer Textdatei, die mit dem Skript von Xenobiologist erstellt wurde:


    Nr. | Song | Duration
    -------------------------------------------------------------------------------------------------------
    001 | F--_Title_01_Chapter 1.mp3 | 00:01:36
    002 | F--_Title_01_Chapter 10.mp3 | 00:13:45
    003 | F--_Title_01_Chapter 11.mp3 | 00:02:51
    004 | F--_Title_01_Chapter 12.mp3 | 00:08:01
    005 | F--_Title_01_Chapter 13.mp3 | 00:04:35
    006 | F--_Title_01_Chapter 14.mp3 | 00:07:00
    007 | F--_Title_01_Chapter 15.mp3 | 00:03:25
    008 | F--_Title_01_Chapter 16.mp3 | 00:03:27
    009 | F--_Title_01_Chapter 17.mp3 | 00:07:30
    010 | F--_Title_01_Chapter 18.mp3 | 00:07:47
    011 | F--_Title_01_Chapter 19.mp3 | 00:15:05
    012 | F--_Title_01_Chapter 2.mp3 | 00:04:01
    013 | F--_Title_01_Chapter 20.mp3 | 00:05:02
    014 | F--_Title_01_Chapter 3.mp3 | 00:01:33
    015 | F--_Title_01_Chapter 4.mp3 | 00:04:50
    016 | F--_Title_01_Chapter 5.mp3 | 00:06:42
    017 | F--_Title_01_Chapter 6.mp3 | 00:07:20
    018 | F--_Title_01_Chapter 7.mp3 | 00:05:34
    019 | F--_Title_01_Chapter 8.mp3 | 00:05:51
    020 | F--_Title_01_Chapter 9.mp3 | 00:11:25
    -------------------------------------------------------------------------------------------------------


    Also nach 1 kommt 11- 19, dann erst 2 usw. Im Skript von Oscar tritt der gleiche Effekt auf.

    Kann man das noch anpassen?


    Gruß Tom

    • Offizieller Beitrag

    Hi,

    hier mal Bsp:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    #include <File.au3>

    [/autoit] [autoit][/autoit] [autoit]

    ; Testdaten

    [/autoit] [autoit][/autoit] [autoit]

    ;~ For $i = 1 To 20
    ;~ FileWrite(FileOpen(@ScriptDir & '\F--_Title_01_Chapter ' & $i & '.mp3', 1), '')
    ;~ Next

    [/autoit] [autoit][/autoit] [autoit]

    Global $FileList = _FileListToArray(@ScriptDir, '*.mp3')

    [/autoit] [autoit][/autoit] [autoit]

    If (Not IsArray($FileList)) And (@error = 1) Then
    MsgBox(0, "", "No Files\Folders Found.")
    Exit
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    Global $FileList_sort[UBound($FileList)][2]

    [/autoit] [autoit][/autoit] [autoit]

    For $i = 1 To UBound($FileList_sort, 1) - 1
    $FileList_sort[$i][0] = $FileList[$i]
    $FileList_sort[$i][1] = Int(StringRegExpReplace($FileList[$i], '.* |\.mp3', ''))
    Next
    _ArrayDisplay($FileList_sort)
    _ArraySort($FileList_sort, 0, 0, 0, 1)
    _ArrayDisplay($FileList_sort)

    [/autoit]

    Mega

  • Hallo,

    Danke für die Anregungen.

    Da Beruf und Familie mich im Moment stark beanspruchen, komme ich in den nächsten Tage kaum dazu, mich um Autoit zu kümmern.

    Ich werde nachberichten.

    @ Oscar

    Normalerweise bekommen die Dateien beim auslesen eine 2-stellige Zahl , beginnend mit 01, zugeordnet, die i.d.R. am Anfang des Dateinamens steht. Bei diesen Dateien ist das Auslesen O.K.


    Die von mir angeführten Dateien stammen vom auslesen einer Audiospur einer DVD. Dabei kann ich den Namen nicht beeinflussen. Vom Prog werden die Dateien automatisch

    F--_Title_01_Chapter 1.mp3
    F--_Title_01_Chapter 2.mp3
    F--_Title_01_Chapter 3.mp3

    usw. benannt.

    Dafür wäre eine Sortierung in der richtigen Reihenfolge super.

    Gruß Tom

    • Offizieller Beitrag

    @Onkel-tom: Mir ging es vor allem um die letzten Zahlen (vor dem .mp3). Wenn die max. 2stellig sind, dann funktioniert das untenstehende Script.

    @Xeno: Kannst Du Dir mal den zweiten Teil des Scripts ansehen? Das ist irgendwie merkwürdig (siehe Kommentare) oder ich habe da etwas nicht verstanden...

    Spoiler anzeigen
    [autoit]


    #include<Array.au3>
    #Include <File.au3>
    ; Testdaten

    [/autoit] [autoit][/autoit] [autoit]

    ;~ For $i = 1 To 20
    ;~ FileWrite(FileOpen(@ScriptDir & '\F--_Title_01_Chapter ' & $i & '.mp3', 1), '')
    ;~ Next

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    $FileList = _FileListToArray(@ScriptDir, '*.mp3', 1)
    If IsArray($FileList) Then
    For $i = 1 To $FileList[0]
    $Replace = StringRegExp($FileList[$i], '(\D)(\d\.mp3)', 3)
    If IsArray($Replace) Then $FileList[$i] = StringRegExpReplace($FileList[$i], '\D\d\.mp3', $Replace[0] & '0' & $Replace[1])
    Next
    _ArraySort($FileList)
    _ArrayDisplay($FileList)
    _FileWriteFromArray(@ScriptDir & '\MP3-List.txt', $FileList)
    EndIf

    [/autoit] [autoit][/autoit] [autoit][/autoit] [autoit]

    ; Das Folgende funktioniert komischerweise nicht!
    ; Der Anfang des Replacestring '$10$2$3' wird als $10 interpretiert, obwohl es lt. Hilfe nur $0...$9 geben sollte.
    ; Tatsächlich beginnen die Back-References aber mit $1
    ; Wie kann man das aber schreiben, wenn zwischen Back-Reference $1 und $2 eine Null eingefügt werden soll?
    $FileList = _FileListToArray(@ScriptDir, '*.mp3', 1)
    If IsArray($FileList) Then
    For $i = 1 To $FileList[0]
    $FileList[$i] = StringRegExpReplace($FileList[$i], '(\D)(\d)(\.mp3)', '$10$2$3')
    Next
    _ArraySort($FileList)
    _ArrayDisplay($FileList)
    _FileWriteFromArray(@ScriptDir & '\MP3-List.txt', $FileList)
    EndIf

    [/autoit]
  • Hallo Leute,

    vielen Dank für Eure Anregungen. :thumbup:

    Mit den Anregungen in den letzten Beiträgen bin ich stumpf überfordert (z.B. StringFormat, da müsste ich erst mal lernen, um zu verstehen, was das ist....) Ich glaube das übersteigt meine Grundkenntnisse deutlich.

    Ist aber nicht schlimm, denn eigentlich reicht mir das, was ich von Euch als Anregungen bekommen habe, völlig aus. ^^

    Danke an alle, die mir geholfen haben.


    Gruß Tom