Esmeralda: vielleicht interessier es ja? :-)

Hallo,

ich hatte vor geraumer Zeit mal ein Problem mit Reg.Expressions, was in diesem Forum durch zwei nette Leute ausgeheblt wurde...

Hier das Resultat des ganzen (auch wenn es noch rel. unschön aussieht):


#!/usr/bin/perl

use  MP3::Info; use POSIX qw(locale_h); use locale;

setlocale(LANG,'german');

##########################################

wohin sollen die Daten ?

$base           = '/home2/mp3';          # ##########################################

ab wo soll gesucht werden ?

$search         = '/';                   # ##########################################

################ ################################################################# ################

$a = 1;

system ("find $base   -iname \.mp3 >  /tmp/mp3.rename"); system ("find $search -iname \.mp3 >> /tmp/mp3.rename");

open (in,"/tmp/mp3.rename"); while ($line = <in>)         {                 $line =~ s/\n//;                 $mp3_info = get_mp3tag ($line,1,1);                 $artist = $mp3_info->{ARTIST};                 $album  = $mp3_info->{ALBUM};                 $title  = $mp3_info->{TITLE};                 $track  = $mp3_info->{TRACKNUM};

$known_parts = 0;         if ($artist)                 {$known_parts++;}         if ($album)                 {$known_parts++;}         if ($title)                 {$known_parts++;}         if ($track)                 {$known_parts++;}         if ($known_parts)                 {                         if (not $artist)                                 {$artist = 'unknown';}                         if (not $album)                                 {$album  = 'unknown';}                         if (not $title)                                 {$title  = 'unknown';}                         if (not $track)                                 {$track  = 99;}                 }

$artist =~ s// /g;                 $album  =~ s// /g;                 $title  =~ s/_/ /g;

$artist =~ s///-/g;                 $album  =~ s///-/g;                 $title  =~ s///-/g;

$artist =~ s/([0-9])/|$1|/g;                 $album  =~ s/([0-9])/|$1|/g;                 $title  =~ s/([0-9])/|$1|/g;

$artist =~ s/-/|-|/g;                 $album  =~ s/-/|-|/g;                 $title  =~ s/-/|-|/g;

$artist = lc($artist);                 $album  = lc($album);                 $title  = lc($title);

$artist =~ s/\b([a-zA-ZäöüÄÖÜß])/\u$1/g;                 $album  =~ s/\b([a-zA-ZäöüÄÖÜß])/\u$1/g;                 $title  =~ s/\b([a-zA-ZäöüÄÖÜß])/\u$1/g;

$artist =~ s/ //g;                 $album  =~ s/ //g;                 $title  =~ s/ /_/g;

$artist =~ s/|//g;                 $album  =~ s/|//g;                 $title  =~ s/|//g;

if (length($track) < 2)                         {                                 $track = "0".$track;                         }

$artist =~ tr/-,.öäüßÖÄÜ&()A-Za-z_0-9//c;                 $album  =~ tr/-,.öäüßÖÄÜ&()A-Za-z_0-9//c;                 $title  =~ tr/-,.öäüßÖÄÜ&()A-Za-z_0-9/_/c;                 $track  =~ tr/0-9//c;

if (length($track) != 2 or $track eq '00')                         {                                 $track = '';                         }

$artist =~ s//_/g;                 $album  =~ s///g;                 $title  =~ s/__//g;

$mp3_qual = get_mp3info ($line);

$vbr            = $mp3_qual->{VBR};                 $bitrate        = int($mp3_qual->{BITRATE});

$minutes  = $mp3_qual->{MM};                 $seconds  = $mp3_qual->{SS};                 if (($minutes *100 + $seconds) == 0)                         {                                 $track = '';                         }

if (length($seconds) < 2)                         {                                 $seconds = '0'.$seconds;                         }

if ($vbr)                         {                                 $vbr            = 'VBR';                                 $qual_fak       = 2;                         }                 else                         {                                 $vbr            = 'CBR';                                 $qual_fak       = 1;                         }

if ($artist and $album and $title and $track)                 {

if (                         (                                 $length_hash{$artist.$album.$track}     < ($minutes100+$seconds)                         )                         or                         (                                 $length_hash{$artist.$album.$track}      <= ($minutes100+$seconds)                                 and                                 $bitrate_hash{$artist.$album.$track}    < ($bitrate * $qual_fak)                         )                    )                         {                                 if ($length_hash{$artist.$album.$track} and $bitrate_hash{$artist.$album.$track})                                         {                                                 system ("rm "$base/$artist/$album/$track"");                                         }                                 $length_hash{$artist.$album.$track}      = ($minutes100+$seconds);                                 $bitrate_hash{$artist.$album.$track}     = ($bitrate * $qual_fak);

if ($line !~ /$base/)                                         {                                                 system ("mkdir -p "$base/$artist/$album"");                                                 system ("mv  "$line" "$base/$artist/$album/$track_-_$title_-_[$minutes:$seconds-$vbr$bitrate].mp3"");                                                 print "$a)\t$artist\t$album\t$title \n";                                                 $a++;                                         }                         }                 }         } close in;


  1. #!/usr/bin/perl

    &lock(); system("dagrab -iSD /opt/kde2/share/apps/kscd/cddb"); system("dagrab -iCH localhost > /tmp/dagrab.tmp"); open(in,"/tmp/dagrab.tmp"); while ($line = <in>)         {                 if ($line =~ /title:/i or $line =~ /author:/i)                         {                                 $known_by_cddb = 1;                         }                 if ($line =~ /cddb discid/i)                         {                                 $line =~ s/cddb discid:(.*)/$1/i;                                 $id = $line;                                 $id =~ s/\n//;                                 $id =~ s/ //g;                         }         } close in;

    open (in,"/tmp/mp3.list"); while ($line = <in>)         {                 if ($line =~ /$id/i)                         {                                 $exists = 1;                         }         } close in;

    if (not $exists)         {                 #system ("rm /tmp/mp3.list");                 if ($known_by_cddb == 1)                         {                                 system ("dagrab -J -n100 -j2 -CH localhost -e 'mkdir -p "/home2/tmp/@aut/@dis/";lame --r3mix --ta "@AUT" --tl "@DIS" --tn "@NUM" --tt "@TRK" "%s" "/home2/tmp/@aut/@dis/@num-@trk.mp3";rm "%s"' all");

    system ("eject");                                 open (out,">>/tmp/mp3.list");                                 print out $id."\n";                                 close out;                         }                 else                         {                                 system ("dagrab -J -n100 -j2  -e '%track++;mkdir -p "/home2/tmp/Unknown/$id";lame --r3mix "%s" "/home2/tmp/Unknown/$id/%s.mp3";rm "%s"' all");

    system ("eject");                                 open (out,">>/tmp/mp3.list");                                 print out $id."\n";                                 close out;

    }         } else         {                 if ($id ne '')                         {                                 system ("eject");                         }         } &unlock(); sleep(10); system ("nohup /root/mp3.pl &"); sub lock()         { server:/tmp/mp3 # cat ~/mp3.pl #!/usr/bin/perl #exit; &lock(); system("dagrab -iSD /opt/kde2/share/apps/kscd/cddb"); system("dagrab -iCH localhost > /tmp/dagrab.tmp"); open(in,"/tmp/dagrab.tmp"); while ($line = <in>)         {                 if ($line =~ /title:/i or $line =~ /author:/i)                         {                                 $known_by_cddb = 1;                         }                 if ($line =~ /cddb discid/i)                         {                                 $line =~ s/cddb discid:(.*)/$1/i;                                 $id = $line;                                 $id =~ s/\n//;                                 $id =~ s/ //g;                         }         } close in;

    open (in,"/tmp/mp3.list"); while ($line = <in>)         {                 if ($line =~ /$id/i)                         {                                 $exists = 1;                         }         } close in;

    if (not $exists)         {                 #system ("rm /tmp/mp3.list");                 if ($known_by_cddb == 1)                         {                                 system ("dagrab -J -n100 -j2 -CH localhost -e 'mkdir -p "/home2/tmp/@aut/@dis/";lame --r3mix --ta "@AUT" --tl "@DIS" --tn "@NUM" --tt "@TRK" "%s" "/home2/tmp/@aut/@dis/@num-@trk.mp3";rm "%s"' all");

    system ("eject");                                 open (out,">>/tmp/mp3.list");                                 print out $id."\n";                                 close out;                         }                 else                         {                                 system ("dagrab -J -n100 -j2  -e '%track++;mkdir -p "/home2/tmp/Unknown/$id";lame --r3mix "%s" "/home2/tmp/Unknown/$id/%s.mp3";rm "%s"' all");

    system ("eject");                                 open (out,">>/tmp/mp3.list");                                 print out $id."\n";                                 close out;

    }         } else         {                 if ($id ne '')                         {                                 system ("eject");                         }         } &unlock(); sleep(10); system ("nohup /root/mp3.pl &"); sub lock()         {                 open (in,"/tmp/mp3.lock");                 $line = <in>;                 close in;                 $line =~ s/\n//;                 if (($line ne 'ready' or $line > (time - 3600)) and $line ne '')                        {                                 exit;                         }                 else                         {                                 open (out,">/tmp/mp3.lock");                                 print out time;                                 close out;                         }         }

    sub unlock()         {                 open (out,">/tmp/mp3.lock");                 print out "ready";                 close out;         }

    1. ...bekommt man wohl unter:

      http://vertigo.fme.vutbr.cz/~stibor/dagrab.html
      (für dagrab)

      wobei ich die Datei "const.h" eher so schreiben würde:

      /*
       * const.h for dagrab
       */

      #ifndef _CONST_H
      #define _CONST_H 1

      /*
       * you can edit those values (see dagrab --longhelp or manpage):
       */
      #define CDDEVICE        "/dev/cdrom"
      #define MAX_SPEED       64      /* maximum speed of your drive */

      #define N_BUF           8       /* -n */
      #define RETRYS          400     /* Retrys when it can't read */
      #define RETRYS_O        1500    /* Retrys when overlap errors occure */
      #define DELTA           2       /* implicit -j */
      #define BLEN            256     /* length in chars of command/trackname */
      #define OVERLAP         1       /* minimum number of sectors for overlapping */
      #define CDDB_PORT       888
      #define CDDB_PATH       "/usr/lib/X11/xmcd/cddb"
      #define CDDB_HOST       "de.freedb.org"
      #define CDDB_MAX        65535

      #define KEYLEN          8       /* number of samples for overlap checking */

      /*
       * do not edit lines bellow:
       */
      #define IFRAMESIZE      (CD_FRAMESIZE_RAW/sizeof(int))

      #define OVERLAP_ERR     0       /* see print.c */
      #define OVERLAP_OK      1
      #define NUL             2

      #define ID_BLOCKS       0
      #define ID_SPEED        1
      #define ID_BADDATA      2
      #define ID_OVERLAP      3
      #define ID_SECTORS      4
      #define ID_MISSING      7
      #define ID_PERC         8
      #define ID_REALSPEED    9
      #define ID_NULL         10
      #define ID_JITTER       11

      #define LEFT            1
      #define RIGHT           3

      #define SHORTHELP       0
      #define LONGHELP        1

      #define OK              0
      #define KO              1

      #define TRK_BEGIN       0
      #define TRK_INSIDE      1
      #define TRK_END         2

      #define NO              0
      #define YES             1

      #define DONTKNOW        2
      #define YES_AND_FREE_IT 2

      typedef struct {
              int size;
              char *buffer;
      } Buffer;

      #endif                          /* _CONST_H */

      1. Gibt es irgendwo unter http://www.cpan.org

        1. Gibt es unter http://www.freedb.org

          Was das alles soll?
          Keine Ahnung... :-)

          1. nun ja, Esmeralda,

            Was das alles soll?
            Keine Ahnung... :-)

            ist ja nett, daß du dir das selber sagst. Bloß was sollen wir armen Würstchen jetzt damit anfangen ? Ich bilde mir ein, seit einigen wenigen Jahren doch das eine oder andre zu Perl und C/C++ gelernt zu haben, habe aber aus deinen postings nicht herauslesen können, worum es eigentlich geht.
            Wenn es dir darum zu tun war, den "Eigenwilligsten Thread" für die Statistik zu erfinden, so kann ich dir bescheinigen, daß das gelungen scheint.

            Christoph S.

            1. nun ja, Esmeralda,

              Was das alles soll?
              Keine Ahnung... :-)

              ist ja nett, daß du dir das selber sagst. Bloß was sollen wir armen Würstchen jetzt damit anfangen ? Ich bilde mir ein, seit einigen wenigen Jahren doch das eine oder andre zu Perl und C/C++ gelernt zu haben, habe aber aus deinen postings nicht herauslesen können, worum es eigentlich geht.
              Wenn es dir darum zu tun war, den "Eigenwilligsten Thread" für die Statistik zu erfinden, so kann ich dir bescheinigen, daß das gelungen scheint.

              Eigenwillig mag der Thread sein, aber probier die Scipte aus, Du wirst schon sehen, was ich meine!!!!

    2. if (($line ne 'ready' or $line > (time - 3600)) and $line ne '')                                     ^^

      da muß "and" hin!!!

  2. hi...

    das ist einfach... einfach ... so... WUNDERBAR ! :]

    AnalphaBestie

  3. Hej Esmeralda,

    ich hatte vor geraumer Zeit mal ein Problem mit Reg.Expressions, was in diesem Forum durch zwei nette Leute ausgeheblt wurde...

    Hier das Resultat des ganzen (auch wenn es noch rel. unschön aussieht):

    leider habe ich ein kleines Problem mit Deinem Posting, denn ich habe keine Ahnung, wozu Dein Skript gut sein soll.
    Ich weiß leider weder was das Skript macht (kurze Erläuterung fehlt), noch weiß ich, mit was für ein Problem Du gekämpft hast (Link zu Deinem ursprünglichen Posting hätte eventuell auch helfen können).

    Ich finde es sehr gut, daß Du Deine Lösung veröffentlichen möchtest, denn es kann ja auch sein, daß Du mit dem Problem nicht alleine stehst. Wäre aber eine allgemeine Beschreibung und ein Link, wo man sich das dann hätte herunterladen können nicht sinnvoller gewesen? (Ist allerdings nur meine Meinung).

    Ich persönlich muß leider gestehen, daß ich etwas zu faul bin, tonnenweise Code durchzusehen, um dann irgendwann festzustellen, ob ich daraus etwas gebrauchen kann oder nicht ;o).

    Viele Grüße aus dem Westen,
    Marko

    1. Hallo Marko und Esmeralda!

      Ich persönlich muß leider gestehen, daß ich etwas zu faul bin, tonnenweise Code durchzusehen, um dann irgendwann festzustellen, ob ich daraus etwas gebrauchen kann oder nicht ;o).

      Zu faul oder nicht die Zeit... wäre daher auch froh, wenn ich erfahren würde, was das Script im Groben macht. Nach kurzem Überfliegen des Scripts gewann ich den Eindruck, das es zum Umbenennen von MP3 ist?... Mit Connection zu CDDB?

      Ich selbst habe mal MP3s von meinen eigenen CDs gestrippt - auch mit Unterstützung der CDDB für die Songtitel. Leider war eine Handkorrektur vielerorts notwendig, da viele Songtitel in der CDDB Orthographie- oder sonstige Fehler enthalten (sind auch nur Menschen, die die Titel bekanntgeben dort). Aber das Programm, mit dem ich gearbeitet habe, hatte schon sehr viele Möglichkeiten, so dass man die Korrekturen bereits im Programm vor dem Strippen erledigen konnte.

      Also, Esmeralda: was macht Dein Programm? Und kannst Du es in einem Stück präsentieren (vielleicht irgendwo online als .txt-Datei)?

      Grüße,
      Patrick

  4. Hoi,

    #!/usr/bin/perl -w

    use strict;
    use vars qw($base $search);

    use MP3::Info;
    use POSIX qw(locale_h);
    use locale;

    setlocale(LANG,'german');

    ##########################################

    wohin sollen die Daten ?

    $base           = '/home2/mp3';          #
    ##########################################

    ab wo soll gesucht werden ?

    $search         = '/';                   #
    ##########################################

    ################
    #################################################################
    ################

    my $a = 1;

    opendir SRCH,$search or die $!;
    opendir BASE,$base or die $!;

    my @mp3s = grep /.mp3$/,readdir SRCH,readdir BASE;

    closedir SRCH;
    closedir BASE;

    foreach my $mp3 (@mp3s) {
      my $mp3_info = get_mp3tag ($mp3,1,1);
      my $artist   = $mp3_info->{ARTIST}   or "unknown";
      my $album    = $mp3_info->{ALBUM}    or "unknown";
      my $title    = $mp3_info->{TITLE}    or "unknown";
      my $track    = $mp3_info->{TRACKNUM} or "unknown";

    foreach($artist,$album,$title) {
       y!_/! -!;

    s/([0-9])/|$1|/g;
       s/-/|-|/g;
       $_ = lc $_;

    s/\b([a-zA-ZäöüÄÖÜß])/\u$1/g;
       s/ /_/g;
       y!|!!d;
       tr/-,.öäüßÖÄÜ&()A-Za-z_0-9/_/c;
       s/__/_/g;
      }

    $track       = sprintf('%02d',$track);

    if (length($track) != 2 or $track eq '00') {
        $track     = '';
      }

    $mp3_qual    = get_mp3info($mp3);

    $vbr         = $mp3_qual->{VBR};
      $bitrate     = int($mp3_qual->{BITRATE});

    $minutes    = $mp3_qual->{MM};
       $seconds    = $mp3_qual->{SS};
       if(($minutes * 100 + $seconds) == 0) {
         $track    = '';
       }
       $seconds    = sprintf('%02d',$seconds);

    if ($vbr) {
         $vbr      = 'VBR';
         $qual_fak = 2;
       }
       else {
         $vbr  = 'CBR';
         $qual_fak       = 1;
       }

    # den letzten Teil habe ich nicht verstanden.

    }

    Ich habe die Transformationen zwar nicht verstanden, aber ich habe
    das ganze mal etwas 'perliger' gemacht und kuerzer gemacht.

    Gruesse aus dem ausnahmsweise sonnigen MS,
     c.j.k

    1. Hallo,

      # den letzten Teil habe ich nicht verstanden.

      Das hat folgenden Hintergrund:
      Es muß mind. ein ID3-Tag vorhanden sein, erst dann werden alle, die nicht vorhanden sind in "unknown" gewandelt bzw. in "99" für die Tracknummer, falls nicht vorhanden.
      Ist gar keiner vorhanden, ist das Stück wohl Schrott, wird also nicht weiter beachtet.
      Du hast duch Deine "Verschönerung" darin leider einen Fehler eingebaut, denn Dein Script würde jedes MP3 verschieben!

      Zum letzten Teil:
      Das wird nur durchlaufen, wenn (an dieser Stelle) alle ID3-Tags vorhanden sind.
      Dann werden zwei Hashes gebastelt, die sich auf die ID3s beziehen und Länge bzw. Qualität zuweisen. Zuerst muß das Zielverzeichnis durchlaufen werden, um die Qualität bzw. Länge, die schon vorhanden ist, einzulesen, um somit gute Stücke nicht durch schlechtere zu ersetzen.
      Falls ein Stück besser als ein vorhandenes ist, wird dieses ersetzt.

      So bekommt man nach und nach die besten Versionen zusammen.... wie auch immer!? :-)

      Ich habe die Transformationen zwar nicht verstanden, aber ich habe
      das ganze mal etwas 'perliger' gemacht und kuerzer gemacht.

      Sieht wirklich viel besser aus, aber wie gesagt, hast Du Fehler eingebaut.

      LG, Esmeralda

    2. my $mp3_info = get_mp3tag ($mp3,1,1);

      ",1,1" weglassen, führt sonst zu Fehlern bei ID3V2, d.h. es werden dann nur 30 Zeichen im Tag zugelassen

  5. Folgendes stammt nicht aus meiner Feder, könnte aber interessant sein:
    (Ich habe es leicht abgewandelt)

    ----------------
    #!/usr/bin/perl

    use Getopt::Std;
    use MP3::Info;

    %options=();
    getopts('unh', %options);

    if($options{h}){&usage()}
    if(!$options{n}){
        use CDDB;
    }

    @files=<*.mp3>;

    my ($totsecs,$totid,$i,$totfrm,$sstring,$sstring2);

    my @tks;
    $i=0;
    $totsecs=2;
    $totfrm=150;
    $sstring='150 ';
    $sstring2='150+';

    foreach $file (@files){

    my $info=get_mp3info($file);
        my ($id);
        my $secs=60*$info->{MM};
        $secs+=$info->{SS};
        $totsecs+=$secs;
        print "$file: $secs";

    push(@tks, $secs);

    if($i==0){
            print "150 ";
    $test[0] = 150;
            $totfrm+=$secs*75;
        }else{
            print "$totfrm ";
    $test[$i] = $totsecs*75;
            $sstring.="$totfrm ";
            $sstring2.="$totfrm+";
            $totfrm+=$secs*75;
            print ": ", $tks[$i-1]*75;
        }

    while ($secs > 0){
            $id+=($secs % 10);
            $secs /= 10;
        }
        print ": $id\n";
        $totid+=$id;
        $i++;
    }
    chomp $sstring;

    print "\ntotal secs: $totsecs\n";
    print "total tracks: $i\n";
    print "totid=$totid\n";
    $cddbid=((($totid % 0xFF) << 24) | (($totsecs) << 8) | $#files+1);
    #$cddbid= sprintf ("%08x", $cddbid), "\n";
    $cddbid= sprintf ("%08x", $cddbid);

    print "ID: ".$cddbid."\n";
    for ($j=0;$j<=$i;$j++)
            {
                    print $test[$j]."\n";
            }

    if(!$options{n}){
        my $cddb= new CDDB( Host => 'freedb.org',
                            Port => 888
                            ) or die $!;

    my @discs = $cddb->get_discs($cddbid, "$i ".$sstring, $totsecs);
        foreach my $disc (@discs) {
            my ($genre, $cddb_id, $title) = @$disc;
            if($cddb_id){
                print "$genre, $cddb_id, $title\n";
            }
        }
    }

    if($options{u}){
        print "http://cddb.celestial.com/~cddb/cddb.cgi?cmd=cddb+query+$cddbid+";
        print "$i+${sstring2}$totsecs&hello=blah+my.host.com+fads+2&proto=1\n";
    #    my $disc_info = $cddb->get_disc_details($genre, $cddb_id);
    }

    sub usage {

    print <<EOF;
    Usage: mp3ascd.pl [options]

    Where [options] is zero or more of the following:

    -u  Print out a URL that will perform a cddb lookup.
        -n  Do not query cddb server, or import CDDB module.
        -h  Display this help screen.

    EOF
        exit(0);
    }
    ----------------

    Man gehe in ein Verzeichnis, in dem vermutlicherweise eine komplette Platte lungert und rufe das Script auf...
    Das Gerät meldet, ob und welche PLatte das sein könnte.

    ---

    Langsam wird aus diesem Gepuzzel, daß ich hier veranstaltet habe, vielleicht ersichtlich, worum es geht...

    Frage ist nur noch, wer sich mit Fasttrack auskennt oder besser Socketprogrammierung.