void CMusicInfoScraper::FindAlbuminfo() { CStdString strAlbum=m_strAlbum; CStdString strHTML; m_vecAlbums.erase(m_vecAlbums.begin(), m_vecAlbums.end()); CScraperParser parser; if (!parser.Load(_P("q:\\system\\scrapers\\music\\"+m_info.strPath))) return; if (!m_info.settings.GetPluginRoot() || m_info.settings.GetSettings().IsEmpty()) { m_info.settings.LoadSettingsXML(_P("q:\\system\\scrapers\\music\\"+m_info.strPath)); m_info.settings.SaveFromDefault(); } parser.m_param[0] = strAlbum; parser.m_param[1] = m_strArtist; CUtil::URLEncode(parser.m_param[0]); CUtil::URLEncode(parser.m_param[1]); CScraperUrl scrURL; scrURL.ParseString(parser.Parse("CreateAlbumSearchUrl")); if (!CScraperUrl::Get(scrURL.m_url[0], strHTML, m_http) || strHTML.size() == 0) { CLog::Log(LOGERROR, "%s: Unable to retrieve web site",__FUNCTION__); return; } parser.m_param[0] = strHTML; CStdString strXML = parser.Parse("GetAlbumSearchResults",&m_info.settings); if (strXML.IsEmpty()) { CLog::Log(LOGERROR, "%s: Unable to parse web site",__FUNCTION__); return; } if (strXML.Find("encoding=\"utf-8\"") < 0) g_charsetConverter.unknownToUTF8(strXML); // ok, now parse the xml file TiXmlDocument doc; doc.Parse(strXML.c_str(),0,TIXML_ENCODING_UTF8); if (!doc.RootElement()) { CLog::Log(LOGERROR, "%s: Unable to parse xml",__FUNCTION__); return; } TiXmlHandle docHandle( &doc ); TiXmlElement* album = docHandle.FirstChild( "results" ).FirstChild( "entity" ).Element(); if (!album) return; while (album) { TiXmlNode* title = album->FirstChild("title"); TiXmlElement* link = album->FirstChildElement("url"); TiXmlNode* artist = album->FirstChild("artist"); TiXmlNode* year = album->FirstChild("year"); if (title && title->FirstChild()) { CStdString strTitle = title->FirstChild()->Value(); CStdString strArtist; CStdString strAlbumName; if (artist && artist->FirstChild()) { strArtist = artist->FirstChild()->Value(); strAlbumName.Format("%s - %s",strArtist.c_str(),strTitle.c_str()); } else strAlbumName = strTitle; if (year && year->FirstChild()) strAlbumName.Format("%s (%s)",strAlbumName.c_str(),year->FirstChild()->Value()); CScraperUrl url; if (!link) url.ParseString(scrURL.m_xml); while (link && link->FirstChild()) { url.ParseElement(link); link = link->NextSiblingElement("url"); } CMusicAlbumInfo newAlbum(strTitle, strArtist, strAlbumName, url); m_vecAlbums.push_back(newAlbum); } album = album->NextSiblingElement(); } if (m_vecAlbums.size()>0) m_bSuccessfull=true; return; }
bool CMusicArtistInfo::Load(CHTTP& http, const SScraperInfo& info, const CStdString& strFunction, const CScraperUrl* url) { // load our scraper xml CScraperParser parser; if (!parser.Load(_P("q:\\system\\scrapers\\music\\"+info.strPath))) return false; bool bChained=true; if (!url) { bChained=false; url = &GetArtistURL(); } std::vector<CStdString> strHTML; for (unsigned int i=0;i<url->m_url.size();++i) { CStdString strCurrHTML; if (!CScraperUrl::Get(url->m_url[i],strCurrHTML,http) || strCurrHTML.size() == 0) return false; strHTML.push_back(strCurrHTML); } // now grab our details using the scraper for (unsigned int i=0;i<strHTML.size();++i) parser.m_param[i] = strHTML[i]; CStdString strXML = parser.Parse(strFunction); if (strXML.IsEmpty()) { CLog::Log(LOGERROR, "%s: Unable to parse web site",__FUNCTION__); return false; } // abit ugly, but should work. would have been better if parser // set the charset of the xml, and we made use of that if (strXML.Find("encoding=\"utf-8\"") < 0) g_charsetConverter.unknownToUTF8(strXML); // ok, now parse the xml file TiXmlBase::SetCondenseWhiteSpace(false); TiXmlDocument doc; doc.Parse(strXML.c_str(),0,TIXML_ENCODING_UTF8); if (!doc.RootElement()) { CLog::Log(LOGERROR, "%s: Unable to parse xml",__FUNCTION__); return false; } bool ret = Parse(doc.RootElement(),bChained); TiXmlElement* pRoot = doc.RootElement(); TiXmlElement* xurl = pRoot->FirstChildElement("url"); while (xurl && xurl->FirstChild()) { const char* szFunction = xurl->Attribute("function"); if (szFunction) { CScraperUrl scrURL(xurl); Load(http,info,szFunction,&scrURL); } xurl = xurl->NextSiblingElement("url"); } TiXmlBase::SetCondenseWhiteSpace(true); return ret; }