• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

[>Gelöst] 2 Fragen zu Musik-files

So, nun habe ich eine Menge audio/sound-converter, sowie etliche TAG-utilities für die ich mich hier nochmal final bedanken möchte.
Mir kommt der düstere Verdacht, daß ich, bis ich deren Bedienung incl. aller Abkürzungen und Verknüpfungen verstanden habe und anwenden kann, ich so weit gealtert bin, daß ich den MP3-Player gar nicht mehr hören kann. :lol:
 
Hallo,

doch noch zu dem Perl-Versuch oben:

Vielen Dank, daß Du mir das nicht zumuten wolltest.
Jetzt haben aber schon die Modulinstallation und das erste Skript bei Dir geklappt, da hab ich das Skript dann doch weitergeschrieben.
Bitte kopiere doch mal, sagen wir 5 Deiner MP3s in ein Verzeichnis, nenne mein neues Skript "customtags.pl", tue es ebenfalls in das Verzeichnis mit den MP3s, mache "chmod +x customtags.pl" und starte es dann dort mit "./customtags.pl":

Code:
#!/usr/bin/perl -w
use strict;

#
# customtags.pl, by abgdf@gmx.net, 2007, Licence: LGPL.
#
# Sort MP3s in a directory in an order entered by the user and
# add numbers (01SongA, 02SongB, etc.) to the title-tags of the
# MP3s according to this order.
#
# Besides printing to the screen, some output is also stored in
# the file "customtagsout.txt" in the working directory, so it's also
# possible to view long MP3-lists and take some time to think
# about a new order for them.
#

use MP3::Tag;
use FindBin qw($Bin);

sub getTitle()
{
    my $mp3 = MP3::Tag->new($_[0]) or die "Error opening File, probably not found.\n";
    my $title = $mp3->title();
    $mp3->close();
    return $title;
}


sub renameTitle()
{
    my $mp3 = MP3::Tag->new($_[0]) or die "Error opening File, probably not found.\n";
    $mp3->update_tags({title => $_[1]});
    $mp3->close();
}


sub main()
{
    opendir(DIR, $Bin) or die "Error opening directory.\n";

    my @dir = readdir(DIR);
    closedir(DIR);

    my @mp3s = ();
    my @new= ();
    my @titles = ();
    my @titles2 = ();
    my $a="";
    my $i=0;
    my $u=0;
    my $x=0;
    my $or = "";
    my $tag = "";
    my @order = ();


    foreach(@dir)
    {
        if ($_ =~ m/mp3$/i)
        {
            push(@mp3s, $_);
        }
    }

    @mp3s = sort(@mp3s);

    system("clear");

    open (FILE, ">$Bin/customtagsout.txt") or die ("Error opening file for writing.\n");

    print "\nMP3s found in this directory:\n\n";
    print (FILE "MP3s found in this directory:\n\n");

    for($i=0; $i <= $#mp3s; $i++)
    {
        print sprintf("%s", ($i + 1)).".\t".$mp3s[$i]."\n";
        print (FILE sprintf("%s", ($i + 1)).".\t".$mp3s[$i]."\n");
    }

    print "\n";
    close FILE;

    print "Now please enter a new order (Example: 3,5,2,4,1): ";
    chomp($or = <stdin>);
    @order = split(",", $or);


    # Check, if something valid is entered.

    foreach(@order)
    {
        if ($_ =~ m/[^0-9]/)
        {
            print "\nPlease enter just numbers, separated by commata.\n";
            print "Please run the script again.\n\n";
            exit;
        }
    }

    for($i=0; $i <= $#mp3s; $i++)
    {
        $x = 0;
        foreach(@order)
        {
            if($_ == $i + 1)
            {
            $x = 1;
            }
        }
        if ($x == 0)
        {
            print "\nPlease enter all numbers in the list above, separated by commata.\n";
            print "Please run the script again.\n\n";
            exit;
        }
    }

    if ($#order != $#mp3s)
    {
        print "\nSorry, you've somehow entered too many numbers.\n";
        print "Please run the script again.\n\n";
        exit;
    }


    open (FILE, ">>$Bin/customtagsout.txt") or die ("Error opening file for writing.\n");

    for($i=0; $i <= $#mp3s; $i++)
    {
        $new[$i] = $mp3s[$order[$i] - 1];
    }

    print "\nOk, the MP3s are now sorted like this:\n\n";
    print (FILE "\nThe MP3s are now sorted like this:\n\n");

    for($i=0; $i <= $#new; $i++)
    {
        print sprintf("%s", ($i + 1)).".\t".$new[$i]."\n";
        print (FILE sprintf("%s", ($i + 1)).".\t".$new[$i]."\n");
    }

    close FILE;

    print "\nDo you want to add numbers in front of the title-tags according to this (y/n)\n(I don't check if such numbers have been added to the tags before) ?\n\n";
    chomp($tag = <stdin>);

    if ($tag ne "y")
    {
        print "\nBye.\n\n";
        exit;
    }

    open (FILE, ">>$Bin/customtagsout.txt") or die ("Error opening file for writing.\n");

    foreach(@new)
    {
        push(@titles, &getTitle($Bin."/".$_));
    }

    for($i=0; $i <= $#new; $i++)
    {
        $a = sprintf("%s", $i + 1);
        if ($order[$i] < 10)
        {
            $a = "0".$a;
        }

        $titles[$i] = $a.$titles[$i];

        &renameTitle($Bin."/".$new[$i], $titles[$i]);
    }

    foreach(@new)
    {
        push(@titles2, &getTitle($Bin."/".$_));
    }

    print "\nOk, the titles of the MP3s now look like this:\n\n";
    print (FILE "\nThe titles of the MP3s now look like this:\n\n");

    for($i=0; $i <= $#new; $i++)
    {
        print sprintf("%s", ($i + 1)).".\t".$titles2[$i]."\n";
        print (FILE sprintf("%s", ($i + 1)).".\t".$titles2[$i]."\n");
    }

    print "\n";
    close FILE;
}

&main;

Na, kommst Du so klar 8) ?

Viele Grüße
 
Welch ein Tag! :D :mrgreen: :D
Das script läuft, alle Indizes gehen wieder nach oben und der erste Motorradausflug > 3h
Das könntest Du fast in ein HowTo verwandeln. Fass' das jetzt nicht als Gemecker auf, man darf das script nicht mehrfach laufen lassen und meine ollen Tags führen zu Mecker im output ansonsten war es DAS, was ich suchte. Ich schick dir das Protokoll vom Durchlauf als PN. Wundere dich nicht, daß hier nur 2 Stücke auszutauschen waren .. meine anderen Beispiele haben irre lange Titel.
Lass' mich doch noch gleich mal unverschämt werden: Siehst du eine Möglichkeit die Tagergänzung wieder zu entfernen, falls man mal umsortieren möchte, zB. statt Komponist, das Instrument, oder was auch immer? Ich stell mir das wesentlich aufwendiger vor, aber da du ganz augenscheinlich DICKBrettbohrer bist... :p :lol: (Weiß nicht so recht ob hier :p oder :lol: besser paßt)
 
Ha, freut mich, daß es im Prinzip läuft !

Die Fehler werde ich wohl nicht wegkriegen, da sie am Perl-Modul liegen. Dieses kann offenbar (noch) nicht "ID3v2-Tag version: v2.4.0" verarbeiten. Das Modul umzuarbeiten, bzw. zu erweitern wäre wohl etwas schwierig. Vielleicht machen das eines Tages die Modul-Autoren.

Siehst du eine Möglichkeit die Tagergänzung wieder zu entfernen

Ja, die einfachste ist, das Skript nur über Kopien Deiner MP3s laufen zu lassen. Die Originale behalten dann ja die alten Tags :wink: ...

Jedenfalls erstmal viel Spaß mit dem bisherigen Skript !

Viele Grüße
 
:p Du darfst 3x raten, über welche files Dein script lief :p
Sollte Dich der Ehrgeiz packen -was mich bei Dir nicht wundern würde- schick mir's einfach per PN.
Nochmal: Je vous remerci bien!
 
Hallo nochmal,

einen Versuch, mit Deinen Tags besser zurechtzukommen, könnte man noch machen:
Man könnte statt das Perl-Modul zu verwenden, System-Calls zu "mp3tag" aus dem Paket

http://packman.links2linux.de/package/mp3blaster

machen. Wenn Du das versuchen möchtest, installiere dieses Paket bitte zunächst. Dann ändere in meinem Skript die Codeabschnitte mit "sub getTitle()" und "sub renameTitle()" wie folgt ab:

Code:
sub getTitle()
{
    my $exec  = "/usr/bin/mp3tag ".$_[0]." | grep Songname";
    my $title = `$exec`;
    my @a = split(":", $title);
    $title = substr($a[1], 5);
    chomp($title);
    return $title;
}


sub renameTitle()
{
    my $exec  = '/usr/bin/mp3tag -s "'.$_[1].'" -r "'.$_[0].'" &>/dev/null';
    system($exec);
}

Die Zeile

Code:
use MP3::Tag;

kannst Du dann auch aus dem Skript entfernen.
Bitte starte dann mal das Skript in seiner neuen Form, wiederum in dem Verzeichnis mit Deinen (kopierten :) ) MP3s.

Im Prinzip gingen System-Calls mit jedem Konsolentool, das bei Deinen MP3s

a. den Titel auslesen und auf der Konsole ausgeben und
b. den Titel verändern kann.

Schreib dann doch mal, wie es vorangeht, das heißt, ob es so geht oder ob Du noch ein besseres Tool dafür gefunden hast.

Vielen Dank für Deine Unterstützung.

Beste Wünsche
 
Nun habe ich in 'customtags.pl' alle einträge nach 'customtags_1.pl' geändert, das dann nach _2.pl copiert und auch dort die Referenzen auf den Namen in _2 geändert, dann dort Deine neuen Vorschläge durchgeführt.
Das flutsch OHNE Mecker :) und OHNE die Tags zu ändern :( , das wird leider nur behauptet im output. Customtags_1.pl macht das (trotz meiner rüden Eingriffe) noch 1a. Irgendwo so ab line 153 mag das script dann nicht mehr so recht.
PS:Wenn ich so die timestamps Deiner Beiträge sehe, frage ich mich, wann Du schläfst, oder bist Du einfach der Gattung "Nachtaktive" zuzuordnen? :wink:
 
Hallo,

mit dem System-Call versucht das Skript lediglich (mehrmals):
Code:
mp3tag -s "neuername" -r "datei.mp3"

Du kannst leicht probieren, ob das bei Dir geht oder eben nicht. Wenn nicht, könnte man noch ein anderes Tool suchen.

Ansonsten zu dem P.S.:
Konfuzius sprach: "Wenn man auf erstrebenswerte Art zu Reichtum gelangen kann, so werde ich es tun - auch dann, wenn es sich nur um niedrige Tätigkeiten handelt. Kann man aber nur auf eine nicht erstrebenswerte Art zu Reichtum gelangen, so lasse ich es und folge dem, was mir Spaß macht."

Viele Grüße
 
Ich passe!
Der Aufruf von mp3tag -s "neuername" -r "datei.mp3" von der Konsole aus funktioniert ebenso, wie aus customtags_2.pl nur Amarok siehts bei "Metadaten bearbeiten" nicht, obwohl die durch customtags_1.pl durchgeführten Änderungen erkannt wurden. (Vermute eine unübersehbare Kombination von irgendwelchen Versionen) Ich hatte bisher nur per Amarok nachgesehen, EasyTag und Kid3 sehen was mp3tag (manuell und per scriptaufruf) änderte. Ich sag's mit Goethe, der ist nicht ganz so hornalt wie Konfuzius:
"Mir wird von alledem so dumm,
Als ging’ mir ein Mühlrad im Kopf herum."
Egal, es flutscht, was will man mehr :)
 
ist schon 'ne weile her aber ich bin erst jetzt auf umwegen auf dieses Thema gestossen.

vielleich tist es ja noch interessant.

Also die Sortierung im iBeat ist auch mir schleierhaft.,
Allerdings ist der dateiname nunmal das einzige sinnvolle Kriterium, wenn man denn den algorithmus kennen würde.

Doch der ibeat kann auch mit m3u Dateien umgehen in einem speziellen modus.
wenn du also eine trackliste als m3u datei erstellst und diese abspielst und nicht direkt die mp3's dann klappst auch mit der Geburt vor dem Ableben.

Da ich meine mp3's unter windows erstelle (EAC) weiß ich nicht wie Du unter Linux die m3u's automatisch erstellen lassen kannst aber notfalls tut es ein "ls -1"
 
pft schrieb:
Also die Sortierung im iBeat ist auch mir schleierhaft....
Doch der iBeat kann auch mit m3u Dateien umgehen in einem speziellen modus.......weiß ich nicht wie Du unter Linux die m3u's automatisch erstellen lassen kannst aber notfalls tut es ein "ls -1"
Danke für den Tip mit den m3u's, die von GRIP automatisch erstellt werden, der 'ls -1' wird nicht funktionieren, da sich der iBeat einen D... um die Filenamen schert und sich ausschließlich um dem Titel im ID3-Tag kümmert. Das von abgdf erstellte Prog. greift dort ein und numeriert die sortierten Files in deren Tags durch. Was meinst Du mit "spez. Modus", wie mache ich dem Player das m3u-file schmackhaft?
Bis jetzt fahr ich recht gut, wenn ich dem IBeat sage "Musicbiblio-->Interpret-->[evtl. sub-dir]-->alle (numerierten) abspielen, dann ist der große Showdown zB in einem Film wirklich erst am Schluß zu hören.
 
evtl. war ich da etwas vorschnell - es gibt viele ibeats

ich habe einen joy2.0 und der kann M3Us abspielen indem man im Menu (M-taste gedrückt halten) den m3u-Modus auswählt.
Dann zeigt er keine MP3, WAVs etc mehr an sondern nur noch die m3u-Dateien.

Dieses sind definitv ASCII-Dateien mit Listen von Dateinamen - keine Tags - die er dann abspielt. Wie man sich das mit Playlisten eben so vorstellt.

Ais deiner Beschreibung
wenn ich dem IBeat sage "Musicbiblio-->Interpret-->[evtl. sub-dir]-->alle (numerierten) abspielen
schliesse ich aber, dass Du einen anderen iBeat hast. Also einfach mal die Anleitung konsultieren
 
Ok, hab' den IBeat_Jump, in dessen Manual nichts aussagestarkes steht, dafür aber in 'n' Sprachen. Ein mail an die endete in der Darstellung dessen, was ich schon feststellte als absolut tolles Feature. :evil:
 
na, da hilft wohl nichts anderes als darauf zu warten dass jemand die DInger "öffnet" oder einer 'ne Hintertür findet, so dass man sie sich zurechtbiegen kann.
unter Linux laufen die meines Wissens ohnehin schon :cry:
 
Oben