rtaglib 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +4 -0
- data/Manifest.txt +84 -9
- data/README.txt +0 -0
- data/Rakefile +30 -27
- data/{test/data → data}/440Hz-5sec.flac +0 -0
- data/{test/data → data}/440Hz-5sec.mp3 +0 -0
- data/{test/data → data}/440Hz-5sec.mpc +0 -0
- data/{test/data → data}/440Hz-5sec.ogg +0 -0
- data/{test/data → data}/440Hz-5sec.wv +0 -0
- data/data/test_jason.mp3 +0 -0
- data/data/test_jason.ogg +0 -0
- data/ext/Rakefile +10 -0
- data/ext/tagfile/Rakefile.rb +42 -0
- data/ext/tagfile/rake_ext_conf.rb +29 -0
- data/ext/tagfile/tagfile.c +11 -7
- data/ext/taglib/Rakefile.rb +48 -0
- data/ext/taglib/rake_ext_conf.rb +33 -0
- data/ext/taglib/taglib-mswin32/bin/tag.dll +0 -0
- data/ext/taglib/taglib-mswin32/bin/tag_c.dll +0 -0
- data/ext/taglib/taglib-mswin32/bin/tag_cd.dll +0 -0
- data/ext/taglib/taglib-mswin32/bin/tagd.dll +0 -0
- data/ext/taglib/taglib-mswin32/bin/taglib-config +55 -0
- data/ext/taglib/taglib-mswin32/include/taglib/apefooter.h +173 -0
- data/ext/taglib/taglib-mswin32/include/taglib/apeitem.h +204 -0
- data/ext/taglib/taglib-mswin32/include/taglib/apetag.h +162 -0
- data/ext/taglib/taglib-mswin32/include/taglib/attachedpictureframe.h +220 -0
- data/ext/taglib/taglib-mswin32/include/taglib/audioproperties.h +110 -0
- data/ext/taglib/taglib-mswin32/include/taglib/commentsframe.h +168 -0
- data/ext/taglib/taglib-mswin32/include/taglib/fileref.h +262 -0
- data/ext/taglib/taglib-mswin32/include/taglib/flacfile.h +201 -0
- data/ext/taglib/taglib-mswin32/include/taglib/flacproperties.h +92 -0
- data/ext/taglib/taglib-mswin32/include/taglib/generalencapsulatedobjectframe.h +174 -0
- data/ext/taglib/taglib-mswin32/include/taglib/id3v1genres.h +66 -0
- data/ext/taglib/taglib-mswin32/include/taglib/id3v1tag.h +180 -0
- data/ext/taglib/taglib-mswin32/include/taglib/id3v2extendedheader.h +93 -0
- data/ext/taglib/taglib-mswin32/include/taglib/id3v2footer.h +82 -0
- data/ext/taglib/taglib-mswin32/include/taglib/id3v2frame.h +414 -0
- data/ext/taglib/taglib-mswin32/include/taglib/id3v2framefactory.h +167 -0
- data/ext/taglib/taglib-mswin32/include/taglib/id3v2header.h +175 -0
- data/ext/taglib/taglib-mswin32/include/taglib/id3v2synchdata.h +70 -0
- data/ext/taglib/taglib-mswin32/include/taglib/id3v2tag.h +300 -0
- data/ext/taglib/taglib-mswin32/include/taglib/mpcfile.h +175 -0
- data/ext/taglib/taglib-mswin32/include/taglib/mpcproperties.h +85 -0
- data/ext/taglib/taglib-mswin32/include/taglib/mpegfile.h +277 -0
- data/ext/taglib/taglib-mswin32/include/taglib/mpegheader.h +166 -0
- data/ext/taglib/taglib-mswin32/include/taglib/mpegproperties.h +118 -0
- data/ext/taglib/taglib-mswin32/include/taglib/oggfile.h +112 -0
- data/ext/taglib/taglib-mswin32/include/taglib/oggflacfile.h +118 -0
- data/ext/taglib/taglib-mswin32/include/taglib/oggpage.h +203 -0
- data/ext/taglib/taglib-mswin32/include/taglib/oggpageheader.h +232 -0
- data/ext/taglib/taglib-mswin32/include/taglib/relativevolumeframe.h +274 -0
- data/ext/taglib/taglib-mswin32/include/taglib/speexfile.h +99 -0
- data/ext/taglib/taglib-mswin32/include/taglib/speexproperties.h +89 -0
- data/ext/taglib/taglib-mswin32/include/taglib/tag.h +173 -0
- data/ext/taglib/taglib-mswin32/include/taglib/tag_c.h +288 -0
- data/ext/taglib/taglib-mswin32/include/taglib/taglib.h +177 -0
- data/ext/taglib/taglib-mswin32/include/taglib/taglib_export.h +39 -0
- data/ext/taglib/taglib-mswin32/include/taglib/tbytevector.h +409 -0
- data/ext/taglib/taglib-mswin32/include/taglib/tbytevectorlist.h +91 -0
- data/ext/taglib/taglib-mswin32/include/taglib/textidentificationframe.h +258 -0
- data/ext/taglib/taglib-mswin32/include/taglib/tfile.h +271 -0
- data/ext/taglib/taglib-mswin32/include/taglib/tlist.h +252 -0
- data/ext/taglib/taglib-mswin32/include/taglib/tlist.tcc +316 -0
- data/ext/taglib/taglib-mswin32/include/taglib/tmap.h +200 -0
- data/ext/taglib/taglib-mswin32/include/taglib/tmap.tcc +196 -0
- data/ext/taglib/taglib-mswin32/include/taglib/trueaudiofile.h +180 -0
- data/ext/taglib/taglib-mswin32/include/taglib/trueaudioproperties.h +93 -0
- data/ext/taglib/taglib-mswin32/include/taglib/tstring.h +456 -0
- data/ext/taglib/taglib-mswin32/include/taglib/tstringlist.h +115 -0
- data/ext/taglib/taglib-mswin32/include/taglib/uniquefileidentifierframe.h +113 -0
- data/ext/taglib/taglib-mswin32/include/taglib/unknownframe.h +79 -0
- data/ext/taglib/taglib-mswin32/include/taglib/unsynchronizedlyricsframe.h +157 -0
- data/ext/taglib/taglib-mswin32/include/taglib/urllinkframe.h +172 -0
- data/ext/taglib/taglib-mswin32/include/taglib/vorbisfile.h +118 -0
- data/ext/taglib/taglib-mswin32/include/taglib/vorbisproperties.h +125 -0
- data/ext/taglib/taglib-mswin32/include/taglib/wavpackfile.h +164 -0
- data/ext/taglib/taglib-mswin32/include/taglib/wavpackproperties.h +94 -0
- data/ext/taglib/taglib-mswin32/include/taglib/xingheader.h +100 -0
- data/ext/taglib/taglib-mswin32/include/taglib/xiphcomment.h +202 -0
- data/ext/taglib/taglib-mswin32/lib/pkgconfig/taglib_c.pc +12 -0
- data/ext/taglib/taglib-mswin32/lib/tag.lib +0 -0
- data/ext/taglib/taglib-mswin32/lib/tag_c.lib +0 -0
- data/ext/taglib/taglib_i386-mingw32.source +22645 -0
- data/ext/taglib/taglib_i386-mswin32.source +22645 -0
- data/ext/taglib/{taglib.cxx → taglib_x86_64-linux.source} +508 -75
- data/lib/TagLib.rb +3 -2
- data/lib/TagLib_doc.rb +1532 -1526
- data/lib/rtaglib_mswin32.rb +4 -0
- data/lib/tagfile.rb +6 -0
- data/swig/Doxyfile +0 -0
- data/swig/Rakefile +44 -19
- data/swig/TagLib_doc.rb +2755 -0
- data/swig/make_doc.rb +5 -4
- data/swig/process_cxx.rb +2 -2
- data/swig/rake_ext_conf.rb +33 -0
- data/swig/taglib.i +8 -5
- data/swig/test.rb +47 -39
- data/test/test_read.rb +4 -3
- data/test/test_taglib.rb +47 -39
- data/test/test_write.rb +4 -3
- metadata +96 -20
- data/ext/tagfile/extconf.rb +0 -14
- data/ext/taglib/extconf.rb +0 -22
- data/swig/extconf.rb +0 -22
@@ -0,0 +1,167 @@
|
|
1
|
+
/***************************************************************************
|
2
|
+
copyright : (C) 2002 - 2008 by Scott Wheeler
|
3
|
+
email : wheeler@kde.org
|
4
|
+
***************************************************************************/
|
5
|
+
|
6
|
+
/***************************************************************************
|
7
|
+
* This library is free software; you can redistribute it and/or modify *
|
8
|
+
* it under the terms of the GNU Lesser General Public License version *
|
9
|
+
* 2.1 as published by the Free Software Foundation. *
|
10
|
+
* *
|
11
|
+
* This library is distributed in the hope that it will be useful, but *
|
12
|
+
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
13
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
14
|
+
* Lesser General Public License for more details. *
|
15
|
+
* *
|
16
|
+
* You should have received a copy of the GNU Lesser General Public *
|
17
|
+
* License along with this library; if not, write to the Free Software *
|
18
|
+
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
19
|
+
* USA *
|
20
|
+
* *
|
21
|
+
* Alternatively, this file is available under the Mozilla Public *
|
22
|
+
* License Version 1.1. You may obtain a copy of the License at *
|
23
|
+
* http://www.mozilla.org/MPL/ *
|
24
|
+
***************************************************************************/
|
25
|
+
|
26
|
+
#ifndef TAGLIB_ID3V2FRAMEFACTORY_H
|
27
|
+
#define TAGLIB_ID3V2FRAMEFACTORY_H
|
28
|
+
|
29
|
+
#include "taglib_export.h"
|
30
|
+
#include "tbytevector.h"
|
31
|
+
#include "id3v2frame.h"
|
32
|
+
#include "id3v2header.h"
|
33
|
+
|
34
|
+
namespace TagLib {
|
35
|
+
|
36
|
+
namespace ID3v2 {
|
37
|
+
|
38
|
+
class TAGLIB_EXPORT TextIdentificationFrame;
|
39
|
+
|
40
|
+
//! A factory for creating ID3v2 frames during parsing
|
41
|
+
|
42
|
+
/*!
|
43
|
+
* This factory abstracts away the frame creation process and instantiates
|
44
|
+
* the appropriate ID3v2::Frame subclasses based on the contents of the
|
45
|
+
* data.
|
46
|
+
*
|
47
|
+
* Reimplementing this factory is the key to adding support for frame types
|
48
|
+
* not directly supported by TagLib to your application. To do so you would
|
49
|
+
* subclass this factory reimplement createFrame(). Then by setting your
|
50
|
+
* factory to be the default factory in ID3v2::Tag constructor or with
|
51
|
+
* MPEG::File::setID3v2FrameFactory() you can implement behavior that will
|
52
|
+
* allow for new ID3v2::Frame subclasses (also provided by you) to be used.
|
53
|
+
*
|
54
|
+
* This implements both <i>abstract factory</i> and <i>singleton</i> patterns
|
55
|
+
* of which more information is available on the web and in software design
|
56
|
+
* textbooks (Notably <i>Design Patters</i>).
|
57
|
+
*
|
58
|
+
* \note You do not need to use this factory to create new frames to add to
|
59
|
+
* an ID3v2::Tag. You can instantiate frame subclasses directly (with new)
|
60
|
+
* and add them to a tag using ID3v2::Tag::addFrame()
|
61
|
+
*
|
62
|
+
* \see ID3v2::Tag::addFrame()
|
63
|
+
*/
|
64
|
+
|
65
|
+
class TAGLIB_EXPORT FrameFactory
|
66
|
+
{
|
67
|
+
public:
|
68
|
+
static FrameFactory *instance();
|
69
|
+
/*!
|
70
|
+
* Create a frame based on \a data. \a synchSafeInts should only be set
|
71
|
+
* false if we are parsing an old tag (v2.3 or older) that does not support
|
72
|
+
* synchsafe ints.
|
73
|
+
*
|
74
|
+
* \deprecated Please use the method below that accepts a ID3v2::Header
|
75
|
+
* instance in new code.
|
76
|
+
*/
|
77
|
+
Frame *createFrame(const ByteVector &data, bool synchSafeInts) const;
|
78
|
+
|
79
|
+
/*!
|
80
|
+
* Create a frame based on \a data. \a version should indicate the ID3v2
|
81
|
+
* version of the tag. As ID3v2.4 is the most current version of the
|
82
|
+
* standard 4 is the default.
|
83
|
+
*
|
84
|
+
* \deprecated Please use the method below that accepts a ID3v2::Header
|
85
|
+
* instance in new code.
|
86
|
+
*/
|
87
|
+
Frame *createFrame(const ByteVector &data, uint version = 4) const;
|
88
|
+
|
89
|
+
/*!
|
90
|
+
* Create a frame based on \a data. \a tagHeader should be a valid
|
91
|
+
* ID3v2::Header instance.
|
92
|
+
*/
|
93
|
+
// BIC: make virtual
|
94
|
+
Frame *createFrame(const ByteVector &data, Header *tagHeader) const;
|
95
|
+
|
96
|
+
/*!
|
97
|
+
* Returns the default text encoding for text frames. If setTextEncoding()
|
98
|
+
* has not been explicitly called this will only be used for new text
|
99
|
+
* frames. However, if this value has been set explicitly all frames will be
|
100
|
+
* converted to this type (unless it's explitly set differently for the
|
101
|
+
* individual frame) when being rendered.
|
102
|
+
*
|
103
|
+
* \see setDefaultTextEncoding()
|
104
|
+
*/
|
105
|
+
String::Type defaultTextEncoding() const;
|
106
|
+
|
107
|
+
/*!
|
108
|
+
* Set the default text encoding for all text frames that are created to
|
109
|
+
* \a encoding. If no value is set the frames with either default to the
|
110
|
+
* encoding type that was parsed and new frames default to Latin1.
|
111
|
+
*
|
112
|
+
* Valid string types for ID3v2 tags are Latin1, UTF8, UTF16 and UTF16BE.
|
113
|
+
*
|
114
|
+
* \see defaultTextEncoding()
|
115
|
+
*/
|
116
|
+
void setDefaultTextEncoding(String::Type encoding);
|
117
|
+
|
118
|
+
protected:
|
119
|
+
/*!
|
120
|
+
* Constructs a frame factory. Because this is a singleton this method is
|
121
|
+
* protected, but may be used for subclasses.
|
122
|
+
*/
|
123
|
+
FrameFactory();
|
124
|
+
|
125
|
+
/*!
|
126
|
+
* Destroys the frame factory. In most cases this will never be called (as
|
127
|
+
* is typical of singletons).
|
128
|
+
*/
|
129
|
+
virtual ~FrameFactory();
|
130
|
+
|
131
|
+
/*!
|
132
|
+
* This method checks for compliance to the current ID3v2 standard (2.4)
|
133
|
+
* and does nothing in the common case. However if a frame is found that
|
134
|
+
* is not compatible with the current standard, this method either updates
|
135
|
+
* the frame or indicates that it should be discarded.
|
136
|
+
*
|
137
|
+
* This method with return true (with or without changes to the frame) if
|
138
|
+
* this frame should be kept or false if it should be discarded.
|
139
|
+
*
|
140
|
+
* See the id3v2.4.0-changes.txt document for further information.
|
141
|
+
*/
|
142
|
+
virtual bool updateFrame(Frame::Header *header) const;
|
143
|
+
|
144
|
+
private:
|
145
|
+
FrameFactory(const FrameFactory &);
|
146
|
+
FrameFactory &operator=(const FrameFactory &);
|
147
|
+
|
148
|
+
/*!
|
149
|
+
* This method is used internally to convert a frame from ID \a from to ID
|
150
|
+
* \a to. If the frame matches the \a from pattern and converts the frame
|
151
|
+
* ID in the \a header or simply does nothing if the frame ID does not match.
|
152
|
+
*/
|
153
|
+
void convertFrame(const char *from, const char *to,
|
154
|
+
Frame::Header *header) const;
|
155
|
+
|
156
|
+
void updateGenre(TextIdentificationFrame *frame) const;
|
157
|
+
|
158
|
+
static FrameFactory *factory;
|
159
|
+
|
160
|
+
class FrameFactoryPrivate;
|
161
|
+
FrameFactoryPrivate *d;
|
162
|
+
};
|
163
|
+
|
164
|
+
}
|
165
|
+
}
|
166
|
+
|
167
|
+
#endif
|
@@ -0,0 +1,175 @@
|
|
1
|
+
/***************************************************************************
|
2
|
+
copyright : (C) 2002 - 2008 by Scott Wheeler
|
3
|
+
email : wheeler@kde.org
|
4
|
+
***************************************************************************/
|
5
|
+
|
6
|
+
/***************************************************************************
|
7
|
+
* This library is free software; you can redistribute it and/or modify *
|
8
|
+
* it under the terms of the GNU Lesser General Public License version *
|
9
|
+
* 2.1 as published by the Free Software Foundation. *
|
10
|
+
* *
|
11
|
+
* This library is distributed in the hope that it will be useful, but *
|
12
|
+
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
13
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
14
|
+
* Lesser General Public License for more details. *
|
15
|
+
* *
|
16
|
+
* You should have received a copy of the GNU Lesser General Public *
|
17
|
+
* License along with this library; if not, write to the Free Software *
|
18
|
+
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
19
|
+
* USA *
|
20
|
+
* *
|
21
|
+
* Alternatively, this file is available under the Mozilla Public *
|
22
|
+
* License Version 1.1. You may obtain a copy of the License at *
|
23
|
+
* http://www.mozilla.org/MPL/ *
|
24
|
+
***************************************************************************/
|
25
|
+
|
26
|
+
#ifndef TAGLIB_ID3V2HEADER_H
|
27
|
+
#define TAGLIB_ID3V2HEADER_H
|
28
|
+
|
29
|
+
#include "tbytevector.h"
|
30
|
+
#include "taglib_export.h"
|
31
|
+
|
32
|
+
namespace TagLib {
|
33
|
+
|
34
|
+
namespace ID3v2 {
|
35
|
+
|
36
|
+
//! An implementation of ID3v2 headers
|
37
|
+
|
38
|
+
/*!
|
39
|
+
* This class implements ID3v2 headers. It attempts to follow, both
|
40
|
+
* semantically and programatically, the structure specified in
|
41
|
+
* the ID3v2 standard. The API is based on the properties of ID3v2 headers
|
42
|
+
* specified there. If any of the terms used in this documentation are
|
43
|
+
* unclear please check the specification in the linked section.
|
44
|
+
* (Structure, <a href="id3v2-structure.html#3.1">3.1</a>)
|
45
|
+
*/
|
46
|
+
|
47
|
+
class TAGLIB_EXPORT Header
|
48
|
+
{
|
49
|
+
public:
|
50
|
+
/*!
|
51
|
+
* Constructs an empty ID3v2 header.
|
52
|
+
*/
|
53
|
+
Header();
|
54
|
+
|
55
|
+
/*!
|
56
|
+
* Constructs an ID3v2 header based on \a data. parse() is called
|
57
|
+
* immediately.
|
58
|
+
*/
|
59
|
+
Header(const ByteVector &data);
|
60
|
+
|
61
|
+
/*!
|
62
|
+
* Destroys the header.
|
63
|
+
*/
|
64
|
+
virtual ~Header();
|
65
|
+
|
66
|
+
/*!
|
67
|
+
* Returns the major version number. (Note: This is the 4, not the 2 in
|
68
|
+
* ID3v2.4.0. The 2 is implied.)
|
69
|
+
*/
|
70
|
+
uint majorVersion() const;
|
71
|
+
|
72
|
+
/*!
|
73
|
+
* Set the the major version number to \a version. (Note: This is
|
74
|
+
* the 4, not the 2 in ID3v2.4.0. The 2 is implied.)
|
75
|
+
* \see majorVersion()
|
76
|
+
*
|
77
|
+
* \note This is used by the internal parser; this will not change the
|
78
|
+
* version which is written and in general should not be called by API
|
79
|
+
* users.
|
80
|
+
*/
|
81
|
+
void setMajorVersion(uint version);
|
82
|
+
|
83
|
+
/*!
|
84
|
+
* Returns the revision number. (Note: This is the 0, not the 4 in
|
85
|
+
* ID3v2.4.0. The 2 is implied.)
|
86
|
+
*/
|
87
|
+
uint revisionNumber() const;
|
88
|
+
|
89
|
+
/*!
|
90
|
+
* Returns true if unsynchronisation has been applied to all frames.
|
91
|
+
*/
|
92
|
+
bool unsynchronisation() const;
|
93
|
+
|
94
|
+
/*!
|
95
|
+
* Returns true if an extended header is present in the tag.
|
96
|
+
*/
|
97
|
+
bool extendedHeader() const;
|
98
|
+
|
99
|
+
/*!
|
100
|
+
* Returns true if the experimental indicator flag is set.
|
101
|
+
*/
|
102
|
+
bool experimentalIndicator() const;
|
103
|
+
|
104
|
+
/*!
|
105
|
+
* Returns true if a footer is present in the tag.
|
106
|
+
*/
|
107
|
+
bool footerPresent() const;
|
108
|
+
/*!
|
109
|
+
* Returns the tag size in bytes. This is the size of the frame content.
|
110
|
+
* The size of the \e entire tag will be this plus the header size (10
|
111
|
+
* bytes) and, if present, the footer size (potentially another 10 bytes).
|
112
|
+
*
|
113
|
+
* \note This is the value as read from the header to which TagLib attempts
|
114
|
+
* to provide an API to; it was not a design decision on the part of TagLib
|
115
|
+
* to not include the mentioned portions of the tag in the \e size.
|
116
|
+
*
|
117
|
+
* \see completeTagSize()
|
118
|
+
*/
|
119
|
+
uint tagSize() const;
|
120
|
+
|
121
|
+
/*!
|
122
|
+
* Returns the tag size, including the header and, if present, the footer
|
123
|
+
* size.
|
124
|
+
*
|
125
|
+
* \see tagSize()
|
126
|
+
*/
|
127
|
+
uint completeTagSize() const;
|
128
|
+
|
129
|
+
/*!
|
130
|
+
* Set the tag size to \a s.
|
131
|
+
* \see tagSize()
|
132
|
+
*/
|
133
|
+
void setTagSize(uint s);
|
134
|
+
|
135
|
+
/*!
|
136
|
+
* Returns the size of the header. Presently this is always 10 bytes.
|
137
|
+
*/
|
138
|
+
static uint size();
|
139
|
+
|
140
|
+
/*!
|
141
|
+
* Returns the string used to identify and ID3v2 tag inside of a file.
|
142
|
+
* Presently this is always "ID3".
|
143
|
+
*/
|
144
|
+
static ByteVector fileIdentifier();
|
145
|
+
|
146
|
+
/*!
|
147
|
+
* Sets the data that will be used as the header. 10 bytes, starting from
|
148
|
+
* the beginning of \a data are used.
|
149
|
+
*/
|
150
|
+
void setData(const ByteVector &data);
|
151
|
+
|
152
|
+
/*!
|
153
|
+
* Renders the Header back to binary format.
|
154
|
+
*/
|
155
|
+
ByteVector render() const;
|
156
|
+
|
157
|
+
protected:
|
158
|
+
/*!
|
159
|
+
* Called by setData() to parse the header data. It makes this information
|
160
|
+
* available through the public API.
|
161
|
+
*/
|
162
|
+
void parse(const ByteVector &data);
|
163
|
+
|
164
|
+
private:
|
165
|
+
Header(const Header &);
|
166
|
+
Header &operator=(const Header &);
|
167
|
+
|
168
|
+
class HeaderPrivate;
|
169
|
+
HeaderPrivate *d;
|
170
|
+
};
|
171
|
+
|
172
|
+
}
|
173
|
+
}
|
174
|
+
|
175
|
+
#endif
|
@@ -0,0 +1,70 @@
|
|
1
|
+
/***************************************************************************
|
2
|
+
copyright : (C) 2002 - 2008 by Scott Wheeler
|
3
|
+
email : wheeler@kde.org
|
4
|
+
***************************************************************************/
|
5
|
+
|
6
|
+
/***************************************************************************
|
7
|
+
* This library is free software; you can redistribute it and/or modify *
|
8
|
+
* it under the terms of the GNU Lesser General Public License version *
|
9
|
+
* 2.1 as published by the Free Software Foundation. *
|
10
|
+
* *
|
11
|
+
* This library is distributed in the hope that it will be useful, but *
|
12
|
+
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
13
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
14
|
+
* Lesser General Public License for more details. *
|
15
|
+
* *
|
16
|
+
* You should have received a copy of the GNU Lesser General Public *
|
17
|
+
* License along with this library; if not, write to the Free Software *
|
18
|
+
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
19
|
+
* USA *
|
20
|
+
* *
|
21
|
+
* Alternatively, this file is available under the Mozilla Public *
|
22
|
+
* License Version 1.1. You may obtain a copy of the License at *
|
23
|
+
* http://www.mozilla.org/MPL/ *
|
24
|
+
***************************************************************************/
|
25
|
+
|
26
|
+
#ifndef TAGLIB_ID3V2SYNCHDATA_H
|
27
|
+
#define TAGLIB_ID3V2SYNCHDATA_H
|
28
|
+
|
29
|
+
#include "tbytevector.h"
|
30
|
+
#include "taglib.h"
|
31
|
+
|
32
|
+
namespace TagLib {
|
33
|
+
|
34
|
+
namespace ID3v2 {
|
35
|
+
|
36
|
+
//! A few functions for ID3v2 synch safe integer conversion
|
37
|
+
|
38
|
+
/*!
|
39
|
+
* In the ID3v2.4 standard most integer values are encoded as "synch safe"
|
40
|
+
* integers which are encoded in such a way that they will not give false
|
41
|
+
* MPEG syncs and confuse MPEG decoders. This namespace provides some
|
42
|
+
* methods for converting to and from these values to ByteVectors for
|
43
|
+
* things rendering and parsing ID3v2 data.
|
44
|
+
*/
|
45
|
+
|
46
|
+
namespace SynchData
|
47
|
+
{
|
48
|
+
/*!
|
49
|
+
* This returns the unsigned integer value of \a data where \a data is a
|
50
|
+
* ByteVector that contains a \e synchsafe integer (Structure,
|
51
|
+
* <a href="id3v2-structure.html#6.2">6.2</a>). The default \a length of
|
52
|
+
* 4 is used if another value is not specified.
|
53
|
+
*/
|
54
|
+
TAGLIB_EXPORT uint toUInt(const ByteVector &data);
|
55
|
+
|
56
|
+
/*!
|
57
|
+
* Returns a 4 byte (32 bit) synchsafe integer based on \a value.
|
58
|
+
*/
|
59
|
+
TAGLIB_EXPORT ByteVector fromUInt(uint value);
|
60
|
+
|
61
|
+
/*!
|
62
|
+
* Convert the data from unsynchronized data to its original format.
|
63
|
+
*/
|
64
|
+
TAGLIB_EXPORT ByteVector decode(const ByteVector &input);
|
65
|
+
}
|
66
|
+
|
67
|
+
}
|
68
|
+
}
|
69
|
+
|
70
|
+
#endif
|
@@ -0,0 +1,300 @@
|
|
1
|
+
/***************************************************************************
|
2
|
+
copyright : (C) 2002 - 2008 by Scott Wheeler
|
3
|
+
email : wheeler@kde.org
|
4
|
+
***************************************************************************/
|
5
|
+
|
6
|
+
/***************************************************************************
|
7
|
+
* This library is free software; you can redistribute it and/or modify *
|
8
|
+
* it under the terms of the GNU Lesser General Public License version *
|
9
|
+
* 2.1 as published by the Free Software Foundation. *
|
10
|
+
* *
|
11
|
+
* This library is distributed in the hope that it will be useful, but *
|
12
|
+
* WITHOUT ANY WARRANTY; without even the implied warranty of *
|
13
|
+
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
|
14
|
+
* Lesser General Public License for more details. *
|
15
|
+
* *
|
16
|
+
* You should have received a copy of the GNU Lesser General Public *
|
17
|
+
* License along with this library; if not, write to the Free Software *
|
18
|
+
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 *
|
19
|
+
* USA *
|
20
|
+
* *
|
21
|
+
* Alternatively, this file is available under the Mozilla Public *
|
22
|
+
* License Version 1.1. You may obtain a copy of the License at *
|
23
|
+
* http://www.mozilla.org/MPL/ *
|
24
|
+
***************************************************************************/
|
25
|
+
|
26
|
+
#ifndef TAGLIB_ID3V2TAG_H
|
27
|
+
#define TAGLIB_ID3V2TAG_H
|
28
|
+
|
29
|
+
#include "tag.h"
|
30
|
+
#include "tbytevector.h"
|
31
|
+
#include "tstring.h"
|
32
|
+
#include "tlist.h"
|
33
|
+
#include "tmap.h"
|
34
|
+
#include "taglib_export.h"
|
35
|
+
|
36
|
+
#include "id3v2framefactory.h"
|
37
|
+
|
38
|
+
namespace TagLib {
|
39
|
+
|
40
|
+
class File;
|
41
|
+
|
42
|
+
//! An ID3v2 implementation
|
43
|
+
|
44
|
+
/*!
|
45
|
+
* This is a relatively complete and flexible framework for working with ID3v2
|
46
|
+
* tags.
|
47
|
+
*
|
48
|
+
* \see ID3v2::Tag
|
49
|
+
*/
|
50
|
+
|
51
|
+
namespace ID3v2 {
|
52
|
+
|
53
|
+
class Header;
|
54
|
+
class ExtendedHeader;
|
55
|
+
class Footer;
|
56
|
+
|
57
|
+
typedef List<Frame *> FrameList;
|
58
|
+
typedef Map<ByteVector, FrameList> FrameListMap;
|
59
|
+
|
60
|
+
//! The main class in the ID3v2 implementation
|
61
|
+
|
62
|
+
/*!
|
63
|
+
* This is the main class in the ID3v2 implementation. It serves two
|
64
|
+
* functions. This first, as is obvious from the public API, is to provide a
|
65
|
+
* container for the other ID3v2 related classes. In addition, through the
|
66
|
+
* read() and parse() protected methods, it provides the most basic level of
|
67
|
+
* parsing. In these methods the ID3v2 tag is extracted from the file and
|
68
|
+
* split into data components.
|
69
|
+
*
|
70
|
+
* ID3v2 tags have several parts, TagLib attempts to provide an interface
|
71
|
+
* for them all. header(), footer() and extendedHeader() corespond to those
|
72
|
+
* data structures in the ID3v2 standard and the APIs for the classes that
|
73
|
+
* they return attempt to reflect this.
|
74
|
+
*
|
75
|
+
* Also ID3v2 tags are built up from a list of frames, which are in turn
|
76
|
+
* have a header and a list of fields. TagLib provides two ways of accessing
|
77
|
+
* the list of frames that are in a given ID3v2 tag. The first is simply
|
78
|
+
* via the frameList() method. This is just a list of pointers to the frames.
|
79
|
+
* The second is a map from the frame type -- i.e. "COMM" for comments -- and
|
80
|
+
* a list of frames of that type. (In some cases ID3v2 allows for multiple
|
81
|
+
* frames of the same type, hence this being a map to a list rather than just
|
82
|
+
* a map to an individual frame.)
|
83
|
+
*
|
84
|
+
* More information on the structure of frames can be found in the ID3v2::Frame
|
85
|
+
* class.
|
86
|
+
*
|
87
|
+
* read() and parse() pass binary data to the other ID3v2 class structures,
|
88
|
+
* they do not handle parsing of flags or fields, for instace. Those are
|
89
|
+
* handled by similar functions within those classes.
|
90
|
+
*
|
91
|
+
* \note All pointers to data structures within the tag will become invalid
|
92
|
+
* when the tag is destroyed.
|
93
|
+
*
|
94
|
+
* \warning Dealing with the nasty details of ID3v2 is not for the faint of
|
95
|
+
* heart and should not be done without much meditation on the spec. It's
|
96
|
+
* rather long, but if you're planning on messing with this class and others
|
97
|
+
* that deal with the details of ID3v2 (rather than the nice, safe, abstract
|
98
|
+
* TagLib::Tag and friends), it's worth your time to familiarize yourself
|
99
|
+
* with said spec (which is distrubuted with the TagLib sources). TagLib
|
100
|
+
* tries to do most of the work, but with a little luck, you can still
|
101
|
+
* convince it to generate invalid ID3v2 tags. The APIs for ID3v2 assume a
|
102
|
+
* working knowledge of ID3v2 structure. You're been warned.
|
103
|
+
*/
|
104
|
+
|
105
|
+
class TAGLIB_EXPORT Tag : public TagLib::Tag
|
106
|
+
{
|
107
|
+
public:
|
108
|
+
/*!
|
109
|
+
* Constructs an empty ID3v2 tag.
|
110
|
+
*
|
111
|
+
* \note You must create at least one frame for this tag to be valid.
|
112
|
+
*/
|
113
|
+
Tag();
|
114
|
+
|
115
|
+
/*!
|
116
|
+
* Constructs an ID3v2 tag read from \a file starting at \a tagOffset.
|
117
|
+
* \a factory specifies which FrameFactory will be used for the
|
118
|
+
* construction of new frames.
|
119
|
+
*
|
120
|
+
* \note You should be able to ignore the \a factory parameter in almost
|
121
|
+
* all situations. You would want to specify your own FrameFactory
|
122
|
+
* subclass in the case that you are extending TagLib to support additional
|
123
|
+
* frame types, which would be incorperated into your factory.
|
124
|
+
*
|
125
|
+
* \see FrameFactory
|
126
|
+
*/
|
127
|
+
Tag(File *file, long tagOffset,
|
128
|
+
const FrameFactory *factory = FrameFactory::instance());
|
129
|
+
|
130
|
+
/*!
|
131
|
+
* Destroys this Tag instance.
|
132
|
+
*/
|
133
|
+
virtual ~Tag();
|
134
|
+
|
135
|
+
// Reimplementations.
|
136
|
+
|
137
|
+
virtual String title() const;
|
138
|
+
virtual String artist() const;
|
139
|
+
virtual String album() const;
|
140
|
+
virtual String comment() const;
|
141
|
+
virtual String genre() const;
|
142
|
+
virtual uint year() const;
|
143
|
+
virtual uint track() const;
|
144
|
+
|
145
|
+
virtual void setTitle(const String &s);
|
146
|
+
virtual void setArtist(const String &s);
|
147
|
+
virtual void setAlbum(const String &s);
|
148
|
+
virtual void setComment(const String &s);
|
149
|
+
virtual void setGenre(const String &s);
|
150
|
+
virtual void setYear(uint i);
|
151
|
+
virtual void setTrack(uint i);
|
152
|
+
|
153
|
+
virtual bool isEmpty() const;
|
154
|
+
|
155
|
+
/*!
|
156
|
+
* Returns a pointer to the tag's header.
|
157
|
+
*/
|
158
|
+
Header *header() const;
|
159
|
+
|
160
|
+
/*!
|
161
|
+
* Returns a pointer to the tag's extended header or null if there is no
|
162
|
+
* extended header.
|
163
|
+
*/
|
164
|
+
ExtendedHeader *extendedHeader() const;
|
165
|
+
|
166
|
+
/*!
|
167
|
+
* Returns a pointer to the tag's footer or null if there is no footer.
|
168
|
+
*
|
169
|
+
* \deprecated I don't see any reason to keep this around since there's
|
170
|
+
* nothing useful to be retrieved from the footer, but well, again, I'm
|
171
|
+
* prone to change my mind, so this gets to stay around until near a
|
172
|
+
* release.
|
173
|
+
*/
|
174
|
+
Footer *footer() const;
|
175
|
+
|
176
|
+
/*!
|
177
|
+
* Returns a reference to the frame list map. This is an FrameListMap of
|
178
|
+
* all of the frames in the tag.
|
179
|
+
*
|
180
|
+
* This is the most convenient structure for accessing the tag's frames.
|
181
|
+
* Many frame types allow multiple instances of the same frame type so this
|
182
|
+
* is a map of lists. In most cases however there will only be a single
|
183
|
+
* frame of a certain type.
|
184
|
+
*
|
185
|
+
* Let's say for instance that you wanted to access the frame for total
|
186
|
+
* beats per minute -- the TBPM frame.
|
187
|
+
*
|
188
|
+
* \code
|
189
|
+
* TagLib::MPEG::File f("foo.mp3");
|
190
|
+
*
|
191
|
+
* // Check to make sure that it has an ID3v2 tag
|
192
|
+
*
|
193
|
+
* if(f.ID3v2Tag()) {
|
194
|
+
*
|
195
|
+
* // Get the list of frames for a specific frame type
|
196
|
+
*
|
197
|
+
* TagLib::ID3v2::FrameList l = f.ID3v2Tag()->frameListMap()["TBPM"];
|
198
|
+
*
|
199
|
+
* if(!l.isEmpty())
|
200
|
+
* std::cout << l.front()->toString() << std::endl;
|
201
|
+
* }
|
202
|
+
*
|
203
|
+
* \endcode
|
204
|
+
*
|
205
|
+
* \warning You should not modify this data structure directly, instead
|
206
|
+
* use addFrame() and removeFrame().
|
207
|
+
*
|
208
|
+
* \see frameList()
|
209
|
+
*/
|
210
|
+
const FrameListMap &frameListMap() const;
|
211
|
+
|
212
|
+
/*!
|
213
|
+
* Returns a reference to the frame list. This is an FrameList of all of
|
214
|
+
* the frames in the tag in the order that they were parsed.
|
215
|
+
*
|
216
|
+
* This can be useful if for example you want iterate over the tag's frames
|
217
|
+
* in the order that they occur in the tag.
|
218
|
+
*
|
219
|
+
* \warning You should not modify this data structure directly, instead
|
220
|
+
* use addFrame() and removeFrame().
|
221
|
+
*/
|
222
|
+
const FrameList &frameList() const;
|
223
|
+
|
224
|
+
/*!
|
225
|
+
* Returns the frame list for frames with the id \a frameID or an empty
|
226
|
+
* list if there are no frames of that type. This is just a convenience
|
227
|
+
* and is equivalent to:
|
228
|
+
*
|
229
|
+
* \code
|
230
|
+
* frameListMap()[frameID];
|
231
|
+
* \endcode
|
232
|
+
*
|
233
|
+
* \see frameListMap()
|
234
|
+
*/
|
235
|
+
const FrameList &frameList(const ByteVector &frameID) const;
|
236
|
+
|
237
|
+
/*!
|
238
|
+
* Add a frame to the tag. At this point the tag takes ownership of
|
239
|
+
* the frame and will handle freeing its memory.
|
240
|
+
*
|
241
|
+
* \note Using this method will invalidate any pointers on the list
|
242
|
+
* returned by frameList()
|
243
|
+
*/
|
244
|
+
void addFrame(Frame *frame);
|
245
|
+
|
246
|
+
/*!
|
247
|
+
* Remove a frame from the tag. If \a del is true the frame's memory
|
248
|
+
* will be freed; if it is false, it must be deleted by the user.
|
249
|
+
*
|
250
|
+
* \note Using this method will invalidate any pointers on the list
|
251
|
+
* returned by frameList()
|
252
|
+
*/
|
253
|
+
void removeFrame(Frame *frame, bool del = true);
|
254
|
+
|
255
|
+
/*!
|
256
|
+
* Remove all frames of type \a id from the tag and free their memory.
|
257
|
+
*
|
258
|
+
* \note Using this method will invalidate any pointers on the list
|
259
|
+
* returned by frameList()
|
260
|
+
*/
|
261
|
+
void removeFrames(const ByteVector &id);
|
262
|
+
|
263
|
+
/*!
|
264
|
+
* Render the tag back to binary data, suitable to be written to disk.
|
265
|
+
*/
|
266
|
+
ByteVector render() const;
|
267
|
+
|
268
|
+
protected:
|
269
|
+
/*!
|
270
|
+
* Reads data from the file specified in the constructor. It does basic
|
271
|
+
* parsing of the data in the largest chunks. It partitions the tag into
|
272
|
+
* the Header, the body of the tag (which contains the ExtendedHeader and
|
273
|
+
* frames) and Footer.
|
274
|
+
*/
|
275
|
+
void read();
|
276
|
+
|
277
|
+
/*!
|
278
|
+
* This is called by read to parse the body of the tag. It determines if an
|
279
|
+
* extended header exists and adds frames to the FrameListMap.
|
280
|
+
*/
|
281
|
+
void parse(const ByteVector &data);
|
282
|
+
|
283
|
+
/*!
|
284
|
+
* Sets the value of the text frame with the Frame ID \a id to \a value.
|
285
|
+
* If the frame does not exist, it is created.
|
286
|
+
*/
|
287
|
+
void setTextFrame(const ByteVector &id, const String &value);
|
288
|
+
|
289
|
+
private:
|
290
|
+
Tag(const Tag &);
|
291
|
+
Tag &operator=(const Tag &);
|
292
|
+
|
293
|
+
class TagPrivate;
|
294
|
+
TagPrivate *d;
|
295
|
+
};
|
296
|
+
|
297
|
+
}
|
298
|
+
}
|
299
|
+
|
300
|
+
#endif
|