Autor Thema: Umwandlung von iTunes Playlists in Logitech Mediaserver Playlists mit perl?  (Gelesen 2381 mal)

Offline grossmaggul

  • Sr. Member
  • ****
  • Beiträge: 644
    • Mein Blog
Hallo,

ich arbeite mich gerade in Perl ein und möchte ein bestimmtes Problem lösen, komme da aber mit den üblichen "Einsteiger-Tutorials" nicht weiter.
Da ich nicht in einem speziellen Perl Forum angemeldet bin und mein Problem indirekt auch was mit FHEM zu tun hat, versuche ich mein Glück erstmal hier.

Ich würde gerne die von Apples iTunes/Music erzeugten Playlists so aufbereiten, daß mein Logitech Mediaserver(LMS) damit zurechtkommt, dazu müsste ich die Playlistdatei zeilenweise einlesen, eine bestimmte Zeile verdoppeln, diese dann bearbeiten und wieder zurückschreiben.*

Geht das mit perl überhaupt und wenn ja, kann man eine Datei zum Lesen öffnen, die eingelesene Zeile verdoppeln, bearbeiten und dann gleich wieder zurückschreiben oder muss ich die ganze Datei einlesen, bearbeiten und dann wieder zurückschreiben.

*Etwas genauer: Die playlists von iTunes erzeugen nur #EXTINF Zeilen(enthalten Name und Pfad des Titels), die lassen sich auch eigentlich direkt von LMS lesen, es gibt aber Probleme wenn die Musiktitel oder Pfade Umlaute der sonstige Sonderzeichen enthält, dann werden diese Titel im LMS gar nicht angezeigt. Damit auch diese angezeigt werden enthalten die Playlisten des LMS noch eine Zeile #EXTURL, die eine URI des Pfades enthält.
Das sieht z.B. dann so aus:
#EXTURL:file:///media/nas/music/Stan%20Getz%20&%20Jo%C3%A3o%20Gilberto/Getz%20_%20Gilberto/05%20Desafinado.mp3
#EXTINF:251,Desafinado
/media/nas/music/Stan Getz & João Gilberto/Getz _ Gilberto/05 Desafinado.mp3


gm
« Letzte Änderung: 06 Februar 2022, 18:32:07 von grossmaggul »
FHEM auf Debian Buster Server, 2 x nanoCUL868, 1xnanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1, 1 x IT-3000

Offline Beta-User

  • Moderator
  • Hero Member
  • ***
  • Beiträge: 18716
...nun ja... vermutlich führen viele Wege nach Rom, und "echte" Text-Manipulation in Files ist jetzt nicht unbedingt das Kern-Thema in FHEM.

Vorab ein Link, wie man derartige Problemchen uU. außerhalb von Perl lösen kann: https://forum.fhem.de/index.php/topic,98880.msg1056534.html#msg1056534 (da ist aber "nur" eine "dumme" Ergänzung des Files mit vorhandenen Bausteinchen drin, du brauchst dazwischen ja noch eine etwas komplexere Transformation und uU. auch die Prüfung, ob die betreffende Zusatzzeile schon drin steht).

Sowas würde ich dadurch lösen, dass die file ganz eingelesen wird - in ein zeilen-separiertes Array, und dann das Array durchgegangen, die vorhandenen Teile und die Ergänzungen in ein weiteres Array geschrieben werden und letzteres dann am Ende auf den Datenträger geschrieben wird. Im FHEM-Kontext gibt's dazu FileRead und FileWrite, den Quelltext kannst du für außerhalb ja als Vorlage nehmen (https://svn.fhem.de/trac/browser/trunk/fhem/fhem.pl#L5644 ff).
Server: HP-T620@Debian 11, aktuelles FHEM@ConfigDB | CUL_HM (VCCU) | MQTT2: MiLight@ESP-GW, BT@OpenMQTTGw | MySensors: seriell, v.a. 2.3.1@RS485 | ZWave | ZigBee@deCONZ | SIGNALduino | MapleCUN | RHASSPY
svn: u.a MySensors, Weekday-&RandomTimer, Twilight,  div. attrTemplate-files

Offline grossmaggul

  • Sr. Member
  • ****
  • Beiträge: 644
    • Mein Blog
Danke, das hilft mir schon weiter!

Es ging auch erstmal nicht darum das über FHEM zu lösen, sondern das perl Programm würde erstmal nur über die Linuxkonsole aufgerufen.
FHEM auf Debian Buster Server, 2 x nanoCUL868, 1xnanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1, 1 x IT-3000

Offline CoolTux

  • Developer
  • Hero Member
  • ****
  • Beiträge: 27935
Hier gibt es wie erwähnt viele Wege. Ein einfaches open() und dann durch eine while Schleife mit Regex. Oder Du kannst

use Path::Tiny;
my $dir = path("/home/User/sensors");    # Config Directory there find the id-file
my $file = $dir->child("id.list");

Eine Datei einlesen und wieder über ne Schleife den Inhalt prüfen.
Ich würde es über open() machen

use autodie qw /:io/;
use Try::Tiny;

...
...

sub jsonFileRead {
    my @file;

    try {
        open my $fh, q{<}, $JSONFILE;
        @file = do { local $/ = undef; <$fh> };
        close $fh;
    }
    catch {
        if ( $_->isa('autodie::exception') && $_->matches(':io') ) {
           
        }
        else {
            croak $_;
        }
    };    # Note semicolon.

    return \@file;
}

Ich habe aus dem Beispiel einiges rausgenommen. So sollte es aber möglich sein ein File eintsprechend ein zu lesen.
Du musst nicht wissen wie es geht! Du musst nur wissen wo es steht, wie es geht.
Support me to buy new test hardware for development: https://www.paypal.com/paypalme/MOldenburg
My FHEM Git: https://git.cooltux.net/FHEM/
Mein Dokuwiki:
https://www.cooltux.net

Offline grossmaggul

  • Sr. Member
  • ****
  • Beiträge: 644
    • Mein Blog
Danke Dir, werde ich mir mal zu Gemüte führen.
FHEM auf Debian Buster Server, 2 x nanoCUL868, 1xnanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1, 1 x IT-3000

Offline grossmaggul

  • Sr. Member
  • ****
  • Beiträge: 644
    • Mein Blog
Ich habe mich die letzten Tage mal mit meinem Problem beschäftigt und habe inzwischen ein Konstrukt gebaut mit dem ich das erreiche was ich möchte, zumindest fast.

Problem in der von Apples Music erzeugten Playlist ist zum einen, daß die Zeilen mit CR statt LF abgeschlossen werden, das konnte ich aber lösen.

Das zweite Problem, beim Versuch einen Umlaut(und auch andere Sonderzeichen) wie beispielsweise "ö" in "%C3%B6 umzuwandeln scheiterte mein Programm an bestimmten Stellen kläglich, denn die von Apple Music erzeugte Zeile mit dem Dateipfad enthält das "ö" folgendermaßen zusammengesetzt "%6F%CC%88", das führte dann zu einem "o%CC%88".

Die Frage nun, wie kann ich die zusammengesetzten Umlaute am geschicktesten in die "einfachen" Umlaute umwandeln. Ich vermute es hat etwas mit der Zeichenkodierung zu tun, ich habe da auch schon einiges gelesen, bin über NFC, NFD, NFKC, NFKD gestolpert und compose und decompose, aber irgendwie werde ich da nicht schlau draus bzw. wie ich das anwende. Vielleicht könnte mir da mal jemand unter die Arme greifen.

gm
FHEM auf Debian Buster Server, 2 x nanoCUL868, 1xnanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1, 1 x IT-3000

Offline grossmaggul

  • Sr. Member
  • ****
  • Beiträge: 644
    • Mein Blog
Danke, hat sich erledigt.
FHEM auf Debian Buster Server, 2 x nanoCUL868, 1xnanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1, 1 x IT-3000

Offline grossmaggul

  • Sr. Member
  • ****
  • Beiträge: 644
    • Mein Blog
Ich habe fertig, vielleicht kann es ja jemand brauchen.
Ich bitte nicht zu kritisch zu sein, ich übe ja noch. ::)

In meinem Blog habe ich noch ein paar warme Worte dazu geschrieben, da gibt's dann auch immer die aktuelle Version.
FHEM auf Debian Buster Server, 2 x nanoCUL868, 1xnanoCUL465; Homematic, MAX, MiLight, HUE,  2 x Gosund SP1, 1 x IT-3000

 

decade-submarginal