Skip to content
This repository has been archived by the owner on Oct 4, 2020. It is now read-only.

Commit

Permalink
FileTagMap: refactoring
Browse files Browse the repository at this point in the history
  • Loading branch information
Dremora committed Jan 30, 2012
1 parent 1fd92a0 commit 0dea923
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 52 deletions.
99 changes: 65 additions & 34 deletions FileTagMap.cpp
Expand Up @@ -5,82 +5,105 @@
#include "Track.h"

using namespace foo_musicbrainz;
using pfc::string8;

Tag::Tag(const Release &release, const Medium &medium, const Track &track) {
write_general(release, medium, track);
write_date(release);
write_disc(release, medium);
write_album_type(release);
write_album_status(release);
write_artist(release, track);
write_musicbrainz_ids(release, medium, track);
write_label_info(release);
}

Tag::Tag(Release &release, Medium &medium, Track &track) {
void Tag::write_general(const Release &release, const Medium &medium, const Track &track) {
set("ALBUM", release.get_title());
pfc::string8 date = release.get_date();
set("TITLE", track.get_title());
set("TRACKNUMBER", track.get_position());
set("TOTALTRACKS", medium.track_count());
}

void Tag::write_date(const Release &release) {
string8 date = release.get_date();
if (!date.is_empty()) {
set("DATE", date);
}

pfc::string8 first_release_date = release.get_release_group()->get_first_release_date();
string8 first_release_date = release.get_release_group()->get_first_release_date();
if (!first_release_date.is_empty() && first_release_date != date) {
set("ORIGINAL RELEASE DATE", date);
} else {
set("ORIGINAL RELEASE DATE", "");
unset("ORIGINAL RELEASE DATE");
}
}

set("TITLE", track.get_title());
set("TRACKNUMBER", track.get_position());
set("TOTALTRACKS", medium.track_count());

if (release.get_medium_total_count() > 1) {
void Tag::write_disc(const Release &release, const Medium &medium) {
if (release.is_multidisc()) {
set("DISCNUMBER", medium.get_position());
set("TOTALDISCS", release.get_medium_total_count());
set("DISCSUBTITLE", medium.get_title());
} else {
set("DISCNUMBER", "");
set("TOTALDISCS", "");
set("DISCSUBTITLE", "");
unset("DISCNUMBER");
unset("TOTALDISCS");
unset("DISCSUBTITLE");
}
}

// Album type
void Tag::write_album_type(const Release &release) {
if (Preferences::albumtype) {
auto type = release.get_release_group()->get_type();
if (type != ReleaseGroup::types[0]) {
set(Preferences::albumtype_data, type);
} else {
set(Preferences::albumtype_data, "");
unset(Preferences::albumtype_data);
}
}
}

// Album status
void Tag::write_album_status(const Release &release) {
if (Preferences::albumstatus) {
auto status = release.get_status();
if (status != Release::statuses[0]) {
set(Preferences::albumstatus_data, status);
} else {
set(Preferences::albumstatus_data, "");
unset(Preferences::albumstatus_data);
}
}
}

// Artist
bool va = release.is_various();
void Tag::write_artist(const Release &release, const Track &track) {
set("ARTIST", track.get_artist_credit()->get_name());
set("ALBUM ARTIST", va ? release.get_artist_credit()->get_name() : "");
if (release.is_various()) {
set("ALBUM ARTIST", release.get_artist_credit()->get_name());
} else {
unset("ALBUM ARTIST");
}
}

// MusicBrainz IDs
void Tag::write_musicbrainz_ids(const Release &release, const Medium &medium, const Track &track) {
if (Preferences::write_ids) {
set("MUSICBRAINZ_ALBUMID", release.get_id());
set("MUSICBRAINZ_RELEASEGROUPID", release.get_release_group()->get_id());
set("MUSICBRAINZ_TRACKID", track.get_id());
base_class::set("MUSICBRAINZ_ARTISTID", track.get_artist_credit()->get_ids());
if (va) {
base_class::set("MUSICBRAINZ_ALBUMARTISTID", release.get_artist_credit()->get_ids());
set("MUSICBRAINZ_ARTISTID", track.get_artist_credit()->get_ids());
if (release.is_various()) {
set("MUSICBRAINZ_ALBUMARTISTID", release.get_artist_credit()->get_ids());
} else {
set("MUSICBRAINZ_ALBUMARTISTID", "");
unset("MUSICBRAINZ_ALBUMARTISTID");
}
auto discid = medium.get_discid();
if (!discid.is_empty()) {
set("MUSICBRAINZ_DISCID", discid);
}
}
}

void Tag::write_label_info(const Release &release) {
if (Preferences::write_label_info) {
// Barcode
set("BARCODE", release.get_barcode());

// Label info
TagValues labels, catalog_numbers;
for (auto i = 0; i < release.label_info_count(); i++) {
// TODO: possibly remove duplicates?
Expand All @@ -91,27 +114,35 @@ Tag::Tag(Release &release, Medium &medium, Track &track) {
catalog_numbers.add_item(catalog_number);
}
}
base_class::set("LABEL", labels);
base_class::set("CATALOGNUMBER", catalog_numbers);
set("LABEL", labels);
set("CATALOGNUMBER", catalog_numbers);
}
}

void Tag::set(pfc::string8 key, pfc::string8 value) {
void Tag::set(const string8 & key, const TagValues & value) {
base_class::set(key, value);
}

void Tag::set(const string8 & key, const string8 & value) {
TagValues list;
list.add_item(value);
base_class::set(key, list);
set(key, list);
}

void Tag::set(pfc::string8 key, const char *value) {
set(key, pfc::string8(value));
void Tag::set(const string8 & key, const char *value) {
set(key, string8(value));
}

void Tag::set(pfc::string8 key, int value) {
pfc::string8 tmp;
void Tag::set(const string8 & key, int value) {
string8 tmp;
tmp << value;
set(key, tmp);
}

void Tag::unset(string8 key) {
set(key, "");
}

FileTagMap::FileTagMap(Release &release, pfc::list_t<metadb_handle_ptr> tracks, size_t selected_medium) {
auto current_medium = 0;
auto current_track = 0;
Expand Down
30 changes: 20 additions & 10 deletions FileTagMap.h
Expand Up @@ -9,22 +9,32 @@ namespace foo_musicbrainz {
typedef pfc::list_t<pfc::string8> TagValues;

class Tag : public pfc::map_t<pfc::string8, TagValues> {
private:
typedef pfc::map_t<pfc::string8, TagValues> base_class;

public:
Tag() {}
Tag(Release &release, Medium &medium, Track &track);
inline void set(pfc::string8, pfc::string8);
inline void set(pfc::string8, const char *);
inline void set(pfc::string8, int);
Tag(const Release &release, const Medium &medium, const Track &track);
inline void set(const pfc::string8 &key, const TagValues &value);
inline void set(const pfc::string8 &key, const pfc::string8 &value);
inline void set(const pfc::string8 &key, const char *value);
inline void set(const pfc::string8 &key, int value);
inline void unset(pfc::string8 key);

private:
typedef pfc::map_t<pfc::string8, TagValues> base_class;
void write_album_type(const Release &release);
void write_album_status(const Release &release);
void write_artist(const Release &release, const Track &track);
void write_date(const Release &release);
void write_disc(const Release &release, const Medium &medium);
void write_general(const Release &release, const Medium &medium, const Track &track);
void write_label_info(const Release &release);
void write_musicbrainz_ids(const Release &release, const Medium &medium, const Track &track);
};

class FileTagMap : public pfc::map_t<metadb_handle_ptr, Tag> {
public:
FileTagMap(Release &release, pfc::list_t<metadb_handle_ptr> tracks, size_t selected_medium);

private:
typedef pfc::map_t<metadb_handle_ptr, Tag> base_class;

public:
FileTagMap(Release &, pfc::list_t<metadb_handle_ptr>, size_t selected_medium);
};
}
15 changes: 7 additions & 8 deletions Release.h
Expand Up @@ -25,19 +25,22 @@ namespace foo_musicbrainz {
COLLECTION(LabelInfo, label_info)

public:
bool is_various() {
if (va != -1) return va;
bool is_various() const {
auto name = get_artist_credit()->get_name();
for (size_t i = 0; i < medium_count(); i++) {
auto medium = get_medium(i);
for (size_t j = 0; j < medium->track_count(); j++) {
auto track = medium->get_track(j);
if (track->get_artist_credit()->get_name() != name) {
return va = 1;
return true;
}
}
}
return va = 0;
return false;
}

bool is_multidisc() const {
return get_medium_total_count() > 1;
}

size_t track_count() {
Expand All @@ -52,7 +55,6 @@ namespace foo_musicbrainz {
CoreEntity(),
status(0),
medium_total_count(0),
va(-1),
artist_credit(nullptr),
release_group(nullptr) {};
~Release() {
Expand All @@ -61,8 +63,5 @@ namespace foo_musicbrainz {
COLLECTION_DESTRUCTOR(medium)
COLLECTION_DESTRUCTOR(label_info)
}

private:
char va;
};
}

0 comments on commit 0dea923

Please sign in to comment.