automatische Wiedergabelisten

Status
Für weitere Antworten geschlossen.

botharg

Benutzer
Mitglied seit
19. Okt 2009
Beiträge
48
Punkte für Reaktionen
0
Punkte
12
Hallo Alle!

Ich habe mal wieder ein Script für Euch. Diesmal geht es um die Wiedergabelisten der Audiostation. Ich habe hier im Forum bezüglich Aufbau und automatischen Wiedergabelisten einiges gelesen, und praktisch jedesmal ging es darum, daß die User mit den Möglichkeiten welche die DS bietet nicht zufrieden sind, vor allem was das automatische aktualisieren anbelangt.

Hier nun von mir zumindest ein Ansatz für "automatisch aktualisierende" Wiedergabelisten.

Zuerstmal folgendes zum Aufbau der Wiedergabelisten der Audiostation:
Lage: normalerweise im "music" Ordner, also idR. in "/volumeX/music/playlists"
Aufbau: zumindest bei mir nach dem Schema: "../Ordner/.../muusikfile.mp3", was heisst, ausgehend aus dem "playlists"-Verzeichnis eins nach oben, und von dort den relativen Pfad zur jeweiligen Musikdatei. Der Typ der Playlist sollte "m3u" sein.

Nun habe ich etliche Vorschläge gelesen, wie man eigene Playlisten erzeugen kann, und die meisten laufen darauf hinaus, mit Programm X eine eigene Liste zu erstellen und diese dann mit einem Texteditor nachträglich zu manipulieren. Leider bleibt einem bei wirklich speziellen Listen/Einträgen nichts anderes übrig.
Wer sich allerdings damit zufrieden gibt, vorher festzulegen, was in der Liste eigentlich stehen soll und mit seinen Wünschen innerhalb den Möglichkeiten des Filesystems bleibt, kann recht einfach eigene Playlisten erstellen lassen, die sogar immer aktuell sein können.
Die Sache hat allerdings einen Haken: Die Playlisten (als Name) müssen in der Postgres Datenbank stehen. Da ich keine besondere Lust hatte, mich mit der Manipulation dieser Datenbank zu beschäftigen, wählte ich die einfachste Lösung:
Die benötigte Playlist wird einfach mittels der Audiostation-"Bibliothek" angelegt, wird allerdings leer gelassen. Damit habe ich erreicht, daß es für das System die entsprechende Playlist gibt un dich kann damit machen was ich will.
Möchte ich also eine Playlist haben, die ich später mit "Jazz" relevanten Inhalten befüllen möchte, lege ich einfach die Playlist "Jazz" an.
Nun komme ich zum Script-Teil:
der Aufbau meines Musik-Ordner ist "/volume1/music/Genre/Interpret/Album/...";
per "find" kommando kann man auf der Shell wunderbar filtern lassen, wonach man sucht; per "cd /volumeX/music/playlists" in das Playlist Verzeichnis wechseln (das ist wichtig, da so bei der Abfrage automatisch der richtige "Pfadaufbau" generiert wird.
Rich (BBCode):
find .. ! -iwholename '*@eadir*' \( -iname "*.mp3" -o -iname "*.m4a" -o -iname "*.ogg" -o -iname "*.aac" \) | grep -i /jazz/ > "Jazz.m3u"
Es wird nun nach allen mp3,m4a,ogg und aac Dateien gesucht, jedoch nicht in Verzeichnissen "@eadir" (die werden von der DS angelegt). In den Ergebnissen wird gefiltert ob (idF.) ein Verzeichnis "jazz" existiert (und das suche ich ja, weil das mein Genre ist). Diese Ergebnisse wiederum werden in die Datei "Jazz.m3u" geschrieben.
Da der Audiostation zuvor mitgeteilt wurde, daß eine Playlist mit diesem Namen existieren soll, kann man nun in die Audiostation wechseln, und die Playlist "Jazz" auswählen - et voila! Alles was vorhin gefunden wurde, taucht nun in dieser Liste auf.
Mit dieser Erkenntnis könnte man nun auf den Gedanken kommen, mittels cronjob die Playlist automatisch aktuell zu halten. Dazu sollte man allerdings ein reguläres Script hinterlegen
 

botharg

Benutzer
Mitglied seit
19. Okt 2009
Beiträge
48
Punkte für Reaktionen
0
Punkte
12
Ich habe nun also eine Scriptdatei erstellt und in "/root" als "playlists.sh" abgelegt:
Rich (BBCode):
#!/bin/sh

cd /volume1/music/playlists

listname=last30days
listfile="$listname.m3u"
echo
echo suche nach: alles juenger als 30 Tage
echo schreibe Playlist: $listfile
echo
find .. -mtime -30 ! -iwholename '*@eadir*' \( -iname "*.mp3" -o -iname "*.m4a" -o -iname "*.ogg" -o -iname "*.aac" \) > "$listfile"
chown admin:users "$listfile"
chmod 777 "$listfile"

listname=hardnheavy
listfile="$listname.m3u"
echo suche nach: aus HardnHeavy-Ordner
echo schreibe Playlist: $listfile
echo
find .. ! -iwholename '*@eadir*' \( -iname "*.mp3" -o -iname "*.m4a" -o -iname "*.ogg" -o -iname "*.aac" \) | grep -i /$listname/ > "$listfile"
chown admin:users "$listfile"
chmod 777 "$listfile"

suche=*george*michael*
listname=george_michael
listfile=$listname.m3u
echo suche nach: $suche
echo schreibe Playlist: $listfile
echo
find .. ! -iwholename '*@eadir*' \( -iname "$suche.mp3" -o -iname "$suche.m4a" -o -iname "$suche.ogg" -o -iname "$suche.aac" \) > "$listfile"
chown admin:users "$listfile"
chmod 777 "$listfile"
suche=*michael*george*
listname=george_michael
listfile=$listname.m3u
echo suche nach: $suche
echo schreibe Playlist: $listfile
echo
find .. ! -iwholename '*@eadir*' \( -iname "$suche.mp3" -o -iname "$suche.m4a" -o -iname "$suche.ogg" -o -iname "$suche.aac" \) >> "$listfile"
chown admin:users "$listfile"
chmod 777 "$listfile"

suche=*depeche*mode*
listname="Depeche Mode"
listfile=$listname.m3u
echo suche nach: $suche
echo schreibe Playlist: $listfile
echo
find .. ! -iwholename '*@eadir*' \( -iname "$suche.mp3" -o -iname "$suche.m4a" -o -iname "$suche.ogg" -o -iname "$suche.aac" \) > "$listfile"
chown admin:users "$listfile"
chmod 777 "$listfile"
Jede dieser "Playlists" muß natürlich zuvor in der Audiostation Bibliothek erstellt worden sein, sonst wird die Datei zwar angelegt, steht dann aber nicht zur Auswahl.

Aufbau der einzelnen Blöcke:
* zuerst wird in das Playlist-Verzeichnis gewechselt

* es wird festgelegt, nach welchem Kriterium gesucht wird (als Teil des Pfades): listname
oder
* es wird festgelegt wonach gesucht werden soll (nach Syntax des Dateisystems): suche
* es wird festgelegt was angezeigt wird, wonach gesucht wird
* es wird festgelegt wie das "listfile", also die eigentliche Playlist heissen soll, wobei die vorige Festlegung+".m3u" benutzt wird
* Ausgabe der Variablen, damit man zumindest einigermassen im Bilde ist, wo das Script gerade steckt
* die Suche wird initiiert und die Playlist erstellt
* die Dateiberechtigungen der erstellten Liste werden angepasst, da diese sonst evtl. dem "falschen" Benutzer gehören und andere nicht zugreifen können

Dieses Script kann nun zB. als cronjob abgearbeitet werden. Interessant sind in diesem Zusammenhang gerade die Möglichkeiten per "find" etwa alles was jünger als X Tage, älter als X tage ist, oder auch alles worauf innerhalb von X Tagen Zugegriffen wurde. Dummerweise kann man mit dieser Möglichkeit nur innerhalb der Möglichkeiten des Dateisystems arbeiten, dh. wenn ich gerade einen ganzen Zweig reinkopiert habe, oder zB. die Tags geändert habe, treffen die gerade genannten Kriterien natürlich nicht mehr so zu wie es eigentlich geplant war.

Man sollte sich ein bißchebn mit den einzelnen Blöcken auseinandersetzen, um genau zu Verstehen, was dort gemacht werden soll. Ausprobieren sollte man das Ganze in einem eigenen Verzeichnis, vor allem wenn man selber Veränderungen gemacht hat. So ist es nicht ganz so tragisch, wenn etwas nicht funktioniert wie erwartet.
Es sollte zwar eigentlich nichts Übles passieren, da nichts gelöscht wird, aber Sicher ist Sicher.

Ich bin gespannt ob jemand was damit anfangen kann, und wie immer für jeden Hinweis offen. Ausserdem würde mich interessieren, welche eigenen "Änderungen" ihr gemacht hab...

Gruß an Alle
 
Zuletzt bearbeitet:

Whitesheep

Benutzer
Mitglied seit
29. Mai 2009
Beiträge
81
Punkte für Reaktionen
2
Punkte
14
Hallo

erst mal ein lob ist genau das was ich brauche für meine Massen an Music ;)

Habe leider ein Problem.
Meine DS409+ steigt beim find befehl mit folgender meldung aus eine Idee wieso?

Rich (BBCode):
BusyBox v1.1.0 (2010.01.25-13:46+0000) multi-call binary

Usage: find [PATH...] [EXPRESSION]

Das Script sieht wie folgt aus

Rich (BBCode):
listname=Test
listfile="$listname.m3u"

find .. ! -iwholename '*@eadir*' \( -iname "*.mp3" -o -iname "*.m4a" -o -iname "*.ogg" -o -iname "*.aac" \) | grep -i /$listname/ > "$listfile"

chown admin:users "$listfile"
chmod 777 "$listfile"


Habe unter /volume1/music/ ein Ordner angelegt der "Test" heist und dort ein par lieder rein kopiert zum testen.
Playlist "Test" ist in der Audiostation auch angelegt.

So wie ich mich kenne ist es wieder irgendwas kleines was ich übersehe :(
 

botharg

Benutzer
Mitglied seit
19. Okt 2009
Beiträge
48
Punkte für Reaktionen
0
Punkte
12
Hallo Whitesheep!

Ich habe momentan keinen Zugriff auf meine Busybox (bin nicht zuhause), aber die Syntax scheit soweit in Ordnung.
Die Fehlermeldung allerdings weist für mich in Richtung Busybox-Befehle ... was heissen soll, dass ich im Beitrag leider nicht erwähnt hatte, daß ich den find-Befehl aus dem IPKG Repositiry benutze, weil der eben mehr Parameter unterstützt als die Version aus der DS.
Wenn Du IPKG auch installiert hast, reicht eigentlich ein

Rich (BBCode):
ipkg install findutils
ipkg install findutils-doc

und dann sollte auch das Script funktionieren.

***edit
mir ist gerade gerade eingefallen, daß ich meine FW ja doch schon instruiert hatte gewisse Ports weiterzuleiten ...
Also: Habe Deine Variante vom Script kopiert und bei damit eins mit Namen "Testscript.sh" erstellt.
Ordner "Test" erstellt und Musik reinkopiert. Script laufen lassen - funzoniert. Liegt also sehr wahrscheinlich am "falschen" find- Befehl

Und noch was:
unbedingt darauf achten, daß der der Aufruf von "find" aus dem "playlists" Verzeichnis erfolgt, sonst findet er entweder garnix oder was falsches. Deshalb steht bei mir auch als erstes "cd /volume1/music/playlists" im Script.
Wenn das Scipt dann gestartet wird, wechselt DIESE INSTANZ das Verzeichnis und arbeitet, danach bist Du trotzdem noch in dem Verzeichnis, aus dem Du das Script ursprünglich gestartet hast.
Ausserdem stimmt nur dann der "gefundene" Pfad, nämlich mit den "../" am Anfang. Man kann den Pfad zwar auch schön umbiegen mit diversen Kunstgriffen, aber warum mehr Arbeit als nötig?


Gruß :D
 
Zuletzt bearbeitet:

Whitesheep

Benutzer
Mitglied seit
29. Mai 2009
Beiträge
81
Punkte für Reaktionen
2
Punkte
14
1A funktioniert bei mir jetzt auch prima
 

rumknapser

Benutzer
Mitglied seit
02. Mai 2013
Beiträge
329
Punkte für Reaktionen
6
Punkte
24
Playlisten für einzelne User liegen bei /usr/syno/etc/preference/<username>/playlists

Hi,
ich wollte mich a) bedanken für die netten Ideen in diesem Post und b) noch hinzufügen, das Playlisten auch hier gespeichert sein könnten:
Rich (BBCode):
/usr/syno/etc/preference/<username>/playlists/
Ich habe mich gewundert, das bei mir keine Playlisten im o.g. Verz. /volume1/music/playlists angelegt wurden, wenn ich in der Audio Station ebendiese erstellt habe.
Dann kam mir in den Sinn, das ich dem User, mit dem ich eingeloggt war, irgendwie erlaubt hatte, eigene Playlists zu verwalten, nicht nur gemeinsame.
Ergo denke ich, ist das wohl der Grund dafür, das man die Playlisten (auch) an diesem Ort findet.

Entsprechend müssen die Pfade innerhalb der Playlist auch (leider) so aussehen:
Rich (BBCode):
../../../../../../volume1/pfad/zur/musik/titel.mp3

D.h. der Find Befehl muss entsprechend angepasst werden:
Rich (BBCode):
find ../../../../../../volume1/pfad/zur/musik/ [und dann der Rest aus den obigen Posts]





Die Sache hat allerdings einen Haken: Die Playlisten (als Name) müssen in der Postgres Datenbank stehen.
Jede dieser "Playlists" muß natürlich zuvor in der Audiostation Bibliothek erstellt worden sein, sonst wird die Datei zwar angelegt, steht dann aber nicht zur Auswahl.
Bei mir (DSM 4.2-3211) scheint es auf Anhieb zu funktionieren. Ich habe testweise eine Playlist auf der Konsole angelegt und diese erschien nach Neuladen des Playlist-Ordners automatisch, ohne das ich eine gleichnamige Playlist in der AudioStation anlegen musste. (Welch eine Entspannungsmöglichkeit!)
 
Zuletzt bearbeitet:
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat