diff options
Diffstat (limited to 'xbmc/filesystem/VideoDatabaseDirectory.cpp')
-rw-r--r-- | xbmc/filesystem/VideoDatabaseDirectory.cpp | 377 |
1 files changed, 377 insertions, 0 deletions
diff --git a/xbmc/filesystem/VideoDatabaseDirectory.cpp b/xbmc/filesystem/VideoDatabaseDirectory.cpp new file mode 100644 index 0000000..6a2cb6a --- /dev/null +++ b/xbmc/filesystem/VideoDatabaseDirectory.cpp @@ -0,0 +1,377 @@ +/* + * Copyright (C) 2016-2018 Team Kodi + * This file is part of Kodi - https://kodi.tv + * + * SPDX-License-Identifier: GPL-2.0-or-later + * See LICENSES/README.md for more information. + */ + +#include "VideoDatabaseDirectory.h" + +#include "File.h" +#include "FileItem.h" +#include "ServiceBroker.h" +#include "VideoDatabaseDirectory/QueryParams.h" +#include "guilib/LocalizeStrings.h" +#include "guilib/TextureManager.h" +#include "settings/Settings.h" +#include "settings/SettingsComponent.h" +#include "utils/Crc32.h" +#include "utils/LegacyPathTranslation.h" +#include "utils/StringUtils.h" +#include "utils/URIUtils.h" +#include "video/VideoDatabase.h" + +using namespace XFILE; +using namespace VIDEODATABASEDIRECTORY; + +CVideoDatabaseDirectory::CVideoDatabaseDirectory(void) = default; + +CVideoDatabaseDirectory::~CVideoDatabaseDirectory(void) = default; + +namespace +{ +std::string GetChildContentType(const std::unique_ptr<CDirectoryNode>& node) +{ + switch (node->GetChildType()) + { + case NODE_TYPE_EPISODES: + case NODE_TYPE_RECENTLY_ADDED_EPISODES: + return "episodes"; + case NODE_TYPE_SEASONS: + return "seasons"; + case NODE_TYPE_TITLE_MOVIES: + case NODE_TYPE_RECENTLY_ADDED_MOVIES: + return "movies"; + case NODE_TYPE_TITLE_TVSHOWS: + case NODE_TYPE_INPROGRESS_TVSHOWS: + return "tvshows"; + case NODE_TYPE_TITLE_MUSICVIDEOS: + case NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS: + return "musicvideos"; + case NODE_TYPE_GENRE: + return "genres"; + case NODE_TYPE_COUNTRY: + return "countries"; + case NODE_TYPE_ACTOR: + { + CQueryParams params; + node->CollectQueryParams(params); + if (static_cast<VideoDbContentType>(params.GetContentType()) == + VideoDbContentType::MUSICVIDEOS) + return "artists"; + + return "actors"; + } + case NODE_TYPE_DIRECTOR: + return "directors"; + case NODE_TYPE_STUDIO: + return "studios"; + case NODE_TYPE_YEAR: + return "years"; + case NODE_TYPE_MUSICVIDEOS_ALBUM: + return "albums"; + case NODE_TYPE_SETS: + return "sets"; + case NODE_TYPE_TAGS: + return "tags"; + default: + break; + } + return {}; +} + +} // unnamed namespace + +bool CVideoDatabaseDirectory::GetDirectory(const CURL& url, CFileItemList &items) +{ + std::string path = CLegacyPathTranslation::TranslateVideoDbPath(url); + items.SetPath(path); + items.m_dwSize = -1; // No size + std::unique_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(path)); + + if (!pNode) + return false; + + bool bResult = pNode->GetChilds(items); + for (int i=0;i<items.Size();++i) + { + CFileItemPtr item = items[i]; + if (item->m_bIsFolder && !item->HasArt("icon") && !item->HasArt("thumb")) + { + std::string strImage = GetIcon(item->GetPath()); + if (!strImage.empty() && CServiceBroker::GetGUI()->GetTextureManager().HasTexture(strImage)) + item->SetArt("icon", strImage); + } + if (item->GetVideoInfoTag()) + { + item->SetDynPath(item->GetVideoInfoTag()->GetPath()); + } + } + if (items.HasProperty("customtitle")) + items.SetLabel(items.GetProperty("customtitle").asString()); + else + items.SetLabel(pNode->GetLocalizedName()); + + items.SetContent(GetChildContentType(pNode)); + + return bResult; +} + +NODE_TYPE CVideoDatabaseDirectory::GetDirectoryChildType(const std::string& strPath) +{ + std::string path = CLegacyPathTranslation::TranslateVideoDbPath(strPath); + std::unique_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(path)); + + if (!pNode) + return NODE_TYPE_NONE; + + return pNode->GetChildType(); +} + +NODE_TYPE CVideoDatabaseDirectory::GetDirectoryType(const std::string& strPath) +{ + std::string path = CLegacyPathTranslation::TranslateVideoDbPath(strPath); + std::unique_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(path)); + + if (!pNode) + return NODE_TYPE_NONE; + + return pNode->GetType(); +} + +NODE_TYPE CVideoDatabaseDirectory::GetDirectoryParentType(const std::string& strPath) +{ + std::string path = CLegacyPathTranslation::TranslateVideoDbPath(strPath); + std::unique_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(path)); + + if (!pNode) + return NODE_TYPE_NONE; + + CDirectoryNode* pParentNode=pNode->GetParent(); + + if (!pParentNode) + return NODE_TYPE_NONE; + + return pParentNode->GetChildType(); +} + +bool CVideoDatabaseDirectory::GetQueryParams(const std::string& strPath, CQueryParams& params) +{ + std::string path = CLegacyPathTranslation::TranslateVideoDbPath(strPath); + std::unique_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(path)); + + if (!pNode) + return false; + + CDirectoryNode::GetDatabaseInfo(strPath,params); + return true; +} + +void CVideoDatabaseDirectory::ClearDirectoryCache(const std::string& strDirectory) +{ + std::string path = CLegacyPathTranslation::TranslateVideoDbPath(strDirectory); + URIUtils::RemoveSlashAtEnd(path); + + uint32_t crc = Crc32::ComputeFromLowerCase(path); + + std::string strFileName = StringUtils::Format("special://temp/archive_cache/{:08x}.fi", crc); + CFile::Delete(strFileName); +} + +bool CVideoDatabaseDirectory::IsAllItem(const std::string& strDirectory) +{ + if (StringUtils::EndsWith(strDirectory, "/-1/")) + return true; + return false; +} + +bool CVideoDatabaseDirectory::GetLabel(const std::string& strDirectory, std::string& strLabel) +{ + strLabel = ""; + + std::string path = CLegacyPathTranslation::TranslateVideoDbPath(strDirectory); + std::unique_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(path)); + if (!pNode || path.empty()) + return false; + + // first see if there's any filter criteria + CQueryParams params; + CDirectoryNode::GetDatabaseInfo(path, params); + + CVideoDatabase videodatabase; + if (!videodatabase.Open()) + return false; + + // get genre + if (params.GetGenreId() != -1) + strLabel += videodatabase.GetGenreById(params.GetGenreId()); + + // get country + if (params.GetCountryId() != -1) + strLabel += videodatabase.GetCountryById(params.GetCountryId()); + + // get set + if (params.GetSetId() != -1) + strLabel += videodatabase.GetSetById(params.GetSetId()); + + // get tag + if (params.GetTagId() != -1) + strLabel += videodatabase.GetTagById(params.GetTagId()); + + // get year + if (params.GetYear() != -1) + { + std::string strTemp = std::to_string(params.GetYear()); + if (!strLabel.empty()) + strLabel += " / "; + strLabel += strTemp; + } + + if (strLabel.empty()) + { + switch (pNode->GetChildType()) + { + case NODE_TYPE_TITLE_MOVIES: + case NODE_TYPE_TITLE_TVSHOWS: + case NODE_TYPE_TITLE_MUSICVIDEOS: + strLabel = g_localizeStrings.Get(369); break; + case NODE_TYPE_ACTOR: // Actor + strLabel = g_localizeStrings.Get(344); break; + case NODE_TYPE_GENRE: // Genres + strLabel = g_localizeStrings.Get(135); break; + case NODE_TYPE_COUNTRY: // Countries + strLabel = g_localizeStrings.Get(20451); break; + case NODE_TYPE_YEAR: // Year + strLabel = g_localizeStrings.Get(562); break; + case NODE_TYPE_DIRECTOR: // Director + strLabel = g_localizeStrings.Get(20348); break; + case NODE_TYPE_SETS: // Sets + strLabel = g_localizeStrings.Get(20434); break; + case NODE_TYPE_TAGS: // Tags + strLabel = g_localizeStrings.Get(20459); break; + case NODE_TYPE_MOVIES_OVERVIEW: // Movies + strLabel = g_localizeStrings.Get(342); break; + case NODE_TYPE_TVSHOWS_OVERVIEW: // TV Shows + strLabel = g_localizeStrings.Get(20343); break; + case NODE_TYPE_RECENTLY_ADDED_MOVIES: // Recently Added Movies + strLabel = g_localizeStrings.Get(20386); break; + case NODE_TYPE_RECENTLY_ADDED_EPISODES: // Recently Added Episodes + strLabel = g_localizeStrings.Get(20387); break; + case NODE_TYPE_STUDIO: // Studios + strLabel = g_localizeStrings.Get(20388); break; + case NODE_TYPE_MUSICVIDEOS_OVERVIEW: // Music Videos + strLabel = g_localizeStrings.Get(20389); break; + case NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS: // Recently Added Music Videos + strLabel = g_localizeStrings.Get(20390); break; + case NODE_TYPE_SEASONS: // Seasons + strLabel = g_localizeStrings.Get(33054); break; + case NODE_TYPE_EPISODES: // Episodes + strLabel = g_localizeStrings.Get(20360); break; + case NODE_TYPE_INPROGRESS_TVSHOWS: // InProgress TvShows + strLabel = g_localizeStrings.Get(626); break; + default: + return false; + } + } + + return true; +} + +std::string CVideoDatabaseDirectory::GetIcon(const std::string &strDirectory) +{ + std::string path = CLegacyPathTranslation::TranslateVideoDbPath(strDirectory); + switch (GetDirectoryChildType(path)) + { + case NODE_TYPE_TITLE_MOVIES: + if (URIUtils::PathEquals(path, "videodb://movies/titles/")) + { + if (CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool(CSettings::SETTING_MYVIDEOS_FLATTEN)) + return "DefaultMovies.png"; + return "DefaultMovieTitle.png"; + } + return ""; + case NODE_TYPE_TITLE_TVSHOWS: + if (URIUtils::PathEquals(path, "videodb://tvshows/titles/")) + { + if (CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool(CSettings::SETTING_MYVIDEOS_FLATTEN)) + return "DefaultTVShows.png"; + return "DefaultTVShowTitle.png"; + } + return ""; + case NODE_TYPE_TITLE_MUSICVIDEOS: + if (URIUtils::PathEquals(path, "videodb://musicvideos/titles/")) + { + if (CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool(CSettings::SETTING_MYVIDEOS_FLATTEN)) + return "DefaultMusicVideos.png"; + return "DefaultMusicVideoTitle.png"; + } + return ""; + case NODE_TYPE_ACTOR: // Actor + return "DefaultActor.png"; + case NODE_TYPE_GENRE: // Genres + return "DefaultGenre.png"; + case NODE_TYPE_COUNTRY: // Countries + return "DefaultCountry.png"; + case NODE_TYPE_SETS: // Sets + return "DefaultSets.png"; + case NODE_TYPE_TAGS: // Tags + return "DefaultTags.png"; + case NODE_TYPE_YEAR: // Year + return "DefaultYear.png"; + case NODE_TYPE_DIRECTOR: // Director + return "DefaultDirector.png"; + case NODE_TYPE_MOVIES_OVERVIEW: // Movies + return "DefaultMovies.png"; + case NODE_TYPE_TVSHOWS_OVERVIEW: // TV Shows + return "DefaultTVShows.png"; + case NODE_TYPE_RECENTLY_ADDED_MOVIES: // Recently Added Movies + return "DefaultRecentlyAddedMovies.png"; + case NODE_TYPE_RECENTLY_ADDED_EPISODES: // Recently Added Episodes + return "DefaultRecentlyAddedEpisodes.png"; + case NODE_TYPE_RECENTLY_ADDED_MUSICVIDEOS: // Recently Added Episodes + return "DefaultRecentlyAddedMusicVideos.png"; + case NODE_TYPE_INPROGRESS_TVSHOWS: // InProgress TvShows + return "DefaultInProgressShows.png"; + case NODE_TYPE_STUDIO: // Studios + return "DefaultStudios.png"; + case NODE_TYPE_MUSICVIDEOS_OVERVIEW: // Music Videos + return "DefaultMusicVideos.png"; + case NODE_TYPE_MUSICVIDEOS_ALBUM: // Music Videos - Albums + return "DefaultMusicAlbums.png"; + default: + break; + } + + return ""; +} + +bool CVideoDatabaseDirectory::ContainsMovies(const std::string &path) +{ + VIDEODATABASEDIRECTORY::NODE_TYPE type = GetDirectoryChildType(path); + if (type == VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MOVIES || type == VIDEODATABASEDIRECTORY::NODE_TYPE_EPISODES || type == VIDEODATABASEDIRECTORY::NODE_TYPE_TITLE_MUSICVIDEOS) return true; + return false; +} + +bool CVideoDatabaseDirectory::Exists(const CURL& url) +{ + std::string path = CLegacyPathTranslation::TranslateVideoDbPath(url); + std::unique_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(path)); + + if (!pNode) + return false; + + if (pNode->GetChildType() == VIDEODATABASEDIRECTORY::NODE_TYPE_NONE) + return false; + + return true; +} + +bool CVideoDatabaseDirectory::CanCache(const std::string& strPath) +{ + std::string path = CLegacyPathTranslation::TranslateVideoDbPath(strPath); + std::unique_ptr<CDirectoryNode> pNode(CDirectoryNode::ParseURL(path)); + if (!pNode) + return false; + return pNode->CanCache(); +} |