4 #include "../diagnostics.h" 5 #include "../exceptions.h" 7 #include <c++utilities/conversion/conversionexception.h> 30 return TagType::Id3v1Tag;
33 const char *Id3v1Tag::typeName()
const 40 return Tag::canEncodingBeUsed(encoding);
55 stream.read(buffer, 128);
56 if (buffer[0] != 0x54 || buffer[1] != 0x41 || buffer[2] != 0x47) {
60 readValue(m_title, 30, buffer + 3);
61 readValue(m_artist, 30, buffer + 33);
62 readValue(m_album, 30, buffer + 63);
63 readValue(m_year, 4, buffer + 93);
64 if (buffer[125] == 0) {
65 readValue(m_comment, 28, buffer + 97);
68 readValue(m_comment, 30, buffer + 97);
71 readValue(m_comment, buffer[125] == 0 ? 28 : 30, buffer + 97);
72 if (buffer[125] == 0) {
73 m_trackPos.assignPosition(
PositionInSet(*reinterpret_cast<char *>(buffer + 126), 0));
75 m_genre.assignStandardGenreIndex(*reinterpret_cast<unsigned char *>(buffer + 127));
87 static const string context(
"making ID3v1 tag");
92 stream.write(buffer, 3);
94 writeValue(m_title, 30, buffer, stream, diag);
95 writeValue(m_artist, 30, buffer, stream, diag);
96 writeValue(m_album, 30, buffer, stream, diag);
97 writeValue(m_year, 4, buffer, stream, diag);
98 writeValue(m_comment, 28, buffer, stream, diag);
104 if (!m_trackPos.isEmpty() && m_trackPos.type() == TagDataType::PositionInSet) {
106 buffer[1] = m_trackPos.toPositionInSet().position();
107 }
catch (
const ConversionException &) {
109 DiagLevel::Warning,
"Track position field can not be set because given value can not be converted appropriately.", context);
114 buffer[2] = m_genre.toStandardGenreIndex();
115 }
catch (
const ConversionException &) {
116 diag.emplace_back(DiagLevel::Warning,
"Genre field can not be set because given value can not be converted appropriately.", context);
118 stream.write(buffer, 3);
140 return TagValue::empty();
176 return setValue(field, value);
183 return !m_title.isEmpty();
185 return !m_artist.isEmpty();
187 return !m_album.isEmpty();
189 return !m_year.isEmpty();
191 return !m_comment.isEmpty();
193 return !m_trackPos.isEmpty();
195 return !m_genre.isEmpty();
201 void Id3v1Tag::removeAllFields()
203 m_title.clearDataAndMetadata();
204 m_artist.clearDataAndMetadata();
205 m_album.clearDataAndMetadata();
206 m_year.clearDataAndMetadata();
207 m_comment.clearDataAndMetadata();
208 m_trackPos.clearDataAndMetadata();
209 m_genre.clearDataAndMetadata();
212 unsigned int Id3v1Tag::fieldCount()
const 214 unsigned int count = 0;
215 for (
const auto &value : { m_title, m_artist, m_album, m_year, m_comment, m_trackPos, m_genre }) {
216 if (!value.isEmpty()) {
239 void Id3v1Tag::ensureTextValuesAreProperlyEncoded()
241 m_title.convertDataEncodingForTag(
this);
242 m_artist.convertDataEncodingForTag(
this);
243 m_album.convertDataEncodingForTag(
this);
244 m_year.convertDataEncodingForTag(
this);
245 m_comment.convertDataEncodingForTag(
this);
246 m_trackPos.convertDataEncodingForTag(
this);
247 m_genre.convertDataEncodingForTag(
this);
253 void Id3v1Tag::readValue(
TagValue &value,
size_t maxLength,
const char *buffer)
255 const char *end = buffer + maxLength - 1;
256 while ((*end == 0x0 || *end ==
' ') && end >= buffer) {
260 value.
assignData(buffer, maxLength, TagDataType::Text, TagTextEncoding::Latin1);
266 void Id3v1Tag::writeValue(
const TagValue &value,
size_t length,
char *buffer, ostream &targetStream, Diagnostics &diag)
268 memset(buffer, 0, length);
270 value.toString().copy(buffer, length);
271 }
catch (
const ConversionException &) {
273 DiagLevel::Warning,
"Field can not be set because given value can not be converted appropriately.",
"making ID3v1 tag field");
275 targetStream.write(buffer, length);
KnownField
Specifies the field.
void assignData(const char *data, size_t length, TagDataType type=TagDataType::Binary, TagTextEncoding encoding=TagTextEncoding::Latin1)
Assigns a copy of the given data.
TagType
Specifies the tag type.
TagTextEncoding
Specifies the text encoding.