rtaglib 0.2.2 → 0.2.3

Sign up to get free protection for your applications and to get access to all the features.
data/swig/Rakefile CHANGED
@@ -13,20 +13,17 @@ task :docs => ["TagLib_doc.rb"] do |t|
13
13
  system %(rdoc -f html TagLib_doc.rb)
14
14
  end
15
15
 
16
- file "Doxyfile" do |t|
17
- system %("touch Doxyfile")
18
- end
19
-
20
16
  file "TagLib_doc.rb" => ["make_doc.rb","TagLib.so","doxygen"] do |t|
21
17
  system %(ruby make_doc.rb)
22
18
  end
19
+
23
20
  file "doxygen" => ["Doxyfile"] do |t|
24
21
  system %(doxygen)
25
22
  end
26
23
  task :test => ["TagLib.so"] do |t|
27
24
  system %(ruby "test.rb")
28
25
  end
29
- task :copy => [:test, :docs] do |t|
26
+ task :copy => [:test, "TagLib_doc.rb"] do |t|
30
27
  system %(cp extconf.rb taglib.cxx ../ext/taglib/)
31
28
  system %(cp test.rb ../test/test_taglib.rb)
32
29
  system %(cp TagLib_doc.rb ../lib/)
data/swig/extconf.rb CHANGED
@@ -5,11 +5,18 @@ if(PLATFORM=~/mingw/)
5
5
  $CFLAGS= " -I/mingw/include/taglib"
6
6
 
7
7
  else
8
- puts "Building for other architecture"
9
- $CFLAGS= " -I/usr/include/taglib"
10
-
8
+ puts "Building for other architecture"
9
+ taglib_config = find_executable("taglib-config")
10
+ if taglib_config
11
+ prefix = `#{taglib_config} --prefix`.strip
12
+ $CFLAGS += " -I#{prefix}/include"
13
+ $LDFLAGS += " -L#{prefix}/lib"
14
+ else
15
+ prefix = "/usr"
16
+ end
17
+ $CFLAGS += " -I#{prefix}/include/taglib"
11
18
  end
12
- $libs = append_library($libs, "supc++")
19
+ $libs = append_library($libs, "supc++")
13
20
  if have_header("taglib/taglib_export.h") and have_library("tag")
14
21
  create_makefile("TagLib")
15
22
  end
data/swig/taglib.i CHANGED
@@ -56,19 +56,37 @@ typedef std::basic_string< wchar > wstring;
56
56
  typedef const char * FileName;
57
57
  %}
58
58
 
59
+
59
60
  %{
60
- VALUE StringList2Ruby(TagLib::StringList st) {
61
+ VALUE ByteVector2Ruby(const TagLib::ByteVector *bv) {
62
+ return rb_tainted_str_new(bv->data(),bv->size());;
63
+ }
64
+ VALUE String2Ruby(const TagLib::String *st) {
65
+ return rb_tainted_str_new2(st->toCString(!st->isLatin1()));
66
+ }
67
+
68
+ VALUE StringList2Ruby(const TagLib::StringList *st) {
61
69
  VALUE ary=Qnil;
62
- if(st.size()>0) {
63
- ary=rb_ary_new2(st.size());
64
- for(uint i=0;i<(st.size());i++) {
65
- TagLib::String &rst=st.operator[](i);
66
- const char* ch=rst.toCString(true);
67
- rb_ary_push(ary, rb_tainted_str_new2(ch));
70
+ if(st->size()>0) {
71
+ ary=rb_ary_new2(st->size());
72
+ for(uint i=0;i<(st->size());i++) {
73
+ const TagLib::String *val=&(st->operator[](i));
74
+ rb_ary_push(ary, String2Ruby(val));
68
75
  }
69
76
  }
70
77
  return ary;
71
78
  }
79
+ VALUE FrameList2Ruby(const TagLib::ID3v2::FrameList *st) {
80
+ VALUE ary=Qnil;
81
+ if(st->size()>0) {
82
+ ary=rb_ary_new2(st->size());
83
+ for(uint i=0;i<(st->size());i++) {
84
+ rb_ary_push(ary, SWIG_NewPointerObj(st->operator[](i), SWIGTYPE_p_TagLib__ID3v2__Frame, 0));
85
+ }
86
+ }
87
+ return ary;
88
+ }
89
+
72
90
  %}
73
91
 
74
92
  %init %{
@@ -86,11 +104,12 @@ typedef const char * FileName;
86
104
  VALUE mTagLibWavPack = rb_define_module_under(mTagLib, "WavPack");
87
105
  %}
88
106
 
89
- %define MAP_HELPERS(TYPE,FUNC)
90
- %extend Map<TagLib::String, TYPE> {
91
- VALUE __getitem__(TagLib::String &item) {
107
+ %define MAP_HELPERS(KEY_TYPE,VALUE_TYPE,FUNC_KEY,FUNC_VALUE)
108
+ %extend Map<KEY_TYPE, VALUE_TYPE> {
109
+ VALUE __getitem__(KEY_TYPE &item) {
92
110
  if($self->contains(item)) {
93
- return FUNC($self->operator[](item));
111
+ VALUE_TYPE val=$self->operator[](item);
112
+ return FUNC_VALUE(&val);
94
113
  } else {
95
114
  return Qnil;
96
115
  }
@@ -98,9 +117,9 @@ typedef const char * FileName;
98
117
  VALUE __hash__() {
99
118
  uint i;
100
119
  VALUE hash=rb_hash_new();
101
- for(std::map<TagLib::String,TYPE>::const_iterator it=$self->begin(); it!=$self->end();it++) {
102
- VALUE key=rb_tainted_str_new2(it->first.toCString(true));
103
- VALUE ary=FUNC(it->second);
120
+ for(std::map<KEY_TYPE,VALUE_TYPE>::const_iterator it=$self->begin(); it!=$self->end();it++) {
121
+ VALUE key=FUNC_KEY(&it->first);
122
+ VALUE ary=FUNC_VALUE(&it->second);
104
123
  rb_hash_aset(hash,key,ary);
105
124
  }
106
125
  return hash;
@@ -168,19 +187,16 @@ namespace TagLib {
168
187
  };
169
188
 
170
189
 
171
- %typemap(out) TagLib::StringList &{
172
- $result=StringList2Ruby($1);
173
- }
174
190
 
175
191
  %typemap(out) TagLib::StringList {
176
- $result=StringList2Ruby($1);
192
+ $result=StringList2Ruby(&$1);
177
193
  }
178
194
 
179
195
  %apply TagLib::StringList & {TagLib::StringList const &};
180
196
 
181
197
 
182
198
  %typemap(out) String {
183
- $result = rb_tainted_str_new2($1.toCString(true));
199
+ $result = String2Ruby(&$1);
184
200
  };
185
201
 
186
202
  %typemap(in) String {
@@ -189,16 +205,23 @@ namespace TagLib {
189
205
 
190
206
 
191
207
  %apply String {String &, const String &};
192
-
193
208
  %typemap(in) ByteVector {
209
+ Check_Type($input, T_STRING);
194
210
  $1=new TagLib::ByteVector(StringValuePtr($input), RSTRING_LEN($input));
195
211
  };
196
212
 
213
+
197
214
  %typemap(out) ByteVector {
198
215
  $result = rb_tainted_str_new($1.data(),$1.size());
199
216
  };
200
217
 
201
- %apply ByteVector {ByteVector &, const ByteVector &};
218
+ %apply ByteVector {ByteVector &, const ByteVector &, ByteVector const &};
219
+
220
+ %typemap(out) TagLib::ID3v2::FrameList {
221
+ $result = FrameList2Ruby($1);
222
+ };
223
+
224
+ %apply TagLib::ID3v2::FrameList {TagLib::ID3v2::FrameList &, const TagLib::ID3v2::FrameList &, TagLib::ID3v2::FrameList const &};
202
225
 
203
226
  class AudioProperties {
204
227
  AudioProperties(ReadStyle style);
@@ -330,16 +353,20 @@ class File {
330
353
 
331
354
  };
332
355
  // Helpers for FieldListMap
333
- MAP_HELPERS(TagLib::StringList,StringList2Ruby)
356
+
357
+ MAP_HELPERS(TagLib::String, TagLib::StringList, String2Ruby, StringList2Ruby)
334
358
  // Helpers for GenreMap
335
- MAP_HELPERS(int,INT2FIX)
359
+ MAP_HELPERS(TagLib::String, int, String2Ruby, INT2FIX)
360
+ // Helpers for FrameListMap
361
+ MAP_HELPERS(TagLib::ByteVector, TagLib::ID3v2::FrameList, ByteVector2Ruby, FrameList2Ruby)
362
+
336
363
 
337
364
 
338
365
  %template (FieldListMap) Map<TagLib::String, TagLib::StringList>;
339
366
  %template (ItemListMap) Map<TagLib::String, TagLib::APE::Item>;
340
367
  %template (GenreMap) Map<TagLib::String, int>;
341
368
  %template (FrameListMap) Map < TagLib::ByteVector, TagLib::ID3v2::FrameList >;
342
-
369
+
343
370
  %template (StringList) List< TagLib::String >;
344
371
  %template (ByteVectorList) List<TagLib::ByteVector>;
345
372
  %template (FrameList) List< TagLib::ID3v2::Frame * >;
@@ -347,6 +374,9 @@ class File {
347
374
  typedef List<TagLib::ByteVector> ByteVectorList;
348
375
  typedef List<TagLib::String> StringList;
349
376
 
377
+ // Extends FrameListMap
378
+
379
+
350
380
  class FileRef {
351
381
  public:
352
382
  static StringList defaultFileExtensions ();
@@ -436,10 +466,7 @@ class File {
436
466
 
437
467
  };
438
468
  };
439
-
440
-
441
-
442
-
469
+
443
470
 
444
471
 
445
472
  namespace Ogg {
@@ -568,13 +595,14 @@ class File {
568
595
  };
569
596
 
570
597
  class File : public TagLib::Ogg::File {
571
- File (FileName file, bool readProperties=true, Properties::ReadStyle propertiesStyle=Properties::Average);
572
- virtual ~File ();
573
- virtual Ogg::XiphComment * tag () const;
574
- virtual Properties * audioProperties () const;
575
- virtual bool save ();
598
+ public:
599
+ File(FileName file, bool readProperties=true, Properties::ReadStyle propertiesStyle=Properties::Average);
600
+ virtual ~File ();
601
+ virtual Ogg::XiphComment * tag () const;
602
+ virtual Properties * audioProperties () const;
603
+ virtual bool save ();
576
604
  };
577
- }
605
+ }
578
606
  namespace ID3v1 {
579
607
 
580
608
  typedef Map<TagLib::String,int> GenreMap;
@@ -601,12 +629,33 @@ class File {
601
629
  %rename(ID3v2_AttachedPictureFrame) AttachedPictureFrame;
602
630
  %rename(ID3v2_Tag) Tag;
603
631
  %rename(ID3v2_Header) Header;
632
+ %rename(ID3v2_Frame) Frame;
604
633
  %rename(ID3v2_CommentsFrame) CommentsFrame;
605
634
  %rename(ID3v2_FrameFactory) FrameFactory;
606
635
  %rename(ID3v2_GeneralEncapsulatedObjectFrame) GeneralEncapsulatedObjectFrame;
607
636
  typedef List< Frame * >FrameList;
608
637
  typedef Map < ByteVector, FrameList > FrameListMap;
609
- class AttachedPictureFrame {
638
+
639
+ class Header {
640
+ Header();
641
+
642
+ };
643
+
644
+
645
+ class Frame : public TagLib::ID3v2::Header {
646
+ public:
647
+ virtual ~Frame ();
648
+ ByteVector frameID () const;
649
+ uint size () const ;
650
+ %extend {
651
+ VALUE __str__() {
652
+ return rb_tainted_str_new2($self->toString().toCString(false));
653
+ }
654
+ };
655
+
656
+ };
657
+
658
+ class AttachedPictureFrame : public TagLib::ID3v2::Frame {
610
659
  public:
611
660
  enum Type {
612
661
  Other = 0x00, FileIcon = 0x01, OtherFileIcon = 0x02, FrontCover = 0x03,
@@ -615,9 +664,17 @@ class File {
615
664
  Lyricist = 0x0C, RecordingLocation = 0x0D, DuringRecording = 0x0E, DuringPerformance = 0x0F,
616
665
  MovieScreenCapture = 0x10, ColouredFish = 0x11, Illustration = 0x12, BandLogo = 0x13,
617
666
  PublisherLogo = 0x14
618
- };
667
+ };
619
668
  AttachedPictureFrame ();
620
- AttachedPictureFrame (const ByteVector &data);
669
+ //AttachedPictureFrame (const ByteVector &data);
670
+
671
+ %extend {
672
+ static AttachedPictureFrame *new2(const ByteVector &data) {
673
+ return new TagLib::ID3v2::AttachedPictureFrame(data);
674
+ }
675
+ }
676
+
677
+
621
678
  virtual ~AttachedPictureFrame ();
622
679
  virtual String toString () const;
623
680
  String::Type textEncoding () const;
@@ -632,10 +689,13 @@ class File {
632
689
  void setPicture (const ByteVector &p);
633
690
  };
634
691
 
635
- class CommentsFrame {
692
+ class CommentsFrame : public TagLib::ID3v2::Frame {
693
+
636
694
  static CommentsFrame* TagLib::ID3v2::CommentsFrame::findByDescription ( const Tag * tag, const String & d);
695
+ public:
637
696
  CommentsFrame (String::Type encoding=String::Latin1);
638
- CommentsFrame (const ByteVector &data);
697
+ //CommentsFrame (const ByteVector &data);
698
+
639
699
  virtual ~CommentsFrame ();
640
700
  virtual String toString () const;
641
701
  ByteVector language () const;
@@ -667,16 +727,18 @@ class File {
667
727
  FrameFactory();
668
728
  ~FrameFactory();
669
729
  };
670
- class Header {
671
- Header();
672
-
673
- };
674
730
  class Tag : public TagLib::Tag {
675
731
  public:
676
732
  Tag();
677
733
  Tag(File *file, long tagOffset, const FrameFactory* factory);
678
734
  TAG_VIRTUALS()
679
735
  Header *header();
736
+ %apply SWIGTYPE *DISOWN {Frame *frame};
737
+ void addFrame (Frame *frame);
738
+ %clear Frame *frame;
739
+
740
+ const FrameListMap& frameListMap() const;
741
+ const FrameList& frameList() const;
680
742
  };
681
743
  };
682
744
 
data/swig/test.rb CHANGED
@@ -44,7 +44,7 @@ class RtaglibReadTestCase < Test::Unit::TestCase
44
44
  def test_file
45
45
  mp3=@data_dir+"440Hz-5sec.mp3"
46
46
  copy=get_copy(mp3)
47
- file=TagLib::MPEG::File.new(mp3)
47
+ file=TagLib::MPEG::File.new(copy)
48
48
  assert(file.writable?)
49
49
  assert(file.open?)
50
50
  assert(file.valid?)
@@ -63,7 +63,14 @@ class RtaglibReadTestCase < Test::Unit::TestCase
63
63
  needle=sprintf("%c%c%c%c%c",0x22,0x22,0x22,0xE6,0x63)
64
64
  assert_equal(-1,file.find2(needle,0))
65
65
  assert_equal(0x7B46,file.length())
66
-
66
+ expected=sprintf("%c%c%c%c%c%c",0x01,0x02,0x03,0x04,0x05,0x06)
67
+ file.seek(0)
68
+ file.writeBlock(expected)
69
+ file.save
70
+ file=nil
71
+ file=TagLib::MPEG::File.new(copy)
72
+ file.seek(0)
73
+ #assert_equal(expected,file.readBlock(6))
67
74
  end
68
75
  # TagLib::FileRef test for
69
76
  # - ::defaultFileExtensions()
@@ -78,7 +85,7 @@ class RtaglibReadTestCase < Test::Unit::TestCase
78
85
  bitrate={'flac'=>168,'wv'=>235,'mp3'=>48,'mpc'=>41,'ogg'=>80}
79
86
  channels={'flac'=>1,'wv'=>1,'mp3'=>1,'mpc'=>2,'ogg'=>1}
80
87
 
81
- Dir.glob(@data_dir+"/*").each{|f|
88
+ Dir.glob(@data_dir+"/440*").each{|f|
82
89
  fr=TagLib::FileRef.new(f)
83
90
  f=~/.+\.(.+)/
84
91
  ext=$1
@@ -121,6 +128,55 @@ class RtaglibReadTestCase < Test::Unit::TestCase
121
128
  assert_equal("Rock",fr3.tag.genre)
122
129
  assert_equal("new comment",fr3.tag.comment)
123
130
 
131
+ end
132
+ # Bug 2009-05-15
133
+ # Reporter: Jason Newton
134
+ # Assign UTF8 strings to tags return garbage
135
+ def test_bug_2009_05_15
136
+ mp3=@data_dir+"440Hz-5sec.mp3"
137
+ copy=get_copy(mp3)
138
+ copy2=get_copy(mp3)
139
+ fr=TagLib::FileRef.new(copy)
140
+ utf8_string="大塚愛"
141
+ expected="\345\244\247\345\241\232\346\204\233"
142
+ fr.tag().title=utf8_string
143
+ fr.save
144
+ fr=nil
145
+ fr=TagLib::FileRef.new(copy)
146
+ assert_equal(expected,fr.tag.title)
147
+
148
+ mp3=@data_dir+"test_jason.mp3"
149
+ s=get_copy(mp3)
150
+ d=get_copy(mp3)
151
+ s_tag=TagLib::FileRef.new(s)
152
+ d_tag=TagLib::FileRef.new(d)
153
+ artist="大塚愛"
154
+ # puts "artist = #{artist} => #{artist.inspect}"
155
+ assert_equal(artist,s_tag.tag.artist)
156
+ assert_equal(artist,d_tag.tag.artist)
157
+ d_tag.tag.artist=s_tag.tag.artist
158
+ assert_equal(d_tag.tag.artist, s_tag.tag.artist)
159
+ d_tag.save
160
+ d_tag=TagLib::FileRef.new(d)
161
+ assert_equal(d_tag.tag.artist, s_tag.tag.artist)
162
+
163
+
164
+
165
+ ogg=@data_dir+"test_jason.ogg"
166
+ s=get_copy(ogg)
167
+ d=get_copy(ogg)
168
+ s_tag=TagLib::FileRef.new(s)
169
+ d_tag=TagLib::FileRef.new(d)
170
+ artist="大塚愛"
171
+ # puts "artist = #{artist} => #{artist.inspect}"
172
+ assert_equal(artist,s_tag.tag.artist)
173
+ assert_equal(artist,d_tag.tag.artist)
174
+ d_tag.tag.artist=s_tag.tag.artist
175
+ assert_equal(d_tag.tag.artist, s_tag.tag.artist)
176
+ d_tag.save
177
+ d_tag=TagLib::FileRef.new(d)
178
+ assert_equal(d_tag.tag.artist, s_tag.tag.artist)
179
+
124
180
  end
125
181
  def test_flac
126
182
  original=@data_dir+"440Hz-5sec.flac"
data/test/test_taglib.rb CHANGED
@@ -44,7 +44,7 @@ class RtaglibReadTestCase < Test::Unit::TestCase
44
44
  def test_file
45
45
  mp3=@data_dir+"440Hz-5sec.mp3"
46
46
  copy=get_copy(mp3)
47
- file=TagLib::MPEG::File.new(mp3)
47
+ file=TagLib::MPEG::File.new(copy)
48
48
  assert(file.writable?)
49
49
  assert(file.open?)
50
50
  assert(file.valid?)
@@ -63,7 +63,14 @@ class RtaglibReadTestCase < Test::Unit::TestCase
63
63
  needle=sprintf("%c%c%c%c%c",0x22,0x22,0x22,0xE6,0x63)
64
64
  assert_equal(-1,file.find2(needle,0))
65
65
  assert_equal(0x7B46,file.length())
66
-
66
+ expected=sprintf("%c%c%c%c%c%c",0x01,0x02,0x03,0x04,0x05,0x06)
67
+ file.seek(0)
68
+ file.writeBlock(expected)
69
+ file.save
70
+ file=nil
71
+ file=TagLib::MPEG::File.new(copy)
72
+ file.seek(0)
73
+ #assert_equal(expected,file.readBlock(6))
67
74
  end
68
75
  # TagLib::FileRef test for
69
76
  # - ::defaultFileExtensions()
@@ -78,7 +85,7 @@ class RtaglibReadTestCase < Test::Unit::TestCase
78
85
  bitrate={'flac'=>168,'wv'=>235,'mp3'=>48,'mpc'=>41,'ogg'=>80}
79
86
  channels={'flac'=>1,'wv'=>1,'mp3'=>1,'mpc'=>2,'ogg'=>1}
80
87
 
81
- Dir.glob(@data_dir+"/*").each{|f|
88
+ Dir.glob(@data_dir+"/440*").each{|f|
82
89
  fr=TagLib::FileRef.new(f)
83
90
  f=~/.+\.(.+)/
84
91
  ext=$1
@@ -121,6 +128,55 @@ class RtaglibReadTestCase < Test::Unit::TestCase
121
128
  assert_equal("Rock",fr3.tag.genre)
122
129
  assert_equal("new comment",fr3.tag.comment)
123
130
 
131
+ end
132
+ # Bug 2009-05-15
133
+ # Reporter: Jason Newton
134
+ # Assign UTF8 strings to tags return garbage
135
+ def test_bug_2009_05_15
136
+ mp3=@data_dir+"440Hz-5sec.mp3"
137
+ copy=get_copy(mp3)
138
+ copy2=get_copy(mp3)
139
+ fr=TagLib::FileRef.new(copy)
140
+ utf8_string="大塚愛"
141
+ expected="\345\244\247\345\241\232\346\204\233"
142
+ fr.tag().title=utf8_string
143
+ fr.save
144
+ fr=nil
145
+ fr=TagLib::FileRef.new(copy)
146
+ assert_equal(expected,fr.tag.title)
147
+
148
+ mp3=@data_dir+"test_jason.mp3"
149
+ s=get_copy(mp3)
150
+ d=get_copy(mp3)
151
+ s_tag=TagLib::FileRef.new(s)
152
+ d_tag=TagLib::FileRef.new(d)
153
+ artist="大塚愛"
154
+ # puts "artist = #{artist} => #{artist.inspect}"
155
+ assert_equal(artist,s_tag.tag.artist)
156
+ assert_equal(artist,d_tag.tag.artist)
157
+ d_tag.tag.artist=s_tag.tag.artist
158
+ assert_equal(d_tag.tag.artist, s_tag.tag.artist)
159
+ d_tag.save
160
+ d_tag=TagLib::FileRef.new(d)
161
+ assert_equal(d_tag.tag.artist, s_tag.tag.artist)
162
+
163
+
164
+
165
+ ogg=@data_dir+"test_jason.ogg"
166
+ s=get_copy(ogg)
167
+ d=get_copy(ogg)
168
+ s_tag=TagLib::FileRef.new(s)
169
+ d_tag=TagLib::FileRef.new(d)
170
+ artist="大塚愛"
171
+ # puts "artist = #{artist} => #{artist.inspect}"
172
+ assert_equal(artist,s_tag.tag.artist)
173
+ assert_equal(artist,d_tag.tag.artist)
174
+ d_tag.tag.artist=s_tag.tag.artist
175
+ assert_equal(d_tag.tag.artist, s_tag.tag.artist)
176
+ d_tag.save
177
+ d_tag=TagLib::FileRef.new(d)
178
+ assert_equal(d_tag.tag.artist, s_tag.tag.artist)
179
+
124
180
  end
125
181
  def test_flac
126
182
  original=@data_dir+"440Hz-5sec.flac"