ocarina/core/tags.cpp

87 lines
1.7 KiB
C++

/**
* @file
* Copyright 2014 (c) Anna Schumaker.
*/
#include <core/tags.h>
#include <core/tags/tags.h>
#include <core/filter.h>
#include <core/print.h>
#include <taglib/tag.h>
#include <taglib/fileref.h>
Database<Track> track_db("track.db", false);
/**
*
* Tagdb functions
*
*/
void tagdb :: init()
{
tags :: init();
track_db.load();
}
void tagdb :: commit()
{
track_db.save();
}
Track *tagdb :: add_track(const std::string &filepath, Library *library)
{
Track *track;
TagLib :: Tag *tag;
TagLib :: AudioProperties *audio;
TagLib :: FileRef ref(filepath.c_str(), true, TagLib::AudioProperties::Fast);
std::string path = filepath.substr(library->primary_key().size() + 1);
if (ref.isNull()) {
print("WARNING: Could not read tags for file %s\n", filepath.c_str());
return NULL;
}
tag = ref.tag();
audio = ref.audioProperties();
track = track_db.insert(Track(
tags :: get_album(tag->album().stripWhiteSpace().to8Bit(true), tag->year()),
tags :: get_artist(tag->artist().stripWhiteSpace().to8Bit(true)),
tags :: get_genre(tag->genre().stripWhiteSpace().to8Bit(true)),
library, path,
tag->title().stripWhiteSpace().to8Bit(true),
audio->length(), tag->track())
);
return track;
}
void tagdb :: remove_track(unsigned int track_id)
{
track_db.remove(track_id);
}
void tagdb :: remove_library(unsigned int library_id)
{
Database<Track>::iterator it;
for (it = track_db.begin(); it != track_db.end(); it = track_db.next(it)) {
if ((*it)->library()->index() == library_id)
track_db.remove((*it)->index());
}
tagdb :: commit();
tags :: remove_library(tags :: get_library(library_id));
}
Track *tagdb :: lookup(unsigned int track_id)
{
return track_db.at(track_id);
}
Database<Track> &tagdb :: get_track_db()
{
return track_db;
}