📄 musiccatalog.cpp
字号:
else
{
vector<ArtistList *>::iterator i;
vector<AlbumList *> *alList;
vector<AlbumList *>::iterator j;
vector<PlaylistItem *> *trList;
vector<PlaylistItem *>::iterator k;
bool found = false;
i = m_artistList->begin();
for (; i != m_artistList->end() && !found; i++)
{
if (CaseCompare(meta->Artist(),(*i)->name))
{
alList = (*i)->m_albumList;
j = alList->begin();
for (; j != alList->end() && !found; j++)
{
if (CaseCompare(meta->Album(),(*j)->name))
{
trList = (*j)->m_trackList;
k = trList->begin();
for (; k != trList->end() && !found; k++)
if (url == (*k)->URL())
{
AcceptEvent(new MusicCatalogTrackRemovedEvent(*k, *i, *j));
trList->erase(k);
found = true;
m_trackCount--;
break;
}
if (trList->size() == 0) {
alList->erase(j);
}
}
}
if (alList->size() == 0) {
m_artistList->erase(i);
}
}
}
}
delete meta;
if ((strGUID.size() != 0) && (m_guidTable->size() != 0)) {
multimap<string, string, less<string> >::iterator i;
i = m_guidTable->find(strGUID);
while ((i != m_guidTable->end()) && ((*i).first == strGUID)) {
if ((*i).second == url) {
// FIXME??? m_guidTable->erase(i);
break;
}
i++;
}
}
m_catMutex->Release();
return kError_NoErr;
}
Error MusicCatalog::AddStream(const char *url)
{
assert(url);
if (!m_database->Working())
return kError_DatabaseNotWorking;
PlaylistItem *newstream;
MetaData *meta = ReadMetaDataFromDatabase(url);
if (!meta)
return kError_DatabaseNotWorking;
newstream = new PlaylistItem(url, meta);
m_catMutex->Acquire();
if (meta->GUID().size() > 0)
m_guidTable->insert(multimap<string, string, less<string> >
::value_type(meta->GUID(), url));
vector<PlaylistItem *>::iterator i = m_streams->begin();
for (; i != m_streams->end(); i++)
if ((*i)->URL() == url)
return kError_DuplicateItem;
m_streams->push_back(newstream);
m_context->target->AcceptEvent(new MusicCatalogStreamAddedEvent(newstream));
m_catMutex->Release();
return kError_NoErr;
}
bool MusicCatalog::CaseCompare(const string &s1, const string &s2)
{
if (s1.length() == s2.length()) {
for (uint32 i = 0; i < s1.length(); i++) {
if (toupper(s1[i]) != toupper(s2[i]))
return false;
}
return true;
}
return false;
}
void MusicCatalog::GenerateSignature(PlaylistItem *track)
{
string url = track->URL();
m_sigs->insert(url);
}
Error MusicCatalog::AddSong(const char *url)
{
assert(url);
bool generated = false;
if (!m_database->Working())
return kError_DatabaseNotWorking;
PlaylistItem *newtrack;
MetaData *meta = ReadMetaDataFromDatabase(url);
if (!meta) {
newtrack = new PlaylistItem(url);
m_context->plm->RetrieveMetaDataNow(newtrack);
MetaData tempdata = (MetaData)(newtrack->GetMetaData());
WriteMetaDataToDatabase(url, tempdata);
delete newtrack;
meta = ReadMetaDataFromDatabase(url);
}
if (!meta)
return kError_DatabaseNotWorking;
if (m_killGUIDs)
{
meta->SetGUID("");
WriteMetaDataToDatabase(url, *meta);
}
newtrack = new PlaylistItem(url, meta);
m_catMutex->Acquire();
if (meta->GUID().size() > 0) {
generated = true;
m_guidTable->insert(multimap<string, string, less<string> >
::value_type(meta->GUID(), url));
}
else
GenerateSignature(newtrack);
if ((meta->Artist().size() == 0) || (meta->Artist() == " ")) {
vector<PlaylistItem *>::iterator i = m_unsorted->begin();
if (!generated)
GenerateSignature(newtrack);
for (; i != m_unsorted->end(); i++)
if ((*i)->URL() == url) {
m_catMutex->Release();
delete meta;
delete newtrack;
return kError_DuplicateItem;
}
m_unsorted->push_back(newtrack);
AcceptEvent(new MusicCatalogTrackAddedEvent(newtrack, NULL, NULL));
m_trackCount++;
}
else {
bool changed = false;
if (meta->Album() == " " || meta->Album().size() == 0) {
string unknownstr = string("Unknown");
meta->SetAlbum(unknownstr);
changed = true;
}
if (meta->Title() == " " || meta->Title().size() == 0) {
string unknownstr = string("Unknown");
meta->SetTitle(unknownstr);
changed = true;
}
if (changed)
WriteMetaDataToDatabase(url, *meta);
bool found_artist = false;
vector<ArtistList *>::iterator i = m_artistList->begin();
for (; i != m_artistList->end(); i++) {
if (CaseCompare(meta->Artist(),(*i)->name)) {
bool found_album = false;
found_artist = true;
vector<AlbumList *> *alList = (*i)->m_albumList;
vector<AlbumList *>::iterator j = alList->begin();
for (; j != alList->end(); j++) {
if (CaseCompare(meta->Album(),(*j)->name)) {
found_album = true;
vector<PlaylistItem *> *trList = (*j)->m_trackList;
vector<PlaylistItem *>::iterator k = trList->begin();
for (; k != trList->end(); k++) {
if ((*k)->URL() == url) {
delete newtrack;
delete meta;
m_catMutex->Release();
return kError_DuplicateItem;
}
}
(*j)->m_trackList->push_back(newtrack);
AcceptEvent(new MusicCatalogTrackAddedEvent(newtrack,
*i, *j));
m_trackCount++;
break;
}
}
if (!found_album) {
AlbumList *newalbum = new AlbumList;
newalbum->name = meta->Album();
newalbum->m_trackList->push_back(newtrack);
alList->push_back(newalbum);
AcceptEvent(new MusicCatalogTrackAddedEvent(newtrack, (*i), newalbum));
break;
}
}
}
if (!found_artist) {
ArtistList *newartist = new ArtistList;
newartist->name = meta->Artist();
AlbumList *newalbum = new AlbumList;
newalbum->name = meta->Album();
newalbum->m_trackList->push_back(newtrack);
newartist->m_albumList->push_back(newalbum);
m_artistList->push_back(newartist);
AcceptEvent(new MusicCatalogTrackAddedEvent(newtrack, newartist, newalbum));
}
}
delete meta;
m_catMutex->Release();
return kError_NoErr;
}
Error MusicCatalog::UpdateSong(PlaylistItem *item)
{
assert(item);
if (!m_database->Working())
return kError_DatabaseNotWorking;
m_inUpdateSong = true;
Error err = RemoveSong(item->URL().c_str());
if (IsError(err))
return err;
WriteMetaDataToDatabase(item->URL().c_str(), item->GetMetaData());
m_database->Sync();
err = AddSong(item->URL().c_str());
if (IsError(err))
return err;
m_inUpdateSong = false;
m_context->target->AcceptEvent(new MusicCatalogTrackChangedEvent(m_oldItem, m_newItem, m_oldArtist, m_newArtist, m_oldAlbum, m_newAlbum));
return kError_NoErr;
}
Error MusicCatalog::Remove(const char *url)
{
assert(url);
if (!m_database->Working())
return kError_DatabaseNotWorking;
char *data = m_database->Value(url);
if (!data)
return kError_ItemNotFound;
Error retvalue = kError_YouScrewedUp;
if (*data == 'M')
retvalue = RemoveSong(url);
else if (*data == 'P')
retvalue = RemovePlaylist(url);
else if (*data == 'S')
retvalue = RemoveStream(url);
delete [] data;
return retvalue;
}
Error MusicCatalog::Add(const char *url)
{
assert(url);
if (!m_database->Working())
return kError_DatabaseNotWorking;
char *data = m_database->Value(url);
if (!data)
return kError_ItemNotFound;
Error retvalue = kError_YouScrewedUp;
if (*data == 'M')
retvalue = AddSong(url);
else if (*data == 'P')
retvalue = AddPlaylist(url);
else if (*data == 'S')
retvalue = AddStream(url);
delete [] data;
return retvalue;
}
void MusicCatalog::ClearCatalog()
{
m_catMutex->Acquire();
vector<ArtistList *>::iterator a;
vector<PlaylistItem *>::iterator p;
for(a = m_artistList->begin(); a != m_artistList->end(); a++)
delete (*a);
delete m_artistList;
for(p = m_unsorted->begin(); p != m_unsorted->end(); p++)
delete (*p);
delete m_unsorted;
delete m_playlists;
for(p = m_streams->begin(); p != m_streams->end(); p++)
delete (*p);
delete m_streams;
delete m_sigs;
delete m_guidTable;
m_trackCount = 0;
m_artistList = new vector<ArtistList *>;
m_unsorted = new vector<PlaylistItem *>;
m_playlists = new vector<string>;
m_streams = new vector<PlaylistItem *>;
m_sigs = new set<string>;
m_guidTable = new multimap<string, string, less<string> >;
m_catMutex->Release();
}
Error MusicCatalog::RePopulateFromDatabase()
{
if (!m_database->Working())
return kError_DatabaseNotWorking;
ClearCatalog();
m_context->target->AcceptEvent(new Event(INFO_MusicCatalogCleared));
int subversion = m_database->GetSubVersion();
if (subversion < DATABASE_SUB_VERSION)
{
m_killGUIDs = true;
}
m_catMutex->Acquire();
m_bSurpressAddMessages = true;
char *key = m_database->NextKey(NULL);
Error err = kError_NoErr;
while (key) {
err = Add(key);
if (IsError(err)) {
//m_context->target->AcceptEvent(new ErrorMessageEvent("There was an internal error during generation of the Music Catalog"));
//m_catMutex->Release();
//return kError_YouScrewedUp;
}
key = m_database->NextKey(key);
}
if (subversion < DATABASE_SUB_VERSION)
m_killGUIDs = false;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -