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
Spoiler anzeigen
; --------------------------------------------
; Filme-Player | AndyTR | autoit.de
; --------------------------------------------
; Ich verweise darauf, dass die Nutzung dieses
; Skripts nur für legale Inhalte gewollt ist!
; --------------------------------------------
; Ansonsten viel Spaß damit...
; --------------------------------------------
#include <Constants.au3>
#include <GUIConstantsEx.au3>
#include <GUIScrollBars.au3>
#include <Misc.au3>
#include <ScrollBarConstants.au3>
#include <WindowsConstants.au3>
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
Opt("GUIOnEventMode", 1)
Opt("TrayAutoPause", 0)
Opt("TrayMenuMode", 3)
Opt("TrayOnEventMode", 1)
TraySetToolTip("Filme-Player")
[/autoit] [autoit][/autoit] [autoit]If _IsPressed("11") or _IsPressed("A2") Then ; Strg
$Advanced_Infos = True
Else
$Advanced_Infos = False
EndIf
; 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
If StringRight($Pfad, 1) <> "\" Then $Pfad &= "\"
Global $Array_GetFolderFiles = Array_GetFolderFiles($Pfad)
If $Array_GetFolderFiles[1] = "" Then Exit ; wenn keine Filme vorhanden sind
Tray()
Filme()
Gui()
While 1
Sleep(100)
WEnd
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
Func Tray()
TrayCreateItem($Array_GetFolderFiles[0] & " Filme | " & Groesse())
TrayItemSetState(-1, $TRAY_DISABLE)
TrayCreateItem("")
TrayCreateItem("Beenden")
TrayItemSetOnEvent(-1, "_Exit")
EndFunc
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
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
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
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
Func Wiedergabe()
Run($Vlc & ' "' & $Filme[@GUI_CTRLID - 3][0] & '"') ; eventuell für anderes Programm anpassen
EndFunc
Func _Exit()
Exit
EndFunc
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
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
Andy
Edit: Die "ffmpeg.exe" muss in dem Ordner liegen, in dem sich das Skript befindet.