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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
|
/***************************************************************************
copyright : (C) 2005 by Martin Aumueller
email : aumuell@reserv.at
copyright : (C) 2005 by Andy Leadbetter
email : andrew.leadbetter@gmail.com
(original mp4 implementation)
***************************************************************************/
/***************************************************************************
* This library is free software; you can redistribute it and/or modify *
* it under the terms of the GNU Lesser General Public License version *
* 2.1 as published by the Free Software Foundation. *
* *
* This library is distributed in the hope that it will be useful, but *
* WITHOUT ANY WARRANTY; without even the implied warranty of *
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU *
* Lesser General Public License for more details. *
* *
* You should have received a copy of the GNU Lesser General Public *
* License along with this library; if not, write to the Free Software *
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, *
* MA 02110-1301 USA *
***************************************************************************/
#ifndef TAGLIB_AUDIBLETAG_H
#define TAGLIB_AUDIBLETAG_H
#include <config.h>
#include <taglib/tag.h>
#include "taglib_audiblefile.h"
namespace TagLib {
namespace Audible {
/*!
* This implements the generic TagLib::Tag API
*/
class Tag : public TagLib::Tag
{
public:
Tag();
/*!
* read tags from the aa file.
*/
void readTags( FILE *file );
/*!
* Destroys this AudibleTag instance.
*/
virtual ~Tag();
/*!
* Returns the track name; if no track name is present in the tag
* a null String will be returned.
*/
virtual String title() const { return m_title; }
/*!
* Returns the artist name; if no artist name is present in the tag
* a null String will be returned.
*/
virtual String artist() const { return m_artist; }
/*!
* Returns the album name; if no album name is present in the tag
* a null String will be returned.
*/
virtual String album() const { return m_album; }
/*!
* Returns the track comment; if no comment is present in the tag
* a null String will be returned.
*/
virtual String comment() const { return m_comment; }
/*!
* Returns the genre name; if no genre is present in the tag a null String
* will be returned.
*/
virtual String genre() const { return m_genre; }
/*!
* Returns the year; if there is no year set, this will return 0.
*/
virtual uint year() const { return m_year; }
/*!
* Returns the track number; if there is no track number set, this will
* return 0.
*/
virtual uint track() const { return m_track; }
/*!
* Returns the user id for this file.
*/
virtual uint userID() const { return m_userID; }
/*!
* Sets the title to \a s. If \a s is a null String then this value will be
* cleared.
*/
virtual void setTitle(const String &s) { m_title = s; }
/*!
* Sets the artist to \a s. If \a s is a null String then this value will be
* cleared.
*/
virtual void setArtist(const String &s) { m_artist = s; }
/*!
* Sets the album to \a s. If \a s is a null String then this value will be
* cleared.
*/
virtual void setAlbum(const String &s) { m_album = s; }
/*!
* Sets the album to \a s. If \a s is a null String then this value will be
* cleared.
*/
virtual void setComment(const String &s) { m_comment = s; }
/*!
* Sets the genre to \a s. If \a s is a null String then this value will be
* cleared. For tag formats that use a fixed set of genres, the appropriate
* value will be selected based on a string comparison. A list of available
* genres for those formats should be available in that type's
* implementation.
*/
virtual void setGenre(const String &s) { m_genre = s; }
/*!
* Sets the year to \a i. If \a s is 0 then this value will be cleared.
*/
virtual void setYear(uint i) { m_year = i; }
/*!
* Sets the track to \a i. If \a s is 0 then this value will be cleared.
*/
virtual void setTrack(uint i) { m_track = i; }
/*!
* Returns true if the tag does not contain any data. This should be
* reimplemented in subclasses that provide more than the basic tagging
* abilities in this class.
*/
virtual bool isEmpty() const;
/*!
* Copies the generic data from one tag to another.
*
* \note This will not affect any of the lower level details of the tag. For
* instance if any of the tag type specific data (maybe a URL for a band) is
* set, this will not modify or copy that. This just copies using the API
* in this class.
*
* If \a overwrite is true then the values will be unconditionally copied.
* If false only empty values will be overwritten.
*/
static void duplicate(const Tag *source, Tag *target, bool overwrite = true);
virtual void setUserID(uint id) { m_userID = id; }
int getTagsEndOffset();
protected:
String m_title;
String m_artist;
String m_album;
String m_comment;
String m_genre;
uint m_year;
uint m_track;
uint m_userID;
bool readTag( FILE *fp, char **name, char **value);
int m_tagsEndOffset;
};
}
}
#endif
|