Skip to content
Browse files

when importing and exporting the video library to a single folder str…

…ucture, there's no point in dumping art. Store the URLs in the xml instead
  • Loading branch information...
1 parent 04af3fd commit 51257ea0985c3b67a6323f9c97dcaa30b5f2d3b6 Jonathan Marshall committed Feb 23, 2012
Showing with 129 additions and 157 deletions.
  1. +128 −156 xbmc/video/VideoDatabase.cpp
  2. +1 −1 xbmc/video/VideoDatabase.h
View
284 xbmc/video/VideoDatabase.cpp
@@ -7255,7 +7255,16 @@ void CVideoDatabase::ExportToXML(const CStdString &path, bool singleFiles /* = f
// strip paths to make them relative
if (movie.m_strTrailer.Mid(0,movie.m_strPath.size()).Equals(movie.m_strPath))
movie.m_strTrailer = movie.m_strTrailer.Mid(movie.m_strPath.size());
- movie.Save(pMain, "movie", !singleFiles);
+ map<string, string> artwork;
+ if (GetArtForItem(movie.m_iDbId, movie.m_type, artwork) && !singleFiles)
+ {
+ TiXmlElement additionalNode("art");
+ for (map<string, string>::const_iterator i = artwork.begin(); i != artwork.end(); ++i)
+ XMLUtils::SetString(&additionalNode, i->first.c_str(), i->second);
+ movie.Save(pMain, "movie", true, &additionalNode);
+ }
+ else
+ movie.Save(pMain, "movie", !singleFiles);
// reset old skip state
bool bSkip = false;
@@ -7275,13 +7284,7 @@ void CVideoDatabase::ExportToXML(const CStdString &path, bool singleFiles /* = f
CFileItem item(movie.m_strFileNameAndPath,false);
CFileItem saveItem(item);
- if (!singleFiles)
- {
- CStdString strFileName(movie.m_strTitle);
- if (movie.m_iYear > 0)
- strFileName.AppendFormat("_%i", movie.m_iYear);
- saveItem = CFileItem(GetSafeFile(moviesDir, strFileName) + ".avi", false);
- }
+ saveItem.SetArt(artwork);
if (singleFiles && CUtil::SupportsFileOperations(movie.m_strFileNameAndPath))
{
if (!item.Exists(false))
@@ -7322,21 +7325,16 @@ void CVideoDatabase::ExportToXML(const CStdString &path, bool singleFiles /* = f
xmlDoc.InsertEndChild(decl);
}
- if (images && !bSkip)
+ if (singleFiles && images && !bSkip)
{
- CStdString cachedThumb(GetCachedThumb(item));
CStdString savedThumb(saveItem.GetTBNFile());
- if (!cachedThumb.IsEmpty() && (overwrite || !CFile::Exists(savedThumb, false)))
- if (!CFile::Cache(cachedThumb, savedThumb))
- CLog::Log(LOGERROR, "%s: Movie thumb export failed! ('%s' -> '%s')", __FUNCTION__, cachedThumb.c_str(), savedThumb.c_str());
-
- CStdString cachedFanart(item.GetCachedFanart());
+ if (saveItem.HasThumbnail() && (overwrite || !CFile::Exists(savedThumb, false)))
+ CTextureCache::Get().Export(saveItem.GetThumbnailImage(), savedThumb);
+
CStdString savedFanart(URIUtils::ReplaceExtension(savedThumb, "-fanart.jpg"));
-
- if (CFile::Exists(cachedFanart, false) && (overwrite || !CFile::Exists(savedFanart, false)))
- if (!CFile::Cache(cachedFanart, savedFanart))
- CLog::Log(LOGERROR, "%s: Movie fanart export failed! ('%s' -> '%s')", __FUNCTION__, cachedFanart.c_str(), savedFanart.c_str());
-
+ if (saveItem.HasProperty("fanart_image") && (overwrite || !CFile::Exists(savedFanart, false)))
+ CTextureCache::Get().Export(saveItem.GetProperty("fanart_image").asString(), savedFanart);
+
if (actorThumbs)
ExportActorThumbs(actorsDir, movie, singleFiles, overwrite);
}
@@ -7356,7 +7354,16 @@ void CVideoDatabase::ExportToXML(const CStdString &path, bool singleFiles /* = f
while (!m_pDS->eof())
{
CVideoInfoTag movie = GetDetailsForMusicVideo(m_pDS);
- movie.Save(pMain, "musicvideo", !singleFiles);
+ map<string, string> artwork;
+ if (GetArtForItem(movie.m_iDbId, movie.m_type, artwork) && !singleFiles)
+ {
+ TiXmlElement additionalNode("art");
+ for (map<string, string>::const_iterator i = artwork.begin(); i != artwork.end(); ++i)
+ XMLUtils::SetString(&additionalNode, i->first.c_str(), i->second);
+ movie.Save(pMain, "musicvideo", true, &additionalNode);
+ }
+ else
+ movie.Save(pMain, "musicvideo", !singleFiles);
// reset old skip state
bool bSkip = false;
@@ -7376,13 +7383,7 @@ void CVideoDatabase::ExportToXML(const CStdString &path, bool singleFiles /* = f
CFileItem item(movie.m_strFileNameAndPath,false);
CFileItem saveItem(item);
- if (!singleFiles)
- {
- CStdString strFileName(StringUtils::Join(movie.m_artist, g_advancedSettings.m_videoItemSeparator) + "." + movie.m_strTitle);
- if (movie.m_iYear > 0)
- strFileName.AppendFormat("_%i", movie.m_iYear);
- saveItem = CFileItem(GetSafeFile(musicvideosDir, strFileName) + ".avi", false);
- }
+ saveItem.SetArt(artwork);
if (CUtil::SupportsFileOperations(movie.m_strFileNameAndPath) && singleFiles)
{
if (!item.Exists(false))
@@ -7417,13 +7418,11 @@ void CVideoDatabase::ExportToXML(const CStdString &path, bool singleFiles /* = f
TiXmlDeclaration decl("1.0", "UTF-8", "yes");
xmlDoc.InsertEndChild(decl);
}
- if (images && !bSkip)
+ if (singleFiles && images && !bSkip)
{
- CStdString cachedThumb(GetCachedThumb(item));
CStdString savedThumb(saveItem.GetTBNFile());
- if (!cachedThumb.IsEmpty() && (overwrite || !CFile::Exists(savedThumb, false)))
- if (!CFile::Cache(cachedThumb, savedThumb))
- CLog::Log(LOGERROR, "%s: Musicvideo thumb export failed! ('%s' -> '%s')", __FUNCTION__, cachedThumb.c_str(), savedThumb.c_str());
+ if (saveItem.HasThumbnail() && (overwrite || !CFile::Exists(savedThumb, false)))
+ CTextureCache::Get().Export(saveItem.GetThumbnailImage(), savedThumb);
}
m_pDS->next();
current++;
@@ -7440,7 +7439,27 @@ void CVideoDatabase::ExportToXML(const CStdString &path, bool singleFiles /* = f
while (!m_pDS->eof())
{
CVideoInfoTag tvshow = GetDetailsForTvShow(m_pDS, true);
- tvshow.Save(pMain, "tvshow", !singleFiles);
+
+ map<int, string> seasonArt;
+ GetTvShowSeasonArt(tvshow.m_iDbId, seasonArt);
+
+ map<string, string> artwork;
+ if (GetArtForItem(tvshow.m_iDbId, tvshow.m_type, artwork) && !singleFiles)
+ {
+ TiXmlElement additionalNode("art");
+ for (map<string, string>::const_iterator i = artwork.begin(); i != artwork.end(); ++i)
+ XMLUtils::SetString(&additionalNode, i->first.c_str(), i->second);
+ for (map<int, string>::const_iterator i = seasonArt.begin(); i != seasonArt.end(); ++i)
+ {
+ TiXmlElement seasonNode("season");
+ seasonNode.SetAttribute("num", i->first);
+ XMLUtils::SetString(&seasonNode, "thumb", i->second);
+ additionalNode.InsertEndChild(seasonNode);
+ }
+ tvshow.Save(pMain, "tvshow", true, &additionalNode);
+ }
+ else
+ tvshow.Save(pMain, "tvshow", !singleFiles);
// reset old skip state
bool bSkip = false;
@@ -7461,8 +7480,7 @@ void CVideoDatabase::ExportToXML(const CStdString &path, bool singleFiles /* = f
CFileItem item(tvshow.m_strPath, true);
CFileItem saveItem(item);
- if (!singleFiles)
- saveItem = CFileItem(GetSafeFile(tvshowsDir, tvshow.m_strShowTitle), true);
+ saveItem.SetArt(artwork);
if (singleFiles && CUtil::SupportsFileOperations(tvshow.m_strPath))
{
if (!item.Exists(false))
@@ -7498,77 +7516,35 @@ void CVideoDatabase::ExportToXML(const CStdString &path, bool singleFiles /* = f
TiXmlDeclaration decl("1.0", "UTF-8", "yes");
xmlDoc.InsertEndChild(decl);
}
- if (images && !bSkip)
+ if (singleFiles && images && !bSkip)
{
- CStdString cachedThumb(GetCachedThumb(item));
CStdString savedThumb(saveItem.GetFolderThumb());
- if (!cachedThumb.IsEmpty() && (overwrite || !CFile::Exists(savedThumb, false)))
- if (!CFile::Cache(cachedThumb, savedThumb))
- CLog::Log(LOGERROR, "%s: TVShow thumb export failed! ('%s' -> '%s')", __FUNCTION__, cachedThumb.c_str(), savedThumb.c_str());
+ if (saveItem.HasThumbnail() && (overwrite || !CFile::Exists(savedThumb, false)))
+ CTextureCache::Get().Export(saveItem.GetThumbnailImage(), savedThumb);
- CStdString cachedFanart(item.GetCachedFanart());
CStdString savedFanart(saveItem.GetFolderThumb("fanart.jpg"));
- if (CFile::Exists(cachedFanart, false) && (overwrite || !CFile::Exists(savedFanart, false)))
- if (!CFile::Cache(cachedFanart, savedFanart))
- CLog::Log(LOGERROR, "%s: TVShow fanart export failed! ('%s' -> '%s')", __FUNCTION__, cachedFanart.c_str(), savedFanart.c_str());
+ if (saveItem.HasProperty("fanart_image") && (overwrite || !CFile::Exists(savedFanart, false)))
+ CTextureCache::Get().Export(saveItem.GetProperty("fanart_image").asString(), savedFanart);
if (actorThumbs)
ExportActorThumbs(actorsDir, tvshow, singleFiles, overwrite);
- // now get all available seasons from this show
- sql = PrepareSQL("select distinct(c%02d) from episodeview where idShow=%i", VIDEODB_ID_EPISODE_SEASON, tvshow.m_iDbId);
- pDS2->query(sql.c_str());
-
- CFileItemList items;
- CStdString strDatabasePath;
- strDatabasePath.Format("videodb://2/2/%i/",tvshow.m_iDbId);
-
- // add "All Seasons" to list
- CFileItemPtr pItem;
- pItem.reset(new CFileItem(g_localizeStrings.Get(20366)));
- pItem->GetVideoInfoTag()->m_iSeason = -1;
- pItem->GetVideoInfoTag()->m_strPath = tvshow.m_strPath;
- items.Add(pItem);
-
- // loop through available season
- while (!pDS2->eof())
- {
- int iSeason = pDS2->fv(0).get_asInt();
- CStdString strLabel;
- if (iSeason == 0)
- strLabel = g_localizeStrings.Get(20381);
- else
- strLabel.Format(g_localizeStrings.Get(20358),iSeason);
- CFileItemPtr pItem(new CFileItem(strLabel));
- pItem->GetVideoInfoTag()->m_strTitle = strLabel;
- pItem->GetVideoInfoTag()->m_iSeason = iSeason;
- pItem->GetVideoInfoTag()->m_strPath = tvshow.m_strPath;
- items.Add(pItem);
- pDS2->next();
- }
- pDS2->close();
-
// export season thumbs
- for (int i=0;i<items.Size();++i)
+ for (map<int, string>::const_iterator i = seasonArt.begin(); i != seasonArt.end(); ++i)
{
- CStdString strSeasonThumb, strParent;
- int iSeason = items[i]->GetVideoInfoTag()->m_iSeason;
- if (iSeason == -1)
- strSeasonThumb = "season-all.tbn";
- else if (iSeason == 0)
- strSeasonThumb = "season-specials.tbn";
+ CStdString seasonThumb;
+ if (i->first == -1)
+ seasonThumb = "season-all.tbn";
+ else if (i->first == 0)
+ seasonThumb = "season-specials.tbn";
else
- strSeasonThumb.Format("season%02i.tbn",iSeason);
-
- CStdString cachedThumb(items[i]->GetCachedSeasonThumb());
- CStdString savedThumb(saveItem.GetFolderThumb(strSeasonThumb));
-
- if (CFile::Exists(cachedThumb, false) && (overwrite || !CFile::Exists(savedThumb, false)))
- if (!CFile::Cache(cachedThumb, savedThumb))
- CLog::Log(LOGERROR, "%s: TVShow season thumb export failed ('%s' -> '%s')", __FUNCTION__, cachedThumb.c_str(), savedThumb.c_str());
+ seasonThumb.Format("season%02i.tbn", i->first);
+ CStdString savedThumb(saveItem.GetFolderThumb(seasonThumb));
+ if (!i->second.empty() && (overwrite || !CFile::Exists(savedThumb, false)))
+ CTextureCache::Get().Export(i->second, savedThumb);
}
}
-
+
// now save the episodes from this show
sql = PrepareSQL("select * from episodeview where idShow=%i order by strFileName, idEpisode",tvshow.m_iDbId);
pDS->query(sql.c_str());
@@ -7577,10 +7553,18 @@ void CVideoDatabase::ExportToXML(const CStdString &path, bool singleFiles /* = f
while (!pDS->eof())
{
CVideoInfoTag episode = GetDetailsForEpisode(pDS, true);
- if (singleFiles)
- episode.Save(pMain, "episodedetails", !singleFiles);
- else
+ map<string, string> artwork;
+ if (GetArtForItem(episode.m_iDbId, "episode", artwork) && !singleFiles)
+ {
+ TiXmlElement additionalNode("art");
+ for (map<string, string>::const_iterator i = artwork.begin(); i != artwork.end(); ++i)
+ XMLUtils::SetString(&additionalNode, i->first.c_str(), i->second);
+ episode.Save(pMain->LastChild(), "episodedetails", true, &additionalNode);
+ }
+ else if (!singleFiles)
episode.Save(pMain->LastChild(), "episodedetails", !singleFiles);
+ else
+ episode.Save(pMain, "episodedetails", !singleFiles);
pDS->next();
// multi-episode files need dumping to the same XML
while (singleFiles && !pDS->eof() &&
@@ -7596,12 +7580,7 @@ void CVideoDatabase::ExportToXML(const CStdString &path, bool singleFiles /* = f
CFileItem item(episode.m_strFileNameAndPath, false);
CFileItem saveItem(item);
- if (!singleFiles)
- {
- CStdString epName;
- epName.Format("s%02ie%02i.avi", episode.m_iSeason, episode.m_iEpisode);
- saveItem = CFileItem(URIUtils::AddFileToFolder(showDir, epName), false);
- }
+ saveItem.SetArt(artwork);
if (singleFiles)
{
if (!item.Exists(false))
@@ -7637,13 +7616,11 @@ void CVideoDatabase::ExportToXML(const CStdString &path, bool singleFiles /* = f
xmlDoc.InsertEndChild(decl);
}
- if (images && !bSkip)
+ if (singleFiles && images && !bSkip)
{
- CStdString cachedThumb(GetCachedThumb(CFileItem(episode)));
CStdString savedThumb(saveItem.GetTBNFile());
- if (!cachedThumb.IsEmpty() && (overwrite || !CFile::Exists(savedThumb, false)))
- if (!CFile::Cache(cachedThumb, savedThumb))
- CLog::Log(LOGERROR, "%s: Episode thumb export failed! ('%s' -> '%s')", __FUNCTION__, cachedThumb.c_str(), savedThumb.c_str());
+ if (saveItem.HasThumbnail() && (overwrite || !CFile::Exists(savedThumb, false)))
+ CTextureCache::Get().Export(saveItem.GetThumbnailImage(), savedThumb);
if (actorThumbs)
ExportActorThumbs(actorsDir, episode, singleFiles, overwrite);
@@ -7724,25 +7701,6 @@ void CVideoDatabase::ExportActorThumbs(const CStdString &strDir, const CVideoInf
}
}
-CStdString CVideoDatabase::GetCachedThumb(const CFileItem& item) const
-{
- CStdString cachedThumb(item.GetCachedVideoThumb());
- if (item.HasVideoInfoTag() && !item.m_bIsFolder &&
- item.GetVideoInfoTag()->m_iEpisode > -1 &&
- CFile::Exists(item.GetCachedEpisodeThumb()))
- cachedThumb = item.GetCachedEpisodeThumb();
- if (!CFile::Exists(cachedThumb) && g_advancedSettings.m_bVideoLibraryExportAutoThumbs)
- {
- CStdString thumbURL = CVideoThumbLoader::GetEmbeddedThumbURL(item);
- cachedThumb = CTextureCache::Get().GetCachedImage(thumbURL);
- }
-
- if (!cachedThumb.IsEmpty() && CFile::Exists(cachedThumb))
- return cachedThumb;
- else
- return "";
-}
-
bool CVideoDatabase::ExportSkipEntry(const CStdString &nfoFile)
{
CStdString strParent;
@@ -7809,7 +7767,6 @@ void CVideoDatabase::ImportFromXML(const CStdString &path)
CStdString musicvideosDir(URIUtils::AddFileToFolder(path, "musicvideos"));
CStdString tvshowsDir(URIUtils::AddFileToFolder(path, "tvshows"));
CVideoInfoScanner scanner;
- set<CStdString> actors;
// add paths first (so we have scraper settings available)
TiXmlElement *path = root->FirstChildElement("paths");
path = path->FirstChildElement();
@@ -7846,31 +7803,30 @@ void CVideoDatabase::ImportFromXML(const CStdString &path)
{
info.Load(movie);
CFileItem item(info);
+ map<string, string> artwork;
+ if (ImportArtFromXML(movie->FirstChild("art"), artwork))
+ item.SetArt(artwork);
bool useFolders = info.m_basePath.IsEmpty() ? LookupByFolders(item.GetPath()) : false;
scanner.AddVideo(&item, CONTENT_MOVIES, useFolders);
SetPlayCount(item, info.m_playCount, info.m_lastPlayed);
CStdString strFileName(info.m_strTitle);
if (iVersion >= 1 && info.m_iYear > 0)
strFileName.AppendFormat("_%i", info.m_iYear);
- CStdString file(GetSafeFile(moviesDir, strFileName));
- CFile::Cache(file + ".tbn", item.GetCachedVideoThumb());
- CFile::Cache(file + "-fanart.jpg", item.GetCachedFanart());
- for (CVideoInfoTag::iCast i = info.m_cast.begin(); i != info.m_cast.end(); ++i)
- actors.insert(i->strName);
current++;
}
else if (strnicmp(movie->Value(), "musicvideo", 10) == 0)
{
info.Load(movie);
CFileItem item(info);
+ map<string, string> artwork;
+ if (ImportArtFromXML(movie->FirstChild("art"), artwork))
+ item.SetArt(artwork);
bool useFolders = info.m_basePath.IsEmpty() ? LookupByFolders(item.GetPath()) : false;
scanner.AddVideo(&item, CONTENT_MUSICVIDEOS, useFolders);
SetPlayCount(item, info.m_playCount, info.m_lastPlayed);
CStdString strFileName(StringUtils::Join(info.m_artist, g_advancedSettings.m_videoItemSeparator) + "." + info.m_strTitle);
if (iVersion >= 1 && info.m_iYear > 0)
strFileName.AppendFormat("_%i", info.m_iYear);
- CStdString file(GetSafeFile(musicvideosDir, strFileName));
- CFile::Cache(file + ".tbn", item.GetCachedVideoThumb());
current++;
}
else if (strnicmp(movie->Value(), "tvshow", 6) == 0)
@@ -7881,14 +7837,32 @@ void CVideoDatabase::ImportFromXML(const CStdString &path)
URIUtils::AddSlashAtEnd(info.m_strPath);
DeleteTvShow(info.m_strPath);
CFileItem item(info);
+ map<string, string> artwork;
+ if (ImportArtFromXML(movie->FirstChild("art"), artwork))
+ item.SetArt(artwork);
bool useFolders = info.m_basePath.IsEmpty() ? LookupByFolders(item.GetPath(), true) : false;
int showID = scanner.AddVideo(&item, CONTENT_TVSHOWS, useFolders);
+ // season artwork
+ TiXmlNode *art = movie->FirstChild("art");
+ if (art)
+ {
+ TiXmlElement *season = art->FirstChildElement("season");
+ while (season)
+ {
+ if (season->FirstChild())
+ {
+ int seasonNum = -1;
+ season->Attribute("num", &seasonNum);
+ map<string, string> artwork;
+ ImportArtFromXML(season, artwork);
+ int seasonID = AddSeason(showID, seasonNum);
+ if (seasonID > -1)
+ SetArtForItem(seasonID, "season", artwork);
+ }
+ season = season->NextSiblingElement("season");
+ }
+ }
current++;
- CStdString showDir(GetSafeFile(tvshowsDir, info.m_strTitle));
- CFile::Cache(URIUtils::AddFileToFolder(showDir, "folder.jpg"), item.GetCachedVideoThumb());
- CFile::Cache(URIUtils::AddFileToFolder(showDir, "fanart.jpg"), item.GetCachedFanart());
- for (CVideoInfoTag::iCast i = info.m_cast.begin(); i != info.m_cast.end(); ++i)
- actors.insert(i->strName);
// now load the episodes
TiXmlElement *episode = movie->FirstChildElement("episodedetails");
while (episode)
@@ -7897,17 +7871,13 @@ void CVideoDatabase::ImportFromXML(const CStdString &path)
CVideoInfoTag info;
info.Load(episode);
CFileItem item(info);
+ map<string, string> artwork;
+ if (ImportArtFromXML(movie->FirstChild("art"), artwork))
+ item.SetArt(artwork);
scanner.AddVideo(&item,CONTENT_TVSHOWS,false,showID);
SetPlayCount(item, info.m_playCount, info.m_lastPlayed);
- CStdString file;
- file.Format("s%02ie%02i.tbn", info.m_iSeason, info.m_iEpisode);
- CFile::Cache(URIUtils::AddFileToFolder(showDir, file), item.GetCachedVideoThumb());
- for (CVideoInfoTag::iCast i = info.m_cast.begin(); i != info.m_cast.end(); ++i)
- actors.insert(i->strName);
episode = episode->NextSiblingElement("episodedetails");
}
- // and fetch season thumbs
- scanner.FetchSeasonThumbs(showID, showDir, false, true);
}
movie = movie->NextSiblingElement();
if (progress && total)
@@ -7923,15 +7893,6 @@ void CVideoDatabase::ImportFromXML(const CStdString &path)
}
}
}
- // cache any actor thumbs
- for (set<CStdString>::iterator i = actors.begin(); i != actors.end(); i++)
- {
- CFileItem item;
- item.SetLabel(*i);
- CStdString savedThumb(GetSafeFile(actorsDir, *i) + ".tbn");
- CStdString cachedThumb = item.GetCachedActorThumb();
- CFile::Cache(savedThumb, cachedThumb);
- }
}
catch (...)
{
@@ -7941,6 +7902,17 @@ void CVideoDatabase::ImportFromXML(const CStdString &path)
progress->Close();
}
+bool CVideoDatabase::ImportArtFromXML(const TiXmlNode *node, map<string, string> &artwork)
+{
+ if (!node) return false;
+ CStdString art;
+ if (XMLUtils::GetString(node, "thumb", art))
+ artwork.insert(make_pair("thumb", art));
+ if (XMLUtils::GetString(node, "fanart", art))
+ artwork.insert(make_pair("fanart", art));
+ return !artwork.empty();
+}
+
bool CVideoDatabase::GetArbitraryQuery(const CStdString& strQuery, const CStdString& strOpenRecordSet, const CStdString& strCloseRecordSet,
const CStdString& strOpenRecord, const CStdString& strCloseRecord, const CStdString& strOpenField, const CStdString& strCloseField, CStdString& strResult)
{
View
2 xbmc/video/VideoDatabase.h
@@ -602,7 +602,7 @@ class CVideoDatabase : public CDatabase
void ExportActorThumbs(const CStdString &path, const CVideoInfoTag& tag, bool singleFiles, bool overwrite=false);
void ImportFromXML(const CStdString &path);
void DumpToDummyFiles(const CStdString &path);
- CStdString GetCachedThumb(const CFileItem& item) const;
+ bool ImportArtFromXML(const TiXmlNode *node, std::map<std::string, std::string> &artwork);
// smart playlists and main retrieval work in these functions
bool GetMoviesByWhere(const CStdString& strBaseDir, const CStdString &where, const CStdString &order, CFileItemList& items, bool fetchSets = false);

0 comments on commit 51257ea

Please sign in to comment.
Something went wrong with that request. Please try again.