Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12584[/thread]

iTunes: Coverfiles direkt in MP3s speichern?

Leser: 2


<< >> 8 Einträge, 1 Seite
~Br4inP4in~
 2008-10-04 22:32
#115172 #115172
User since
2007-06-13
28 Artikel
BenutzerIn
[default_avatar]
Hi.

Ich habe folgendes Problem:
Ich habe über die Jahre hinweg meine ganzen AudioCDs gerippt und einheitlich in Ordner abgelegt, außerdem die jeweiligen Covers dafür mühsam gesucht und unter dem Namen cover.jpg in den jeweiligen Albumordner einsortiert.

Jetzt habe ich einen iPod Touch - mit der netten Coverflow-Funktion, die ich natürlich auch nutzen möchte.

Ich bin es allerdings Leid in iTunes zuerst die Alben einzulesen und dann für jedes Album per Rechtsklick->Informationen->Cover die Coverbilder aus dem jeweiligen Verzeichnis einzutragen, da meine Sammlung an Musik doch recht groß ist. => ich würde das gern automatisieren.

Nun habe ich gelesen, dass iTunes die Covers in jeder .mp3-Datei im ID3-Tag speichert...
Es stellt sich mir die Frage, ob es ein Modul gibt, mit dem ich die Covers so ins Tag eintragen kann, dass iTunes sie automatisch erkennt. Kann ich das evtl. mit MP3::Tag machen, bzw. weiss jemand wie genau die Coverdateien eingetragen werden?
Danke schonmal.

Gruß, ~Br4inP4in~
xiconfjs
 2008-10-06 14:27
#115204 #115204
User since
2006-01-21
79 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hi,

bei dem Modul CPAN:MPEG::ID3v2Tag gibt es im Beispiel-Code diese Zeile, die dir weiterhelfen sollte:

Code (perl): (dl )
1
2
3
4
5
$tag->add_frame(
      "APIC",
      -picture_type => 0,
      -file         => "happy_little_song.gif"
  );




mFg xiconfjs
Taulmarill
 2008-10-06 15:31
#115206 #115206
User since
2004-02-19
1750 Artikel
BenutzerIn

user image
Falls jemand für dieses Problem eine Lösung schreibt, würde mich das Script durchaus interessieren. Habe hier im Prinzip das selbe Problem und würde wohl erst in ein paar Wochen dazu kommen, eine Lösung zu implementieren.
$_=unpack"B*",~pack"H*",$_ and y&1|0& |#&&print"$_\n"for@.=qw BFA2F7C39139F45F78
0A28104594444504400 0A2F107D54447DE7800 0A2110453444450500 73CF1045138445F4800 0
F3EF2044E3D17DE 8A08A0451412411 F3CF207DF41C79E 820A20451412414 83E93C4513D17D2B
~Br4inP4in~
 2008-10-06 16:14
#115210 #115210
User since
2007-06-13
28 Artikel
BenutzerIn
[default_avatar]
Ich bin durch das Stichwort APIC darauf gestoßen, dass auch MP3::Tag die Möglichkeit bietet, Covers in ID3Tags einzubinden.
Da ich MP3::Tag desöfteren nutze, werde ich es damit versuchen.
Werde mich heute abend/morgen mal daran Probieren und melde mich dann.
Danke xiconfjs, das Stichwort APIC hat mir sehr geholfen :)
MatthiasW
 2008-10-06 18:19
#115212 #115212
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Nach einer kleinen Änderung in MP3/Tag/ID3v2.pm funktioniert folgendes prima:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/perl

use strict;
use warnings;

use MP3::Tag;

my $mp3 = MP3::Tag->new( 'test.mp3' );

$mp3->get_tags;

my $id3v2 = exists $mp3->{'ID3v2'}
                ? $mp3->{'ID3v2'}
                : $mp3->new_tag('ID3v2');

{
        open( my $in, '<', 'test.jpg' )
                or die "Cannot open file 'test.jpg': $!";

        binmode( $in );

        my $data = do{ local $/=undef; <$in> };

        unless ( $id3v2->get_frame('APIC') )
        {
                $id3v2->add_frame( 'APIC', 'image/jpg', 3, 'Cover Image', $data );
        } # unless
        else
        {
                $id3v2->change_frame( 'APIC', 'image/jpg', 3, 'Cover Image', $data );
        } # else

        $id3v2->write_tag;
}

Dieses Skript lädt die Datei test.mp3, holt das ID3v2 Tag(erstellt es, falls noch nicht vorhanden) und liest die Datei test.jpg ein um anschließend den APIC Frame zu ändern/erstellen.

Leider konnte ich bisher nicht herausbekommen, wann man welchen Picture-Type(im Skript die 3 in der add_frame/change_frame Methode) verwenden muss.
Nach der Doku von MPEG::ID3v2Tag ist es eine 0 für image/gif und nach einer kurzen google-Suche eine 3 für image/jpg. Andere hab ich noch nicht gefunden.

Folgendes musste ich in ID3v2.pm ändern:
1. Zeile 12
Ein use File::Copy; und ein newline einfügen.
2. Zeile 602
Das gesamte unless-Statement durch folgendes ersetzen:
Code: (dl )
1
2
3
4
5
6
	unless ( move( $tempfile, $mp3obj->{'filename'} ) )
{
unlink($tempfile);
warn "Couldn't File::Copy::move temporary file $tempfile to $mp3obj->{'filename'}\n";
return -1;
}

Ohne diese Änderungen konnte auf meinem System kein neuer APIC Frame der MP3-Datei hinzugefügt werden.

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
nepos
 2008-10-06 19:02
#115213 #115213
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Quote
Leider konnte ich bisher nicht herausbekommen, wann man welchen Picture-Type(im Skript die 3 in der add_frame/change_frame Methode) verwenden muss.
Nach der Doku von MPEG::ID3v2Tag ist es eine 0 für image/gif und nach einer kurzen google-Suche eine 3 für image/jpg. Andere hab ich noch nicht gefunden.

Das stimmt so nicht! Diese Zahl hat nichts mit dem Format der Grafik zu tun.
Sie gibt an, wofür das Bild gedacht ist. Schau dir mal http://www.id3.org/id3v2.4.0-frames und da den Punkt 4.14 Attached Picture an. Da werden die ganzen Typen aufgelistet.
0 steht für Other, 3 für Cover front, 4 für Cover back usw.
MatthiasW
 2008-10-06 19:46
#115214 #115214
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
@nepos, Danke für den Link, wenn ich nochmal drüber nachdenke hatte meine Annahme sowieso recht wenig Sinn, ich ging schließlich davon aus, dass der Picture-Type etwas mit dem Mimetype zu tun hat.

Als Entschädigung ein kleines Skript, das vom aktuellen Verzeichnis aus allen .mp3-Dateien ein Cover gibt, falls es ein Cover im jeweiligen Verzeichnis findet:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/usr/bin/perl

use strict;
use warnings;

use MP3::Tag;
use File::Find;

File::Find::find( \&wanted, '.' );

{
        my $cover;
        my @mp3;

        sub wanted
        {
                for ($File::Find::name)
                {
                        -d && do {
                                undef $cover;
                                last;
                        };

                        /\.(jpg|gif)$/ && do {
                                $cover = [ $_, "image/$1" ];

                                if ( @mp3 )
                                {
                                        add_cover( $_, $cover ) for @mp3;
                                        @mp3 = ();
                                } # if

                                last;
                        };

                        /\.mp3$/ && do {
                                $cover ? add_cover( $_, $cover )
                                       : push @mp3, $_;
                                last;
                        };
                } # for
        } # wanted
}

sub add_cover
{
        my( $file, $cover ) = @_;

        my $mp3 = MP3::Tag->new( $file );

        $mp3->get_tags;

        my $id3v2 = exists $mp3->{'ID3v2'}
                        ? $mp3->{'ID3v2'}
                        : $mp3->new_tag('ID3v2');

        open( my $in, '<', $cover->[0] )
                or die "Cannot open file '$cover->[0]': $!";

                binmode( $in );

                my $data = do{ local $/=undef; <$in> };

                unless ( $id3v2->get_frame('APIC') )
                {
                        $id3v2->add_frame( 'APIC', $cover->[1], 3, 'Cover Image', $data );
                } # unless
                else
                {
                        $id3v2->change_frame( 'APIC', $cover->[1], 3, 'Cover Image', $data );
                } # else

                $id3v2->write_tag;

        close( $in );

        $mp3->close;
} # add_cover

Noch ist es quick&dirty, wenn ich etwas Zeit finde schreibe ich noch eine GUI drum und mache es einfacher das Ganze an eigene Befürfnisse anzupassen.

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
MatthiasW
 2008-10-08 22:40
#115316 #115316
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
So, ich habe mich heute mal hingesetzt und das ganze schöner gemacht.
Dazu folgende Module:
File/Find/Process.pm - http://nopaste.ch/7dc0d2004740756.html
File/Find/Process/MP3.pm - http://nopaste.ch/8a12ca5f10fe7aa.html

Und die GUI:
mp3.pl - http://nopaste.ch/1cd8950ea50535d.html

Ich hoffe es gefällt!

Als Beispielskript für die GUI habe ich das erste Skript für das Hinzufügen der Cover angepasst:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
my @cover = ( 'image/', '' );

for my $ext (qw' jpg gif ')
{
        if ( exists $files->{$ext} )
        {
                $cover[0] .= $ext;
                $cover[1]  = $files->{$ext}->[0];
                last;
        } # if
} # for

open( my $in, '<', $cover[1] )
        or die "Cannot open file '$cover[1]': $!";
binmode( $in );

my $data = do{ local $/ = undef; <$in> };

close( $in );

for my $file ( @{ $files->{'mp3'} } )
{
        my $mp3   = $self->open_mp3( $file );
        my $id3v2 = $self->get_id3v2( $mp3 );

        $self->set_id3v2( $id3v2, 'APIC', $cover[0], 3, 'Cover Image', $data );
} # for

Man kann es von der GUI aus starten, oder daraus ein "Stand-Alone" Skript machen, dass Verzeichnisse von @ARGV entgegennimmt und als default die Verzeichnisse verwendet, welche man in der Verzeichnisliste der GUI hatte, als man auf den "Save as stand-alone script" Button gedrückt hat.

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
<< >> 8 Einträge, 1 Seite



View all threads created 2008-10-04 22:32.