Skript: Filme-Player

  • Hallo,

    ich möchte Euch ein Skript vorstellen, das ich schon seit langer, langer Zeit selbst benutze, aber dafür ist es eigentlich zu schade.
    Es handelt sich um einen Player für Filme. Ich finde das einfach toller, als im Windows-Explorer zu navigieren.

    Hier eine Liste der wichtigsten Funktionen:

    - ein übersichtliches GUI wird erstellt (mit Covern, wenn vorhanden)
    - zunächst wird selbstständig nach einem Filme-Ordner gesucht (Festplatten, Desktop), anschließend Abfrage
    - bei Bedarf können durch Drücken von "Strg" bei Ausführung weitere Informationen angezeigt werden (Laden dauert dann länger)
    - Informationen: (Länge, Auflösung, Bitrate,) Größe, Format
    - Wiedergabe mittels VLC, andernfalls ist selbstständiges Anpassen notwendig

    Anmerkungen:

    - bei mir läuft alles einwandfrei, es kann aber immer zu Bugs kommen, bitte entschuldigt das
    - die "ffmpeg.exe" ist zu groß für den Dateianhang hier, sie ist nicht zwingend notwendig, ladet sie Euch irgendwo herunter,
    z.B.: chip.de/downloads/FFmpeg_35368574.html , ffmpeg.org , videohelp.com/tools/ffmpeg , tripp.arrozcru.org
    - die Cover müssen im dafür vorgesehenen Ordner liegen und genauso wie die Film-Dateien heißen ( natürlich mit Ausnahme der Dateiendung)
    - ein Seitenverhältnis von 2:3 wird benutzt, alles andere wird skaliert oder verzerrt (nehmt die Maße des Dummy-Covers als Beispiel)

    Ansonsten viel Spaß mit dem Skript. Natürlich möchte ich, dass es nur für legale Inhalte genutzt wird :rolleyes:

    Spoiler anzeigen
    [autoit]

    ; --------------------------------------------
    ; Filme-Player | AndyTR | autoit.de
    ; --------------------------------------------
    ; Ich verweise darauf, dass die Nutzung dieses
    ; Skripts nur für legale Inhalte gewollt ist!
    ; --------------------------------------------
    ; Ansonsten viel Spaß damit...
    ; --------------------------------------------

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

    #include <Constants.au3>
    #include <GUIConstantsEx.au3>
    #include <GUIScrollBars.au3>
    #include <Misc.au3>
    #include <ScrollBarConstants.au3>
    #include <WindowsConstants.au3>

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

    HotKeySet("{ESC}", "_Exit")

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

    Global $X = 2, $Y = 2, $Cover_Breite = 100, $Cover_Abstand = 2, $Scrollbar_Abstand = 2 ; für Aussehen anpassen
    Global $Vlc = @ProgramFilesDir & "\VideoLAN\VLC\vlc.exe" ; für anderen Pfad/anderes Programm anpassen
    Global $Advanced_Infos, $Pfad

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

    Opt("GUIOnEventMode", 1)
    Opt("TrayAutoPause", 0)
    Opt("TrayMenuMode", 3)
    Opt("TrayOnEventMode", 1)

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

    TraySetToolTip("Filme-Player")

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

    If _IsPressed("11") or _IsPressed("A2") Then ; Strg
    $Advanced_Infos = True
    Else
    $Advanced_Infos = False
    EndIf

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

    ; für anderen Filme-Pfad anpassen ($Pfad = "...")
    For $i = 65 To 90 Step + 1
    $Pfad = String(BinaryToString($i)) & ":\Filme\"
    If DirGetSize($Pfad) >= 0 Then ExitLoop
    If $i = 90 Then $Pfad = @DesktopDir & "\Filme\"
    Next
    If DirGetSize($Pfad) = -1 Then
    Do
    $Pfad = FileSelectFolder("Bitte wähle einen Filme-Ordner aus:", "")
    Until $Pfad <> ""
    EndIf

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

    If StringRight($Pfad, 1) <> "\" Then $Pfad &= "\"
    Global $Array_GetFolderFiles = Array_GetFolderFiles($Pfad)
    If $Array_GetFolderFiles[1] = "" Then Exit ; wenn keine Filme vorhanden sind

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

    Tray()
    Filme()
    Gui()

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

    While 1
    Sleep(100)
    WEnd

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

    Func Array_GetFolderFiles($sPath)
    Local $oFSO = ObjCreate("Scripting.FileSystemObject")
    Local $sFiles = ""
    For $sFile In $oFSO.GetFolder($sPath).Files ; für weitere Datei-Formate anpassen
    If StringRight($sFile.Path, 4) = ".avi" or StringRight($sFile.Path, 4) = ".mkv" or StringRight($sFile.Path, 4) = ".mpg" Then $sFiles &= $sFile.Path & "|"
    Next
    Return StringSplit(StringTrimRight($sFiles, 1), "|")
    EndFunc

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

    Func Tray()
    TrayCreateItem($Array_GetFolderFiles[0] & " Filme | " & Groesse())
    TrayItemSetState(-1, $TRAY_DISABLE)
    TrayCreateItem("")
    TrayCreateItem("Beenden")
    TrayItemSetOnEvent(-1, "_Exit")
    EndFunc

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

    Func Groesse()
    Local $Groesse = 0
    For $i = 1 To $Array_GetFolderFiles[0] Step + 1
    $Groesse += FileGetSize($Array_GetFolderFiles[$i])
    Next
    Return Round($Groesse / (1024 * 1024 * 1024)) & " GB"
    EndFunc

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

    Func Filme()
    Global $Anzahl_Filme = $Array_GetFolderFiles[0]
    If $Advanced_Infos = False Then Global $Filme[$Anzahl_Filme][4]
    If $Advanced_Infos = True Then Global $Filme[$Anzahl_Filme][7]
    For $i = 0 To $Anzahl_Filme - 1 Step + 1
    $Filme[$i][0] = $Array_GetFolderFiles[$i + 1]
    $Filme[$i][1] = StringTrimRight(StringTrimLeft($Array_GetFolderFiles[$i + 1], StringLen($Pfad)), 4)
    $Filme[$i][2] = StringUpper(StringRight($Array_GetFolderFiles[$i + 1], 3))
    $Filme[$i][3] = Round(FileGetSize($Array_GetFolderFiles[$i + 1]) / (1024 * 1024)) & " MB"
    If $Advanced_Infos = True Then Laenge_Bitrate_Aufloesung($Array_GetFolderFiles[$i + 1], $i)
    Next
    EndFunc

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

    Func Laenge_Bitrate_Aufloesung($File , $i)
    Local $Film = ""
    $Film = Run('ffmpeg.exe -i "' & $File & '"', @ScriptDir, @SW_HIDE, 4)
    While 1
    $Film &= StderrRead($Film)
    If @error Then ExitLoop
    WEnd
    Local $Duration = StringLeft(StringTrimLeft($Film, StringInStr($Film, "Duration: ") + 10), 4) & " Std"
    Local $Bitrate_2 = StringLeft(StringTrimLeft($Film, StringInStr($Film, "Bitrate: ") + 8), 6)
    Local $Bitrate = StringLeft($Bitrate_2, StringInStr($Bitrate_2, " ") - 1) & " KB/s"
    Local $Solution_2 = StringLeft(StringTrimLeft($Film, StringInStr($Film, "p, ") + 2), 10)
    Local $Solution = StringReplace(StringReplace(StringLeft($Solution_2, StringInStr($Solution_2, " ") - 1), ",", ""), "x", " x ")
    $Filme[$i][4] = $Solution
    $Filme[$i][5] = $Bitrate
    $Filme[$i][6] = $Duration
    EndFunc

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

    Func Gui()
    Local $Rechter_Rand = @DesktopWidth - $X
    Local $Hoehe = $Cover_Breite * 1.5 + $Scrollbar_Abstand + 17
    If $Anzahl_Filme * ($Cover_Breite + $Cover_Abstand) - $Cover_Abstand < @DesktopWidth - 2 * $X Then
    $Rechter_Rand = $X + $Anzahl_Filme * ($Cover_Breite + $Cover_Abstand) - $Cover_Abstand + 5
    $Hoehe = $Cover_Breite * 1.5
    EndIf
    Local $GUI = GUICreate("Filme-Player", $Rechter_Rand - $X, $Hoehe, $X, $Y, $WS_POPUP, $WS_EX_LAYERED + $WS_EX_TOOLWINDOW)
    GUISetBkColor(0xABCDEF)
    Global $Cover[$Anzahl_Filme]
    For $i = 0 To $Anzahl_Filme - 1 Step + 1
    Local $Bild = @ScriptDir & "\Cover\" & $Filme[$i][1] & ".jpg"
    If $i = 0 Then
    If FileExists($Bild) = 1 Then $Cover[$i] = GUICtrlCreatePic($Bild, 0, 0, $Cover_Breite, $Cover_Breite * 1.5)
    If FileExists($Bild) = 0 Then $Cover[$i] = GUICtrlCreatePic(@ScriptDir & "\Cover\#Dummy.jpg", 0, 0, $Cover_Breite, $Cover_Breite * 1.5)
    Else
    If FileExists($Bild) = 1 Then $Cover[$i] = GUICtrlCreatePic($Bild, $i * ($Cover_Breite + $Cover_Abstand), 0, $Cover_Breite, $Cover_Breite * 1.5)
    If FileExists($Bild) = 0 Then $Cover[$i] = GUICtrlCreatePic(@ScriptDir & "\Cover\#Dummy.jpg", $i * ($Cover_Breite + $Cover_Abstand), 0, $Cover_Breite, $Cover_Breite * 1.5)
    EndIf
    GUICtrlSetCursor(-1, 0)
    GUICtrlSetOnEvent(-1, "Wiedergabe")
    GUICtrlSetResizing(-1, $GUI_DOCKALL)
    If $Advanced_Infos = False Then GUICtrlSetTip(-1, " - Größe: " & $Filme[$i][3] & @LF & " - Format: " & $Filme[$i][2], $Filme[$i][1], 0, 2)
    If $Advanced_Infos = True Then GUICtrlSetTip(-1, " - Länge: " & $Filme[$i][6] & @LF & " - Auflösung: " & $Filme[$i][4] & @LF & " - Bitrate: " & $Filme[$i][5] & @LF & " - Größe: " & $Filme[$i][3] & @LF & " - Format: " & $Filme[$i][2], $Filme[$i][1], 0, 2)
    Next
    GUIRegisterMsg($WM_SIZE, "WM_SIZE")
    GUIRegisterMsg($WM_HSCROLL, "WM_HSCROLL")
    _GUIScrollBars_Init($GUI, $Anzahl_Filme * $Cover_Breite + ($Anzahl_Filme - 1) * $Cover_Abstand - 20, 0)
    Local $color = Execute('0x00' & StringMid(Hex(String(0xABCDEF), 6), 5, 2) & StringMid(Hex(String(0xABCDEF), 6), 3, 2) & StringMid(Hex(String(0xABCDEF), 6), 1, 2))
    DllCall("user32.dll", "int", "SetLayeredWindowAttributes", "hwnd", $GUI, "long", $color, "byte", 255, "long", 3)
    GUISetState()
    EndFunc

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

    Func Wiedergabe()
    Run($Vlc & ' "' & $Filme[@GUI_CTRLID - 3][0] & '"') ; eventuell für anderes Programm anpassen
    EndFunc

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

    Func _Exit()
    Exit
    EndFunc

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

    Func WM_SIZE($hWnd, $Msg, $wParam, $lParam)
    Local $index = -1, $yChar, $xChar, $xClientMax, $xClient, $yClient, $ivMax
    For $x = 0 To UBound($aSB_WindowInfo) - 1
    If $aSB_WindowInfo[$x][0] = $hWnd Then
    $index = $x
    $xClientMax = $aSB_WindowInfo[$index][1]
    $xChar = $aSB_WindowInfo[$index][2]
    $yChar = $aSB_WindowInfo[$index][3]
    $ivMax = $aSB_WindowInfo[$index][7]
    ExitLoop
    EndIf
    Next
    If $index = -1 Then Return 0
    Local $tSCROLLINFO = DllStructCreate($tagSCROLLINFO)
    $xClient = BitAND($lParam, 0x0000FFFF)
    $yClient = BitShift($lParam, 16)
    $aSB_WindowInfo[$index][4] = $xClient
    $aSB_WindowInfo[$index][5] = $yClient
    DllStructSetData($tSCROLLINFO, "fMask", BitOR($SIF_RANGE, $SIF_PAGE, $SIF_POS))
    DllStructSetData($tSCROLLINFO, "nMin", 0)
    DllStructSetData($tSCROLLINFO, "nMax", $ivMax)
    DllStructSetData($tSCROLLINFO, "nPage", $yClient / $yChar)
    _GUIScrollBars_SetScrollInfo($hWnd, $SB_VERT, $tSCROLLINFO)
    DllStructSetData($tSCROLLINFO, "fMask", BitOR($SIF_RANGE, $SIF_PAGE, $SIF_POS))
    DllStructSetData($tSCROLLINFO, "nMin", 0)
    DllStructSetData($tSCROLLINFO, "nMax", 2 + $xClientMax / $xChar)
    DllStructSetData($tSCROLLINFO, "nPage", $xClient / $xChar)
    _GUIScrollBars_SetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)
    Return $GUI_RUNDEFMSG
    EndFunc

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

    Func WM_HSCROLL($hWnd, $Msg, $wParam, $lParam)
    Local $nScrollCode = BitAND($wParam, 0x0000FFFF)
    Local $index = -1, $xChar, $xPos
    Local $Min, $Max, $Page, $Pos, $TrackPos
    For $x = 0 To UBound($aSB_WindowInfo) - 1
    If $aSB_WindowInfo[$x][0] = $hWnd Then
    $index = $x
    $xChar = $aSB_WindowInfo[$index][2]
    ExitLoop
    EndIf
    Next
    If $index = -1 Then Return 0
    Local $tSCROLLINFO = _GUIScrollBars_GetScrollInfoEx($hWnd, $SB_HORZ)
    $Min = DllStructGetData($tSCROLLINFO, "nMin")
    $Max = DllStructGetData($tSCROLLINFO, "nMax")
    $Page = DllStructGetData($tSCROLLINFO, "nPage")
    $xPos = DllStructGetData($tSCROLLINFO, "nPos")
    $Pos = $xPos
    $TrackPos = DllStructGetData($tSCROLLINFO, "nTrackPos")
    Switch $nScrollCode
    Case $SB_LINELEFT
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - 1)
    Case $SB_LINERIGHT
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + 1)
    Case $SB_PAGELEFT
    DllStructSetData($tSCROLLINFO, "nPos", $Pos - $Page)
    Case $SB_PAGERIGHT
    DllStructSetData($tSCROLLINFO, "nPos", $Pos + $Page)
    Case $SB_THUMBTRACK
    DllStructSetData($tSCROLLINFO, "nPos", $TrackPos)
    EndSwitch
    DllStructSetData($tSCROLLINFO, "fMask", $SIF_POS)
    _GUIScrollBars_SetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)
    _GUIScrollBars_GetScrollInfo($hWnd, $SB_HORZ, $tSCROLLINFO)
    $Pos = DllStructGetData($tSCROLLINFO, "nPos")
    If ($Pos <> $xPos) Then _GUIScrollBars_ScrollWindow($hWnd, $xChar * ($xPos - $Pos), 0)
    Return $GUI_RUNDEFMSG
    EndFunc

    [/autoit]


    Andy :)

    Edit: Die "ffmpeg.exe" muss in dem Ordner liegen, in dem sich das Skript befindet.

  • Die einzige Möglichkeit dafür ist in Zeile 50. Hast Du denn einen Ordner gewählt, in dem auch solche Dateien liegen? Ansonsten kommentierst Du mal die Zeile aus.
    Lass Dir _ArrayDisplay($Array_GetFolderFiles) anzeigen, ob dort in dem Array auch Dateien stehen.

    Wie läuft es sonst bei den anderen?

  • Zeile 50? Diese Zeile hat doch gar nichts mit einer Ordnerwahl zu tun. Meinst du Zeile 73? Das Problem ist wie gesagt, dass gar nichts erscheint, auch nicht der Ordnerwahldialog. Ich starte das Programm, das AutoIt Icon erscheint kurz in der Taskleise und verschwindt dann wieder. Ansonsten passiert überhaupt nichts, keine Dialogbox, gar nichts.

  • Also wieso es bei Dieter nicht richtig funktioniert, kann ich leider nicht sagen :S
    Aber wie findet Ihr es denn sonst? Vorausgesetzt es läuft nicht nur bei mir einwandtfrei.

    Und ich freue mich immer über Feedback, 22 Downloads sinds ja doch! :rolleyes: