2 * Copyright (C) 2005-2013 Team XBMC
5 * This Program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2, or (at your option)
10 * This Program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with XBMC; see the file COPYING. If not, see
17 * <http://www.gnu.org/licenses/>.
22 #include "utils/XMLUtils.h"
23 #include "settings/AdvancedSettings.h"
27 void CArtist::MergeScrapedArtist(const CArtist& source, bool override /* = true */)
30 We don't merge musicbrainz artist ID so that a refresh of artist information
31 allows a lookup based on name rather than directly (re)using musicbrainz.
32 In future, we may wish to be able to override lookup by musicbrainz so
33 this might be dropped.
35 // strMusicBrainzArtistID = source.strMusicBrainzArtistID;
36 if ((override && !source.strArtist.empty()) || strArtist.empty())
37 strArtist = source.strArtist;
40 strBiography = source.strBiography;
41 styles = source.styles;
43 instruments = source.instruments;
44 strBorn = source.strBorn;
45 strFormed = source.strFormed;
46 strDied = source.strDied;
47 strDisbanded = source.strDisbanded;
48 yearsActive = source.yearsActive;
49 thumbURL = source.thumbURL;
50 fanart = source.fanart;
51 discography = source.discography;
55 bool CArtist::Load(const TiXmlElement *artist, bool append, bool prioritise)
57 if (!artist) return false;
61 XMLUtils::GetString(artist, "name", strArtist);
62 XMLUtils::GetString(artist, "musicBrainzArtistID", strMusicBrainzArtistID);
64 XMLUtils::GetStringArray(artist, "genre", genre, prioritise, g_advancedSettings.m_musicItemSeparator);
65 XMLUtils::GetStringArray(artist, "style", styles, prioritise, g_advancedSettings.m_musicItemSeparator);
66 XMLUtils::GetStringArray(artist, "mood", moods, prioritise, g_advancedSettings.m_musicItemSeparator);
67 XMLUtils::GetStringArray(artist, "yearsactive", yearsActive, prioritise, g_advancedSettings.m_musicItemSeparator);
68 XMLUtils::GetStringArray(artist, "instruments", instruments, prioritise, g_advancedSettings.m_musicItemSeparator);
70 XMLUtils::GetString(artist, "born", strBorn);
71 XMLUtils::GetString(artist, "formed", strFormed);
72 XMLUtils::GetString(artist, "biography", strBiography);
73 XMLUtils::GetString(artist, "died", strDied);
74 XMLUtils::GetString(artist, "disbanded", strDisbanded);
76 size_t iThumbCount = thumbURL.m_url.size();
77 CStdString xmlAdd = thumbURL.m_xml;
79 const TiXmlElement* thumb = artist->FirstChildElement("thumb");
82 thumbURL.ParseElement(thumb);
89 thumb = thumb->NextSiblingElement("thumb");
91 // prefix thumbs from nfos
92 if (prioritise && iThumbCount && iThumbCount != thumbURL.m_url.size())
94 rotate(thumbURL.m_url.begin(),
95 thumbURL.m_url.begin()+iThumbCount,
96 thumbURL.m_url.end());
97 thumbURL.m_xml = xmlAdd;
99 const TiXmlElement* node = artist->FirstChildElement("album");
102 const TiXmlNode* title = node->FirstChild("title");
103 if (title && title->FirstChild())
105 CStdString strTitle = title->FirstChild()->Value();
107 const TiXmlNode* year = node->FirstChild("year");
108 if (year && year->FirstChild())
109 strYear = year->FirstChild()->Value();
110 discography.push_back(make_pair(strTitle,strYear));
112 node = node->NextSiblingElement("album");
116 const TiXmlElement *fanart2 = artist->FirstChildElement("fanart");
119 // we prefix to handle mixed-mode nfo's with fanart set
124 fanart.m_xml = temp+fanart.m_xml;
127 fanart.m_xml << *fanart2;
134 bool CArtist::Save(TiXmlNode *node, const CStdString &tag, const CStdString& strPath)
136 if (!node) return false;
138 // we start with a <tag> tag
139 TiXmlElement artistElement(tag.c_str());
140 TiXmlNode *artist = node->InsertEndChild(artistElement);
142 if (!artist) return false;
144 XMLUtils::SetString(artist, "name", strArtist);
145 XMLUtils::SetString(artist, "musicBrainzArtistID", strMusicBrainzArtistID);
146 XMLUtils::SetStringArray(artist, "genre", genre);
147 XMLUtils::SetStringArray(artist, "style", styles);
148 XMLUtils::SetStringArray(artist, "mood", moods);
149 XMLUtils::SetStringArray(artist, "yearsactive", yearsActive);
150 XMLUtils::SetStringArray(artist, "instruments", instruments);
151 XMLUtils::SetString(artist, "born", strBorn);
152 XMLUtils::SetString(artist, "formed", strFormed);
153 XMLUtils::SetString(artist, "biography", strBiography);
154 XMLUtils::SetString(artist, "died", strDied);
155 XMLUtils::SetString(artist, "disbanded", strDisbanded);
156 if (!thumbURL.m_xml.empty())
159 doc.Parse(thumbURL.m_xml);
160 const TiXmlNode* thumb = doc.FirstChild("thumb");
163 artist->InsertEndChild(*thumb);
164 thumb = thumb->NextSibling("thumb");
167 XMLUtils::SetString(artist, "path", strPath);
168 if (fanart.m_xml.size())
171 doc.Parse(fanart.m_xml);
172 artist->InsertEndChild(*doc.RootElement());
176 for (vector< pair<CStdString,CStdString> >::const_iterator it = discography.begin(); it != discography.end(); ++it)
179 TiXmlElement cast("album");
180 TiXmlNode *node = artist->InsertEndChild(cast);
181 TiXmlElement title("title");
182 TiXmlNode *titleNode = node->InsertEndChild(title);
183 TiXmlText name(it->first);
184 titleNode->InsertEndChild(name);
185 TiXmlElement year("year");
186 TiXmlNode *yearNode = node->InsertEndChild(year);
187 TiXmlText name2(it->second);
188 yearNode->InsertEndChild(name2);