MyMovieDB - Film-Datenbank

  • Hallo zusammen,

    da ich vor kurzem mal wieder auf eines meiner alten Projekte angesprochen wurde, dass ich auch seit Monaten versuche zu erweitern, habe ich die letzten beiden Tage mal etwas reingehauen und eine erste Version fertiggestellt.

    Ich setzte das Ganze jedoch mal als neues Skript ein, da ich die DB von einer Grundfunktion befreit habe, die es relativ stark an meine Bedürfnisse eingeschränkt hat.

    Das alte Skript ist dieses -> https://autoit.de/index.php?page…highlight=movie

    Das Meiste dürfte soweit selbst erklärend sein. Man kann Filme mit div. Informationen in die DB einpflegen, löschen, Einträge filtern, bewerten, Cover zuordnen oder im Internet nach Informationen suchen.

    Die Besonderheiten sind:
    - die (gefilterte) Liste lässt sich nach Excel oder HTML exportieren
    - es können eigene Filter erstellt werden (per SQL in ini eintragen)
    - man kann Raw-SQL-Commands nutzen (natürlich eingeschränkt auf die Funktionalität einer (Film)-Datenbank)
    - die DB kann um Plugins erweitert werden
    - die Speicher-Auslastung der Festplatten kann eingesehen werden

    Was ihr euch nun vllt Fragen könntet, ist, was hat es mit den Plugins auf sich?

    In meinem alten Skript hatte ich eine Funktionalität eingebaut, die automatisch Festplatten abscannt, wenn diese einen bestimmten Aufbau haben. Das Ganze war natürlich sehr auf mich zurecht geschnitten und für Andere nicht wirklich nützlich. Diese Funktionalität kann sich aber nun jeder selber als Plugin einbauen, sofern gewünscht/ benötigt. Die wichtigsten Informationen sind schon in einer Vorlage enthalten, ein Beispielt-Script zu meiner Routine wird ebenfalls folgen, damit dies schnell an eigene Bedürfnisse angepasst werden kann. Aber im Grunde können auch viele andere Funktionen einfach nachgerüstet werden (Cover aus dem Internet laden, Infos zu Schauspielern hinzufügen, etc).

    Wichtig dabei ist, dass Plugins nur als au3 unterstützt werden, was bedeutet ihr müsst natürlich auf die includes achten. Wer aber au3-Plugins schreibt, wird wohl standardmäßig alles auf dem Rechner haben.

    Ich denke das war erstmal das Wichtigste hierzu.

    Fragen, Fehler oder Anregungen?

    Ansonsten hier alles, was benötigt wird.

    2-do:

    -> Festplatten-Manger, um ggf. Informationen anzupassen (Größe, ID, ...)
    -> Beispiel-Script für Scan-Routine

  • Wie versprochen, hier mein Plugin. Ich habe noch ein Sache eingebaut, die ich nicht testen konnte (Zeile 102), falls jmd das Script testet oder umschreiben will.

    Das Script scannt einen ausgewählten Ordner oder eine Festplatte ab. Die direkten Unterordner werden als Filmname in die DB eingelesen (sofern der Ordner nicht leer ist). Weiter scannt das Script die Elemente (Ordner/ Dateien), die sich direkt in diesem Ordner befinden, nach festgelegten Informationen ab. Sofern eine Information gefunden wurde, wird diese entsprechend in der DB gespeichert..

    Zusätzlich wird noch das Ordner-Bild auf ggf. gefundene ico-Dateien abgeändert.

    Das Script sollte sich relativ leicht an andere Scan-Strukturen anpassen lassen.

    Spoiler anzeigen
    [autoit]

    #include <SQLite.au3>
    #include <SQLite.dll.au3>
    #include "O:\Dropbox\AutoIt\Includes\PathSplitExt.au3"

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

    Global $ini = StringLeft(@Scriptdir, StringInStr(@scriptdir, "\", 0, -1)) & "Settings.ini"
    Global $aRow, $aRow2, $NoDel

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

    $Genre = ""
    If IniRead($ini, "Scan", "Genre", "") = "" Then IniWrite($ini, "Filter", "Serie", $Genre)
    $Source = "BluRay|HDDVD|HDTV|DVDRip|Blu-Ray|BDRip|dTV|SatRip|TVRip|HD2DVD|BD-Rip|HD-DVD|DVD-Rip|TV-Rip|Sat-Rip"
    If IniRead($ini, "Scan", "Source", "") = "" Then IniWrite($ini, "Filter", "Serie", $Source)
    $Resolution = "1080p|720p|1080i|720i|PAL|NTSC|WideScreen|FullScreen|WS|FS"
    If IniRead($ini, "Scan", "Resolution", "") = "" Then IniWrite($ini, "Filter", "Serie", $Resolution)
    $Codec = "h264|x264|XviD|DivX|h.264|x.264|h-264|x-264|dvxa"
    If IniRead($ini, "Scan", "Codec", "") = "" Then IniWrite($ini, "Filter", "Serie", $Codec)
    $Audio = "DTS|AC3|DD5.1|MP3|5.1|MP2"
    If IniRead($ini, "Scan", "Audio", "") = "" Then IniWrite($ini, "Filter", "Serie", $Audio)
    $Language = "German|Ger.Eng|DL|ML|Ger"
    If IniRead($ini, "Scan", "Language", "") = "" Then IniWrite($ini, "Filter", "Serie", $Language)

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

    $sSQliteDll = _SQLite_Startup()
    If @error > 0 Then
    MsgBox(16, "SQLite Error", "SQLite.dll Can't be Loaded!")
    Exit -1
    EndIf

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

    $SelectFolder = FileSelectFolder("Select HDD/Folder", "")
    If Not @error Then
    $iniGenre = IniRead($ini, "Scan", "Genre", $Genre)
    $iniSource = IniRead($ini, "Scan", "Source", $Source)
    $iniResolution = IniRead($ini, "Scan", "Resolution", $Resolution)
    $iniCodec = IniRead($ini, "Scan", "Codec", $Codec)
    $iniAudio = IniRead($ini, "Scan", "Audio", $Audio)
    $iniLanguage = IniRead($ini, "Scan", "Language", $Language)
    If StringRight($SelectFolder, 1) = "\" Then $SelectFolder = StringTrimRight($SelectFolder, 1)
    $FolderAr = _FileListToArray($SelectFolder, "*", 2)
    If @error Then Exit MsgBox(16, "Error", "No Folders found in" & @CRLF & $SelectFolder, Default)

    $ArSearch = _ArraySearch($FolderAr, "$RECYCLE.BIN")
    If $ArSearch = 1 Then
    _ArrayDelete($FolderAr, $ArSearch)
    $FolderAr[0] = UBound($FolderAr) - 1
    EndIf

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

    $Location = ""
    $PS = _PathSplitExt($SelectFolder)
    If IsArray($PS) Then
    $Location = DriveGetLabel($PS[1])
    Else
    $Location = DriveGetLabel($PS)
    EndIf

    $DeviceSerial = DriveGetSerial($Location)

    $DB = IniRead($ini, "DB", "AutoOpen", "")
    $DB_Handle = _SQLite_Open($DB)
    If @error > 0 Then Exit MsgBox(16, "SQLite Error", "Can't Load Database!", 5)

    _SQLite_QuerySingleRow(-1, "Select Label From Devices where Serial = '" & $DeviceSerial & "' LIMIT 1;", $aRow)
    If Not @error And $aRow[0] <> "" Then $Location = $aRow[0]

    $Location = InputBox("Location", "Please enter your favorite Location Name", $Location)

    If Not @error Then

    If $aRow[0] <> "" Then
    _SQLite_Exec(-1, "Update Devices Set Label='" & $Location & "', Serial='" & $DeviceSerial & "', Space='" & Round(DriveSpaceTotal($SelectFolder) / 1024, 2) & "', Type='" & DriveGetType($SelectFolder) & "', FTPLogin ='', FTPPath='' Where Serial = '" & $DeviceSerial & "'")
    Else
    _SQLite_Exec(-1, "Insert into Devices values ('" & $Location & "','" & $DeviceSerial & "','" & Round(DriveSpaceTotal($SelectFolder) / 1024, 2) & "','" & DriveGetType($SelectFolder) & "','','');")
    EndIf

    ;~ IniWrite($ini, "All Discs", $Location, Round(DriveSpaceTotal($SelectFolder) / 1024, 2) & "|" & Round(DriveSpaceFree($SelectFolder) / 1024, 2))
    ;~ IniWrite($ini, StringLeft(GUICtrlRead($Input3), StringLen(GUICtrlRead($Input3)) - 7), $Location, Round(DriveSpaceTotal($SelectFolder) / 1024, 2) & "|" & Round(DriveSpaceFree($SelectFolder) / 1024, 2))

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

    For $i = 1 To $FolderAr[0]
    $Title = $FolderAr[$i]
    $Comment = ""
    $Genre = ""
    $Year = ""
    $Rating = 0
    $FileAr = _FileListToArray($SelectFolder & "\" & $FolderAr[$i], "*")
    If Not @error And $FileAr[0] <> "" And $FolderAr[$i] <> "RECYCLER" And $FolderAr[$i] <> "Recycled" Then

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

    $Icon = ""
    For $ii = 1 To $FileAr[0]
    If StringRight($FileAr[$ii], 3) = "ico" Then
    FileMove($SelectFolder & "\" & $FolderAr[$i] & "\" & $FileAr[$ii], $SelectFolder & "\" & $FolderAr[$i] & "\" & $Title & ".ico", 9)
    $Icon = $FileAr[$ii]
    FileCopy($SelectFolder & "\" & $FolderAr[$i] & "\" & $FileAr[$ii], @ScriptDir & "\cover", 8)
    $path = $SelectFolder & "\" & $FolderAr[$i]
    $IcoPfad = $SelectFolder & "\" & $FolderAr[$i] & "\" & $FileAr[$ii]
    _CheckForDesktopINI($path, $IcoPfad)
    ExitLoop
    EndIf
    Next

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

    For $ii = $FileAr[0] To 1 Step -1
    If StringRight($FileAr[$ii], 3) = "ico" Then
    _ArrayDelete($FileAr, $ii)
    ElseIf StringRight($FileAr[$ii], 3) = "ini" Then
    _ArrayDelete($FileAr, $ii)
    EndIf
    Next

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

    $FileAr[0] = UBound($FileAr) - 1

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

    $Files = $FileAr[1]

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

    If $FileAr[0] > 8 Then $Comment = "Auto-Comment: Serie?!"

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

    $Size = ""
    $Size = Round(DirGetSize($SelectFolder & "\" & $FolderAr[$i]) / 1024 / 1024 / 1024, 2)

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

    $Ext = ""
    $Ext = StringRight($Files, StringLen($Files) - StringInStr($Files, ".", Default, Default))

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

    $Date = ""
    $Date = StringRegExp($Files, "\d{4}", 3)
    $DateTitle = ""
    $DateTitle = StringRegExp($Title, "\d{4}", 3)
    If Not @error Then _ArrayAdd($DateTitle, "1080")

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

    For $jj = 0 To UBound($DateTitle) - 1
    _ArrayDelete($Date, _ArraySearch($Date, $DateTitle[$jj]))
    Next

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

    If IsArray($Date) Then $Year = $Date[0]
    If $Year = 1080 Then $Year = ""

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

    $Source = ""
    $Split = StringSplit($iniSource, "|")
    If Not @error Then
    For $Xi = 1 To $Split[0]
    If StringInStr($Files, $Split[$Xi]) Then
    $Source = $Split[$Xi]
    ExitLoop
    EndIf
    Next
    EndIf

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

    $Resolution = ""
    $Split = StringSplit($iniResolution, "|")
    If Not @error Then
    For $Xi = 1 To $Split[0]
    If StringInStr($Files, $Split[$Xi]) Then
    $Resolution = $Split[$Xi]
    ExitLoop
    EndIf
    Next
    EndIf

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

    $Codec = ""
    $Split = StringSplit($iniCodec, "|")
    If Not @error Then
    For $Xi = 1 To $Split[0]
    If StringInStr($Files, $Split[$Xi]) Then
    $Codec = $Split[$Xi]
    ExitLoop
    EndIf
    Next
    EndIf

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

    $Audio = ""
    $Split = StringSplit($iniAudio, "|")
    If Not @error Then
    For $Xi = 1 To $Split[0]
    If StringInStr($Files, $Split[$Xi]) Then
    $Audio = $Split[$Xi]
    ExitLoop
    EndIf
    Next
    EndIf

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

    $Language = ""
    $Split = StringSplit($iniLanguage, "|")
    If Not @error Then
    For $Xi = 1 To $Split[0]
    If StringInStr($Files, $Split[$Xi]) Then
    $Language = $Split[$Xi]
    ExitLoop
    EndIf
    Next
    EndIf

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

    _SQLite_QuerySingleRow(-1, "Select Genre, Comment, Rating, Year, Icon From DB where Title = '" & $Title & "' LIMIT 1;", $aRow2)
    If Not @error Then
    If UBound($aRow2) > 1 Then
    If $aRow2[0] <> "" Then
    $Genre = $aRow2[0]
    Else
    $Split = StringSplit($iniGenre, "|")
    If Not @error Then
    For $Xi = 1 To $Split[0]
    If StringInStr($Files, $Split[$Xi]) Then
    $Genre = $Split[$Xi]
    ExitLoop
    EndIf
    Next
    EndIf
    EndIf
    If $aRow2[1] <> "" Then $Comment = $aRow2[1]
    If $aRow2[2] <> "" Then $Rating = $aRow2[2]
    If $aRow2[3] <> "" And $Year = "" Then $Year = $aRow2[3]
    If $aRow2[4] <> "" And $Icon = "" Then $Icon = $aRow2[4]
    EndIf
    EndIf

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

    For $iii = 2 To $FileAr[0]
    $Files = $Files & @CRLF & $FileAr[$iii]
    Next

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

    _SQLite_QuerySingleRow(-1, "Select oid From DB where Title = '" & $Title & "' and Location = '" & $Location & "' LIMIT 1;", $aRow)
    If Not @error And $aRow[0] <> "" Then
    _ArrayAdd($NoDel, $aRow[0])
    _SQLite_Exec(-1, "Update DB Set Title='" & $Title & "', Genre='" & $Genre & "', Year='" & $Year & "', Location='" & $Location & "', Comment='" & $Comment & "', Source='" & $Source & "', Resolution='" & $Resolution & "', Size='" & $Size & "', Codec='" & $Codec & "', Extension='" & $Ext & "', Audio='" & $Audio & "', Language='" & $Language & "', Files='" & $Files & "', Rating='" & $Rating & "', Icon='" & $Icon & "' Where rowid = '" & $aRow[0] & "'")
    Else
    _SQLite_Exec(-1, "Insert into DB values ('" & $Title & "','" & $Genre & "','" & $Year & "','" & $Location & "','" & $Comment & "','" & $Source & "', '" & $Resolution & "', '" & $Size & "', '" & $Codec & "', '" & $Ext & "', '" & $Audio & "', '" & $Language & "', '" & $Files & "', '" & $Rating & "', '" & $Icon & "');")
    _ArrayAdd($NoDel, _SQLite_LastInsertRowID(-1))
    EndIf
    EndIf
    Next
    _ArrayDelete($NoDel, 0)
    _SQLite_Exec(-1, "Select Rowid From DB Where Location = '" & $Location & "'", "_Del")
    $DB = IniRead($ini, "DB", "Path", "")
    Dim $NoDel[1]
    EndIf
    EndIf

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

    _SQLite_Close($DB_Handle)

    Func _CheckForDesktopINI($path, $IcoPfad)
    DllCall("shlwapi.dll", "int", "PathMakeSystemFolder", "str", $path)
    $path &= "\desktop.ini"
    If FileExists($path) Then
    $sections = IniReadSectionNames($path)
    If Not @error Then
    For $var = 1 To $sections[0]
    $str = IniRead($path, $sections[$var], "IconFile", "null")
    If $str <> "null" Then
    IniWrite($path, $sections[$var], "IconFile", $IcoPfad)
    IniWrite($path, $sections[$var], "IconIndex", "0")
    FileSetAttrib($path, "+H+S")
    Return
    EndIf
    Next
    EndIf
    $str = IniRead($path, "", "IconFile", "null")
    If $str <> "null" Then
    IniDelete($path, "", "IconFile")
    IniDelete($path, "", "IconIndex")
    IniWrite($path, ".ShellClassInfo", "IconFile", $IcoPfad)
    IniWrite($path, ".ShellClassInfo", "IconIndex", "0")
    FileSetAttrib($path, "+H+S")
    Return
    EndIf
    Else
    IniWrite($path, ".ShellClassInfo", "IconFile", $IcoPfad)
    IniWrite($path, ".ShellClassInfo", "IconIndex", "0")
    FileSetAttrib($path, "+H+S")
    Return
    EndIf
    EndFunc ;==>_CheckForDesktopINI

    [/autoit]