Der Begriff "Media Center" ist vielleicht etwas übertrieben, aber ich habe nix passenderes griffiges gefunden. Mit diesem Programm verwaltet ihr eure Filmfestplatte.
Folgendermaßen muss diese aufgebaut sein: Das Skript muss in einem Ordner (oder im Wurzelverzeichnis) der Festplatte liegen. In diesem Ordner liegt ein Ordner ~MC, der für das Media Center benötigt wird (Cache). Außerdem gibt es einen Ordner "Filme", in dem es pro Film einen Ordner gibt, der so heißt, wie der Film.
Wie üblich ist das Ganze etwas unübersichtlich und gebastelt geschrieben, aber es funktioniert.
Features:
- GDI+-Oberfläche (teilweise)
- Navigation mit Pfeiltasten
- Enter wählt den Film aus, es werden dann rechts (sofern möglich) Informationen zu dem Film angezeigt. Diese werden (bei aktivier Internetverbindung) von Wikipedia geladen und dann im Cache-Ordner gespeichert, sodass dann auch ein Zugriff ohne Internet möglich ist.
- Leertaste startet den Film mit dem Standardprogramm. Existieren mehrere Dateien, werden sie in alphabetischer Reihenfolge gestartet (zum Beispiel erst Matrix part 1.avi und dann Matrix part 2.avi)
- Bei Druck auf einen Buchstaben wird zum ersten Film mit dem Anfangsbuchstaben navigiert.
- Unterstützung von Schreibweisen wie "Matrix, The [ENG][LQ]" (Wird als "The Matrix" angezeigt, aber trotzdem unter M einsortiert.
Das Ganze ist als Beta-version zu betrachten, an vielen Stellen fehlt noch Fehlerbehandlung oder Einstellungen (z.B. der Ordnernamen)
Spoiler anzeigen
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <File.au3>
#include <GDIPlus.au3>
#include <Misc.au3>
#include <Array.au3>
#include <String.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
Const $sFolder = @ScriptDir & "\Filme"
Dim $aMovies = _FileListToArray($sFolder, "*", 2)
Dim $iMovies = $aMovies[0]
_ArrayDelete($aMovies,0)
Global $landscape=1
$hGUI = GUICreate("Media Center", 781, 500, Default, Default, BitOR($WS_SIZEBOX, $WS_SYSMENU, $WS_MAXIMIZEBOX, $WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP))
$hLabel_Title = GUICtrlCreateLabel("", 368, 104, 355, 37)
GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKHEIGHT)
GUICtrlSetFont(-1, 20, 400, 0, "Calibri")
$hLabel_Info = GUICtrlCreateLabel("", 384, 152, 387, 273)
GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKHEIGHT)
$hCover = GUICtrlCreatePic("", 368, 0, 409, 97, $WS_GROUP)
GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKHEIGHT)
$hPicList = GUICtrlCreatePic("", 0, 0, 368, 500, $WS_GROUP)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKHEIGHT)
;~ $hButton_Play = GUICtrlCreateButton("Play", 376, 440, 57, 57, $WS_GROUP)
;~ GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKHEIGHT + $GUI_DOCKWIDTH)
;~ $hButton_iMDb = GUICtrlCreateButton("iMDb", 440, 440, 57, 57, $WS_GROUP)
;~ GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKHEIGHT + $GUI_DOCKWIDTH)
;~ $hButton_Wiki = GUICtrlCreateButton("Wiki", 504, 440, 57, 57, $WS_GROUP)
;~ GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKHEIGHT + $GUI_DOCKWIDTH)
;~ $hButton_Temp1 = GUICtrlCreateButton("Funk 1", 568, 440, 57, 57, $WS_GROUP)
;~ GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKHEIGHT + $GUI_DOCKWIDTH)
;~ $hButton_Temp2 = GUICtrlCreateButton("Funk 2", 632, 440, 57, 57, $WS_GROUP)
;~ GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKHEIGHT + $GUI_DOCKWIDTH)
$hButton_Temp3 = GUICtrlCreateButton("?", 751, 470, 30, 30, $WS_GROUP)
GUICtrlSetResizing(-1, $GUI_DOCKRIGHT + $GUI_DOCKHEIGHT + $GUI_DOCKWIDTH)
_GUI_Set_Standard()
GUISetState(@SW_SHOW)
#Region GDI+
_GDIPlus_Startup()
Global $hGraphics = _GDIPlus_GraphicsCreateFromHWND($hGUI)
$hBitmap = _GDIPlus_BitmapCreateFromGraphics(781,500, $hGraphics) ;Bitmap, das geschrieben wird
$hBuffer = _GDIPlus_ImageGetGraphicsContext($hBitmap) ;Buffer, in den geschrieben wird
_SetBitmapToCtrl($hPicList, $hBitmap)
Global $iSel = 0
Global $iStringsX = 0
$dll = DllOpen("user32.dll")
_Move(1)
_Move(-1)
#EndRegion
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
;~ case $hButton_Play
;~ _play()
case $hButton_Temp3
MsgBox(64,"Credits","Programmiert von L3viathan ([email='mail@l3viathan.de'][/email])" & @CRLF & @CRLF & "Webseite: http://l3viathan.de" & @CRLF & @CRLF & "Mit freundlicher Unterstützung von Carsten8 (autoit.de) bei den GDI+-Arbeiten.")
Case $GUI_EVENT_MAXIMIZE
;Landscape-Mode
$landscape=1
_move(0)
Case $GUI_EVENT_RESIZED
_move(0)
Case $GUI_EVENT_RESTORE
;Portrait-Mode
$landscape=1
_move(0)
EndSwitch
Select
Case _IsPressed("28", $dll)
_Move(1)
sleep(50)
Case _IsPressed("26", $dll)
_Move(-1)
sleep(50)
Case not WinActive("Media Center")
_GUI_Unset_Hotkeys()
WinWaitActive("Media Center")
_GUI_Set_Hotkeys()
_Move(1)
_Move(-1)
EndSelect
WEnd
Func _GUI_Set_Standard()
GUICtrlSetData($hLabel_Title, "Media Center")
GUICtrlSetData($hLabel_Info, "Dieses Programm ermöglicht ein erleichtertes Durchstöbern ihrer Filmfestplatte." & @CRLF & "Es steht unter Open Source (cc-by-nc-sa)")
;~ GUICtrlSetData($hButton_Play, "Play")
;~ GUICtrlSetData($hButton_iMDb, "iMDb")
;~ GUICtrlSetData($hButton_Wiki, "Wiki")
;~ GUICtrlSetData($hButton_Temp1, "?")
;~ GUICtrlSetData($hButton_Temp2, "?")
GUICtrlSetData($hButton_Temp3, "?")
GUISetBkColor(0xffffff)
GUICtrlSetColor($hLabel_Title, 0x0)
GUICtrlSetColor($hLabel_Info, 0x0)
_GUI_Set_Hotkeys()
EndFunc ;==>_GUI_Set_Standard
Func _GUI_Set_Hotkeys()
HotKeySet("{SPACE}","_play")
HotKeySet("{ENTER}","_highlight")
For $i=97 To 122
HotKeySet(Chr($i),"_jump")
Next
EndFunc
Func _GUI_Unset_Hotkeys()
HotKeySet("{SPACE}")
HotKeySet("{ENTER}")
For $i=97 To 122
HotKeySet(Chr($i))
Next
EndFunc
Func _GetMovie_Info($sTitle)
$sTitle=_BuildTitle($sTitle)
If FileExists(@ScriptDir & "\~MC\" & $sTitle & ".txt") Then Return FileRead(@ScriptDir & "\~MC\" & $sTitle & ".txt",FileGetSize(@ScriptDir & "\~MC\" & $sTitle & ".txt"))
GUICtrlSetData($hLabel_Info,"Informationen werden abgerufen...")
;~ Return "keine Internetverbindung";1&1 sucks
If not Ping("http://google.de",250) Then
$aFound=_StringBetween(StringRegExpReplace(BinaryToString(InetRead("http://de.wikipedia.org/w/index.php?title=" & StringReplace($sTitle," ","_")),4),"<.+?>",""),"[Bearbeiten] Handlung","[Bearbeiten]")
Else
$aFound="keine Internetverbindung."
EndIf
If IsArray($aFound) Then
FileWrite(@ScriptDir & "\~MC\" & $sTitle & ".txt",$aFound[0])
Return $aFound[0]
Else
If not StringInStr($sTitle,"(Film)") Then Return _GetMovie_Info($sTitle & " (Film)")
Return "Zu diesem Film konnte keine Beschreibung abgerufen werden."
EndIf
MsgBox(0,"","")
EndFunc ;==>_GetMovie_Info
Func _BuildTitle($titel)
$titel=StringReplace($titel,"[ENG]","")
$titel=StringReplace($titel,"[EN]","")
$titel=StringReplace($titel,"[LQ]","")
$titel=StringReplace($titel,"[HQ]","")
$titel=StringReplace($titel,"[SUB]","")
If StringLen($titel) - StringInStr($titel,",") = 4 Then $titel=StringRight($titel,3) & " " & StringTrimRight($titel,5)
Return StringStripWS($titel,7)
EndFunc
;~ #cs
Func _Move($iVal)
Global $iSel
_WinAPI_RedrawWindow($hGUI)
_GDIPlus_GraphicsClear($hBuffer,0x00ffffff)
$iSel += $iVal
If $iSel = UBound($aMovies) Then $iSel -= 1
If $iSel = -1 Then $iSel = 0
$iSize = -12
$iI = 0
For $i = $iSel-12 to $iSel+12
$iTempSize = $iSize
If $iSize < 0 Then $iTempSize = $iSize * -1
$iTempSize *= 2
If $i >= 0 And $i < UBound($aMovies) Then _GDIPlus_GraphicsDrawString($hBuffer, _BuildTitle($aMovies[$i]), 8, -150+$iI*(@DesktopHeight/24), "Calibri", 16-$iTempSize)
If $i=$iSel Then _GDIPlus_GraphicsDrawLine($hBuffer,0,-135+$iI*(@DesktopHeight/24),5,-135+$iI*(@DesktopHeight/24))
$iI += 1
$iSize += 1
Next
_GDIPlus_GraphicsDrawImageRect($hGraphics,$hBitmap,0,0,781,500)
If GUICtrlRead($hLabel_Title) <> "Media Center" Then
GUICtrlSetData($hLabel_Title, "Media Center")
GUICtrlSetData($hLabel_Info, "Dieses Programm ermöglicht ein erleichtertes Durchstöbern ihrer Filmfestplatte." & @CRLF & "Es steht unter Open Source (cc-by-nc-sa)")
EndIf
Return 1
EndFunc
;~ #ce
Func _Goto($iX)
$iSel=$iX
_Move(0)
Return 1
EndFunc
Func _highlight()
Global $iSel
_WinAPI_RedrawWindow($hGUI)
_GDIPlus_GraphicsClear($hBuffer,0x00ffffff)
If $iSel = UBound($aMovies) Then $iSel -= 1
If $iSel = -1 Then $iSel = 0
$iSize = -12
$iI = 0
For $i = $iSel-12 to $iSel+12
$iTempSize = $iSize
If $iSize < 0 Then $iTempSize = $iSize * -1
$iTempSize *= 2
If $i <> $iSel And $i >= 0 And $i < UBound($aMovies) Then _GDIPlus_GraphicsDrawString($hBuffer, _BuildTitle($aMovies[$i]), 8, -150+$iI*(@DesktopHeight/24), "Calibri", 16-$iTempSize)
If $i = $iSel And $i >= 0 And $i < UBound($aMovies) Then
_GDIPlus_GraphicsDrawString($hBuffer, _BuildTitle($aMovies[$i]), 28, -150+$iI*(@DesktopHeight/24), "Calibri", 16-$iTempSize)
_GDIPlus_GraphicsDrawLine($hBuffer,0,-135+$iI*(@DesktopHeight/24),20,-135+$iI*(@DesktopHeight/24))
EndIf
$iI += 1
$iSize += 1
Next
_GDIPlus_GraphicsDrawImageRect($hGraphics,$hBitmap,0,0,781,500)
;nun Infos laden:
GUICtrlSetData($hLabel_Title,_BuildTitle($aMovies[$iSel]))
GUICtrlSetData($hLabel_Info,_GetMovie_Info($aMovies[$iSel]))
EndFunc
Func _play()
_GUI_Unset_Hotkeys()
$result=_getMovie($aMovies[$iSel])
If isArray($result) Then
GUISetState(@SW_HIDE)
If $result[0] > 3 Then
$file=FileOpenDialog("Filmdatei auswählen",@ScriptDir & "Filme\" & $aMovies[$iSel] & "\","Alle Dateien (*.*)",3)
If not @error And $file <> "Thumbs.db" Then ShellExecuteWait($file)
Else
For $i=1 To $result[0]
If $result[$i] <> "Thumbs.db" Then ShellExecuteWait(@ScriptDir & "\Filme\" & $aMovies[$iSel] & "\" & $result[$i])
Next
EndIf
GUISetState(@SW_SHOW)
Else
GUISetState(@SW_HIDE)
ShellExecuteWait(@ScriptDir & "\Filme\" & $aMovies[$iSel] & "\" & $result)
GUISetState(@SW_SHOW)
EndIf
WinActivate("Media Center")
_GUI_Set_Hotkeys()
_Move(1)
_Move(-1)
EndFunc
Func _getMovie($name)
$dateien=_FileListToArray(@ScriptDir & "\Filme\" & $name,"*",1)
If IsArray($dateien) And $dateien[0]=1 Then Return $dateien[1]
Return $dateien
EndFunc
Func _SetBitmapToCtrl($CtrlId, $hBitmap)
Local Const $STM_SETIMAGE = 0x0172
Local Const $IMAGE_BITMAP = 0
Local Const $SS_BITMAP = 0xE
Local Const $GWL_STYLE = -16
Local $hWnd = GUICtrlGetHandle($CtrlId)
If $hWnd = 0 Then Return SetError(1, 0, 0)
Local $oldStyle = DllCall("user32.dll", "long", "GetWindowLong", "hwnd", $hWnd, "int", $GWL_STYLE)
If @error Then Return SetError(2, 0, 0)
DllCall("user32.dll", "long", "SetWindowLong", "hwnd", $hWnd, "int", $GWL_STYLE, "long", BitOR($oldStyle[0], $SS_BITMAP))
If @error Then Return SetError(3, 0, 0)
Local $oldBmp = DllCall("user32.dll", "hwnd", "SendMessage", "hwnd", $hWnd, "int", $STM_SETIMAGE, "int", $IMAGE_BITMAP, "int", $hBitmap)
If @error Then Return SetError(4, 0, 0)
If $oldBmp[0] <> 0 Then DllCall("GDI32.dll", "int", "DeleteObject", "int", $oldBmp[0])
Return 1
EndFunc
Func _jump()
$hk=@HotKeyPressed
$res=_ArrayLetterFind($hk)
If not @error Then _Goto($res)
EndFunc
Func _ArrayLetterFind($hk)
For $i=0 To UBound($aMovies)-1
;~ MsgBox(0,$hk & " " & $aMovies[$i], StringLeft($aMovies[$i],1))
If StringLeft($aMovies[$i],1) = $hk Then Return $i
Next
SetError(1)
EndFunc