Hallo zusammen,
wie hier zu sehen ist, pflege ich meine Familien-Videos (meist kurze Handy-Filme) in Kodi und habe mir dazu ein Skript gebastelt um sie schnell und ordentlich in die Kodi-DB zu bekommen. Drum rum sind aber noch ein paar weitere Skripte entstanden, die vielleicht der eine oder andere von euch auch brauchen kann.
Ich habe alle Home-Videos auf dem NAS und im Wohnzimmer-Kodi. Ich will sie jedoch auch auf dem Tablet haben, offline verfügbar und in reduzierter Dateigröße. Dabei hilft mir dieses Skript:
- Es nutzt optional eine "Datenbank" = Textdatei in der es sich merkt welche Videos es bereits exportiert hat. So bearbeite ich immer nur neu hinzugekommene
- Es fragt noch, welche von den neuen man jetzt kopieren/konvertieren will
- Wählt man konvertieren, dann wandelt es die gewählten Videos in 720p um (Einstellungen für ffmpeg sind natürlich im Code frei anpassbar)
- Es speichert die Videos (konvertiert oder nicht, je nach Wahl) im Zielordner und falls gewünscht auch die Fanart, Poster und NFO (im Skript "Kodi-Dateien" genannt)
- Ich löse dabei bewusst meine Unterordner auf, damit ich die Videos auch beispielsweise mit dem MX-Player auf dem Tablet abschauen kann => ich will alles in einem Ordner. Kann man bei Bedarf natürlich ändern
- Damit das mit einem "Standard-Player" auch vernünftig geht, werden die Filme umbenannt und bekommen den Titel als Dateiname (unerlaubte Sonderzeichen werden rausgefiltert)
- Ist das Video kopiert, kommt sein Name in die "Datenbank" (falls gewünscht)
- Geschrieben habe ich das für meine Home-Videos die mit dem ganz oben verlinkten Skript für Kodi vorbereitet wurden. Aber generell müsste das mit allen Videos, auch Kinofilmen, genauso funktionieren
Hier noch der Code - achso, es handelt sich diesmal um ein PowerShell-Skript. Also bitte als .ps1 abspeichern und am besten mit PowerShell ISE öffnen und mit F5 starten. Gibt aber mehrere Arten PS-Skripte zu starten, Google hilft.
Es sollte im gleichen Ordner liegen wie die Unterordner mit den Originalvideos. Und es erwartet wieder den Unterordner \tools\ffmpeg.exe
# Input
$ZielOrdner = "C:\Users\blablabla\Ziel\"
$BereitsExportierteFilme = "ExportEVsPS-BereitsExportiert.txt"
# Einstellungen
#$DebugPreference = "Continue"
$DebugPreference = "SilentlyContinue"
[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")
# Steuerungs-Abfragen
Write-Host
Write-Host "########################"
Write-Host "### Einstellungen ####"
Write-Host "########################"
Write-Host
$Kodi = if($Value=(Read-Host "Sollen Kodi-Dateien mit exportiert werden? (Enter = ja)")){$Value}else{"ja"}
Write-Host
Write-Host "Kodi = " $Kodi
Write-Host
$Verkleinern = if($Value=(Read-Host "Sollen die Videos auf 720p verkleinert werden? (Enter = ja)")){$Value}else{"ja"}
Write-Host
Write-Host "Verkleinern = " $Verkleinern
Write-Host
$NZ = "`r`n"
$DBText = "Datenbank nutzen?" + $NZ + "Dann werden nur Videos exportiert, die noch nicht exportiert wurden." + $NZ + "Und die, die jetzt exportiert werden, kommen in die Datenbank-Datei." + $NZ + "(Enter = ja)"
$Datenbank = if($Value=(Read-Host $DBText)){$Value}else{"ja"}
Write-Host
Write-Host "Datenbank = " $Datenbank
Write-Host
Write-Host "########################"
Write-Host
# NFO-Dateien suchen
$AktuellerPfad = split-path $SCRIPT:MyInvocation.MyCommand.Path -parent
$NFODateien = Get-ChildItem -Path $AktuellerPfad -Recurse -Filter "*.nfo"
# Lege Datei fuer Titel an
$TitelDatei = $AktuellerPfad + "\ExportEVsPS-TitelZumExportieren.txt"
Remove-Item -Path $TitelDatei -ErrorAction SilentlyContinue
$TitelDateiUnsortiert = $AktuellerPfad + "\ExportEVsPS-TitelZumExportierenUnsortiert.txt"
Remove-Item -Path $TitelDateiUnsortiert -ErrorAction SilentlyContinue
# Gehe jede gefundene NFO durch
$DatenbankDatei = $AktuellerPfad + "\" + $BereitsExportierteFilme
$Zaehler = 1
ForEach ($Datei in $NFODateien) {
$Prozent = (($Zaehler-1) / $NFODateien.Count) * 100
Write-Debug $Prozent
Write-Debug $NFODateien.Count
Write-Progress -Activity "Suche alle Titel aus den NFOs" -PercentComplete $Prozent -Status "Bitte warten"
$BereitsExportiert = 0
$DateiName = $Datei -replace(".nfo","")
Write-Debug $DateiName
# Checke ob Film in Datenbank (falls DB-Funktion gewaehlt)
if (($Datenbank -eq "ja") -and (Test-Path $DatenbankDatei)) {
if (Select-String -Path $DatenbankDatei -Pattern $DateiName -SimpleMatch) {$BereitsExportiert = 1}
}
# wenn nicht in DB, schreibe Titel in Datei
if ($BereitsExportiert -eq 0) {
$Titelzeile = (Get-Content $Datei.FullName -Encoding UTF8)[2]
$Titel = $Titelzeile.Trim(" ")
$Titel = $Titel -replace("<title>","")
$Titel = $Titel -replace("</title>","") | Out-File $TitelDateiUnsortiert -Append
}
$Zaehler++
}
Write-Progress -Activity "Suche alle Titel aus den NFOs" -Status "Ready" -Completed
# Checke ob es zu exportierende Filme gibt
if (-not (Test-Path $TitelDateiUnsortiert)) {
$InfoText = "Anscheinend wurden keine neuen Videos zum Exportieren gefunden. Ich mach deswegen jetzt Feierabend." + $NZ + "Tipp: nfoDateien.txt ist vermutlich gleich lang wie ExportEVsPS-TitelZumExportieren.txt"
[System.Windows.Forms.Messagebox]::Show($InfoText)
exit
}
# Titeldatei sortieren und anzeigen
Get-Content $TitelDateiUnsortiert -Encoding UTF8 | sort -Descending | Out-File $TitelDatei
Remove-Item -Path $TitelDateiUnsortiert -ErrorAction SilentlyContinue
$InfoText = "Die folgende Liste soll die zu exportierenden Titel enthalten." + $NZ + "Sollen alle neuen Filme kopiert werden, so kann die Liste vollstaendig gelassen werden - vorhendene werden nicht neu umgewandelt. Original-Kopien ersetzen aber ggf. umgewandelte falls solche schon vorhanden sind."
write-Host $InfoText
start Notepad++ $TitelDatei
Write-Host
Read-Host -Prompt "Ist die Liste fertig und gespeichert? Dann weiter mit Enter"
# definierte Tool-Pfade
$FFPfad = $AktuellerPfad + "\tools\ffmpeg.exe"
# Gehe alle NFOs nochmal durch und exportiere die gewuenschten
$AnzahlExporte = 0
$Temp = get-content $TitelDatei
foreach ($TempZeile in $Temp) {
If ($TempZeile.trim()) {$AnzahlExporte = $AnzahlExporte + 1}
}
Write-Host $AnzahlExporte "Filme sind zu exportieren"
$Zaehler = 1
ForEach ($Datei in $NFODateien) {
# Fortschritt
$Prozent = (($Zaehler-1) / $AnzahlExporte) * 100
Write-Progress -Activity "Exportiere ausgewählte Filme" -PercentComplete $Prozent -Status ("Film " + $Zaehler + " von " + $AnzahlExporte)
# Titel ermitteln
$Titelzeile = (Get-Content $Datei.FullName -Encoding UTF8)[2]
$Titel = $Titelzeile.Trim(" ")
$Titel = $Titel -replace("<title>","") -replace("</title>","")
# Schaue nach, ob Titel in TitelDatei
if (Select-String -Path $TitelDatei -Pattern $Titel -SimpleMatch -Encoding UTF8) {
# Datum und Zeit ermitteln
$Sorttitle = (Get-Content $Datei.FullName -Encoding UTF8)[3]
$Sorttitle = $Sorttitle.Trim(" ")
$Sorttitle = $Sorttitle -replace("<sorttitle>","") -replace("</sorttitle>","")
$Jahr = $Sorttitle.Substring(0,4)
$Monat = $Sorttitle.Substring(4,2)
$Tag = $Sorttitle.Substring(6,2)
$Stunde = $Sorttitle.Substring(9,2)
$Minute = $Sorttitle.Substring(11,2)
$Sekunde = $Sorttitle.Substring(13,2)
# definiere Dateinamen
$QuelleMP4 = $Datei.FullName -replace(".nfo",".mp4")
$QuelleFanart = $Datei.FullName -replace(".nfo","-fanart.jpg")
$QuellePoster = $Datei.FullName -replace(".nfo","-poster.jpg")
$TitelFuerDateiname = $Titel -replace("(\:\-\))","") -replace ("(\;\-\))","") -replace("(\:\-\/)","") -replace("(\:\-\*)","") -replace("[?:/\\\*!]","") -replace("[\.]+"," ") -replace("[\s]+"," ") -replace('"',"")
$TitelFuerDateiname = $TitelFuerDateiname.Trim()
$ZielNFO = $ZielOrdner + $TitelFuerDateiname + ".nfo"
$ZielMP4 = $ZielOrdner + $TitelFuerDateiname + ".mp4"
$ZielFanart = $ZielOrdner + $TitelFuerDateiname + "-fanart.jpg"
$ZielPoster = $ZielOrdner + $TitelFuerDateiname + "-poster.jpg"
# exportiere jetzt endlich
if ($Verkleinern -eq "ja") {&$FFPfad -n -i $QuelleMP4 -c:v libx264 -preset slow -tune film -crf 23 -vf scale=-2:720 -c:a copy $ZielMP4}
else {Copy-Item $QuelleMP4 $ZielMP4}
if ($Kodi -eq "ja") {
Copy-Item $Datei.FullName $ZielNFO
Copy-Item $QuelleFanart $ZielFanart
Copy-Item $QuellePoster $ZielPoster
}
if ($Datenbank -eq "ja") {$DateiName = $Datei -replace(".nfo","") | Out-File $DatenbankDatei -append}
# Setze Datei-Zeitstempel
$Zeitstempel = Get-Date -Year $Jahr -Month $Monat -Day $Tag -Hour $Stunde -Minute $Minute -Second $Sekunde
$VerkleinerteDatei = Get-Item $ZielMP4
$VerkleinerteDatei.LastWriteTime = $Zeitstempel
$VerkleinerteDatei.LastAccessTime = $Zeitstempel
$VerkleinerteDatei.CreationTime = $Zeitstempel
$Zaehler++
} # Ende eigentliches exportieren
} # Ende alle NFO-Dateien nochmal durchgehen und ggf exportieren
Write-Progress -Activity "Exportiere ausgewählte Filme" -Status "Ready" -Completed
# Aufraeumen und Tschuess sagen
Remove-Item -Path $TitelDatei -ErrorAction SilentlyContinue
$InfoText = "Fertig. Jetzt sollte alles erledigt sein..."
[System.Windows.Forms.Messagebox]::Show($InfoText)
Alles anzeigen