pyload - automatische Sortierung von Serien mit Bash
Nachdem ich nen Haufen Serien runterlade und sich da im Laufe der Zeit dann im download Ordner von pyload eine ganze Menge ansammelt dacht ich mir das müsste sich doch mit einem netten bash S***** automatisieren lassen die richtig in einen Serien Ordner einzusortieren ;)
Da das vielleicht auch der eine oder andere gerne hätte post ich das mal hier zur freien Verwendung.
Folgende Einstellungen müssen im pyload vorgenommen werden damit das funktionieren kann:
General -> "Create Folder for each package" auf "an"
Permissions -> es muss sichergestellt werden das der user der das S***** laufen lässt auch Schreibzugriff auf alle Ordner / Dateien hat die pyload runterlädt / erstellt.
Sieht bei mir zb folgendermaßen aus:
Code:
Groupname "users"
aus
an
root
0770
aus
0770
aus
Damit wird jeder neu erstellten Datei / Verzeichnis lese und schreibrechte für den Besitzer root und die Gruppe users gesetzt.
Damit pyload noch zugriff darauf hat (das als service bei mir läuft unter dem user nobody) hab ich den user nobody der Gruppe users hinzugefügt
Zusatzprogramme -> ExtractArchive -> "Extract archives in archvies" auf "an"
Zusatzprogramme -> ExtractArchive -> "Create subfolder for each package" auf "an"
Zusatzprogramme -> ExtractArchive -> "Extract files to" Pfad merken um das S***** anzupassen
Zusatzprogramme -> ExtractArchive -> "Delete Archives when done" auf "an" (braucht ja keiner mehr nach dem extracten) Erklärung des S*****s:
Man braucht eine geordnete Struktur im download Ordner damit sich die Serien / Staffeln unterscheiden lassen.
Lädt man zb "Walking Dead S03E02" runter ergibt sich im download Ordner üblicherweise folgende Struktur:
Code:
downloadordner/Walking Dead S03E02/itg-twds03e02.avi
downloadordner/Walking Dead S03E02/itg-twds03e02-sample.avi
downloadordner/Walking Dead S03E02/Ordner-aus-dem-archiv/jede-menge-kleine-rar-dateien
Das S***** macht nun folgendes:
- Durchsuchen aller Ordner die den Namen den man unter "name" definiert hat enthallten nach:
1. Dateien die "sample" enthallten um die samples ggf. zu löschen
2. Alle avi Dateien darin suchen und ins Ziel verschieben
3. ggf. Zielordner erstellen sofern diese noch nicht vorhanden sind und dessen Benutzerrechte anpassen
4. die Verzeichnisse aus dem download Ordner löschen
Beim hinzufügen der Dateien im Downloader muss sichergestellt sein das diese richtig benannt sind zb "Walking Dead S03E02".
Ladet man sich DLCs von share-links ist das eh normalerweise schon der Fall.
Nun das S*****:
Code:
#!/bin/bash
#Variablen für die Suche setzen
#-> brauchen nicht für jede Serie angepasst zu werden
search="*.avi" #Dateityp definieren
sourcedir="/mnt/int/pyload/" #absoluter Dateipfad wo die Dateien aktuellen liegen
globaldestinationdir="/mnt/int/serien/" #Zielpfad (für alle Serien gleich)
usergroup="users" #Benutzergruppe für neue Verzeichnisse
umaskused="007" #umask für neue Verzeichnisse
i=-1 #Counter startwert -1
############################################################################
#Serien definieren
#für jede weitere Serie alle drei Zeilen kopieren und
#innerhalb des Blocks anhängen.
#die let i=i+1 Zeile unverändert lassen
let i=i+1 #array counter um 1 raufsetzen
#relativer Zielpfad (wird an $globaldestinationdir angehängt)
destinationdir[$i]="The Walking Dead/S03/"
#Name der Serie (muss genau so ein Teil des Verzeichnis Namens sein)
name[$i]="Walking Dead S03"
let i=i+1 #array counter um 1 raufsetzen
#relativer Zielpfad (wird an $globaldestinationdir angehängt)
destinationdir[$i]="Noch so ne Serie/S01/"
#Name der Serie (muss genau so ein Teil des Verzeichnis Namens sein)
name[$i]="Noch so ne Serie S01"
#PART 1
#Löschen vorhandener Sample Files
echo "PART 1 -> sample Files löschen"
for x in $(seq 0 $i)
do
#Ordner finden die den Namen der Serie enthalten
#danach in jedem gefundenen Ordner nach sample Files suchen
find "${sourcedir}" -name "*${name[$x]}*" -exec find "{}" -name "*sample*" \; | while read FILE; do
#Samples löschen
rm -v "${FILE}"
done
done
#PART 2
#Dateien sortieren und verschieben
echo "PART 2 -> Files verschieben"
for x in $(seq 0 $i)
do
#Zielverzeichnis erstellen (falls es nicht existiert) und Dateirechte anpassen
( umask ${umaskused} ; mkdir -p -v "${globaldestinationdir}${destinationdir[$x]}" ; )
chown -R -v :${usergroup} "${globaldestinationdir}${destinationdir[$x]%%/*}"
#Ordner finden die den Namen der Serie enthalten
#danach in jedem gefundenen Ordner nach Dateien suchen die dem $search Kriterium entsprechen
find "${sourcedir}" -name "*${name[$x]}*" -exec find "{}" -name "${search}" \; | while read FILE; do
#jede gefundene Datei ins entsprechende Zielverzeichnis verschieben
mv -v "${FILE}" "${globaldestinationdir}${destinationdir[$x]}"
done
done
#PART 3
echo "PART 3 -> Dirs löschen"
#Verzeichnisse mit allen restlichen Inhalten löschen (zb unterarchive)
for x in $(seq 0 $i)
do
find "${sourcedir}" -name "*${name[$x]}*" -exec rm -R -v "{}" \;
done
exit
Als erstes muss man nun das S***** an seine eigene Ordnerstruktur anpassen:
- sourcedir: man trägt das ein was in pyload im ExtractArchive eingetragen ist (mit Slash / am schluss)
- globaldestinationdir: das Zielverzeichnis eintragen in dem alle Serien abgelagert werden
- usergroup: Die Gruppe die für alle neu erstellten Verzeichnisse eingestellt wird
- die umask für neu erstellte Verzeichnisse (007 = besitzer und gruppe lesen/schreiben, andere gar nichts)
- im Block mit den vielen # kopiert man für jede Serie die man eingeordnet haben möchte die 3 (ohne Kommentarzeilen gezählt) Zeilen, beginnend mit "let i=i+1)
- destinationdir ist dann ein relativer Pfad. Er kann mehrere Subordner enthallten um zb Staffeln zu trennen.
- name ist ein Teil des jetzigen Ordnernamens. Am besten man trägt hier sowas wie "Walking Dead S03" ein. Funktioniert natürlich auch ohne das S03, aber wenn es zu dem Fall kommt das man mal mehrere Folgen verschiedener Staffeln runtergeladen hat kann das S***** diese dann nicht mehr unterscheiden
P.S: Verwendung auf eigene Gefahr
Ich rate dringend davon ab das s***** als root / sudo laufen zu lassen
Außerdem ist keinerlei Fehlerroutine enthallten, kommt es also zu einem Fehler (weil zb am Ziel kein Platz mehr ist oder Dateirechte falsch gesetzt sind) werden die Quelldateien trotzdem gelöscht
Das S***** wurde auch nur unter Arch Linux getestet, keine Garantie das es 1:1 unter Ubuntu/Debian läuft
P.P.S: Folgt soon(tm)
Wahrscheinlich pass ich das S***** demnächst noch so an das man es auch mit Parametern aufrufen kann zb: