ANN: MP3::Tag alpha release

From: Ilya Zakharevich (nospam-abuse_at_ilyaz.org)
Date: 03/12/04


Date: Fri, 12 Mar 2004 09:07:45 +0000 (UTC)

I think I beefed up MP3::Tag to the state that it contains about 95%
of capabilities I would wish... There are several more (more or less
trivial) features to add (like freedb connection instead of reading
the file from disk, or fetching the info from playlists), but the gist
of it is there.

See the docs of examples/mp3info2 (repeated below) for the examples of
what MP3::Tag can do via (I hope) a very simple API. (While the CLI
of mp3info2 is obviously grotesque, all this horrible two-level lists
become quite simple when converted to Perl method calls.) It is on

  ilyaz.org/software/tmp/MP3-Tag-0.40plus.tar.gz

Comments welcome,
Yours, Ilya

NAME
    mp3info2 - get/set MP3 tags; uses MP3::Tag to get default values.

SYNOPSIS
      mp3info2 -y 1981 *.mp3

      mp3info2 -C artist=CDDB_File -u *.mp3

      mp3info2 -C title=Inf,ID3v2,ID3v1,filename -u *.mp3

      mp3info2 -C "#title=Inf,ID3v2,ID3v1,filename#artist=CDDB_File" -u *.mp3

      mp3info2 -p "lame -h --vbr-new --tt '%t' --tn %n --ta '%a' --tc '%c' --tl '%l' --ty '%y' '%f'\n" *.wav >xxx.sh

DESCRIPTION
    The program prints a message summarizing tag info (obtained via MP3::Tag
    module) for specified files.

    It may also update the information in MP3 tags. This happens in two
    different cases.

    * If the information supplied in command-line options differs from the
        content of the corresponding ID3 tags (or there is no corresponding
        ID3 tags).

    * if "MP3::Tag" obtains the info from other means than MP3 tags, and
        "-u" forces the update of the ID3 tags.

    (Both ways are disabled by "-D" option.) ID3v2 tag is written if needed.

    The option "-C" sets "MP3::Tag" configuration data (separated by commas;
    the first comma can be replaced by "=" sign) as MP3::Tag->config() would
    do. (To call config() multiple times, separate the parts by arbitrary
    non-alphanumeric character, and repeat this character in the start of
    "-C" option.)

    The option "-u" writes ("u"pdates) the fetched information to the MP3
    ID3 tags. This option is assumed if tag elements are set via
    command-line options. (This option is overwritten by "-D" option.)

    The option "-p" prints a message using the next argument as format (with
    "\\", "\t", "\n" replaces by backslash, tab and newline); see
    "interpolate" in MP3::Tag for details of the format of sprintf()-like
    escapes.

    With option "-D" (dry run) no update is performed.

    Use options

      t a l y g c n

    to overwrite the information (title artist album year genre comment
    track-number) obtained via "MP3::Tag" heuristics ("-u" switch is implied
    if any one of these arguments differs from what would be found
    otherwise; use "-D" switch to disable auto-update).

    The option "-P" should contain the parse recipes. They become the
    configuration item "parse_data" of "MP3::Tag"; eventually this
    information is processed by module MP3::Tag::ParseData (if present in
    the chain of heuristics). The option is split into "[$flag, $string,
    @patterns]" on its first non-alphanumeric character; if multiple options
    are needed, one should separate them by this character repeated 3 times.

    If option "-G" is specified, the file names on the command line are
    considered as glob patterns. This may be useful if the maximal
    command-line length is too low).

EXAMPLES
    Only the "-P" option is complicated enough to deserve comments...

    For a (silly) example, one can replace "-a Homer -t Iliad" by

      -P mz=Homer=%a===mz=Iliad=%t

    A less silly example is forcing a particular way of parsing a file name
    via

      -P "im=%{d0}/%f=%a/%n %t.%e"

    This interpolates the string "%{d0}/%f" and parses the result (which is
    the file name with one level of the directory part preserved) using the
    pattern "%a/%n %t.%e"; thus the directory name becomes author, the
    leading numeric part - the track number, and the rest of the file name
    (without extension) - the title. Note that since multiple patterns are
    allowed, one can similarly allow for multiple formats of the names, e.g.

      -P "im=%{d0}/%f=%a/%n %t.%e=%a/%t (%y).%e"

    allows for the file basename to be also of the form "TITLE (YEAR)". To
    give more examples,

      -P "if=%D/.comment=%c"

    will read comment from the file .comment in the directory of the audio
    file;

      -P "ifn=%D/.comment=%c"

    has similar effect if the file .comment has one-line comments, one per
    track (this assumes the the track number can be found by other means).

    Suppose that a file Parts in a directory of MP3 files has the following
    format: it has a preamble, then has a short paragraph of information per
    audio file, preceeded by the track number and dot:

       ...

       12. Rezitativ.
       (Pizarro, Rocco)

       13. Duett: jetzt, Alter, jetzt hat es Eile, (Pizarro, Rocco)

       ...

    The following command puts this info into the title of the ID3 tag
    (provided the audio file names are informative enough so that MP3::Tag
    can deduce the track number):

     mp3info2 -u -C parse_split='\n(?=\d+\.)' -P 'fl;Parts;%=n. %t'

    If this paragraph of information has the form "TITLE (COMMENT)" with the
    "COMMENT" part being optional, then use

     mp3info2 -u -C parse_split='\n(?=\d+\.)' -P 'fl;Parts;%=n. %t (%c);%=n. %t'

    If you want to remove a dot or a comma got into the end of the title,
    use

     mp3info2 -u -C parse_split='\n(?=\d+\.)' \
       -P 'fl;Parts;%=n. %t (%c);%=n. %t;;;iR;%t;%t[.,]$'

    The second pattern of this invocation is converted to

      ['iR', '%t' => '%t[.,]$']

    which essentially matches the title vs the substitution
    "s/(.*)[.,]$/$1/s".

AUTHOR
    Ilya Zakharevich <cpan@ilyaz.org>.

SEE ALSO
    MP3::Tag, MP3::Tag::ParseData