diff options
Diffstat (limited to 'xbmc/pictures/PictureInfoLoader.cpp')
-rw-r--r-- | xbmc/pictures/PictureInfoLoader.cpp | 99 |
1 files changed, 99 insertions, 0 deletions
diff --git a/xbmc/pictures/PictureInfoLoader.cpp b/xbmc/pictures/PictureInfoLoader.cpp new file mode 100644 index 0000000..81b8cfa --- /dev/null +++ b/xbmc/pictures/PictureInfoLoader.cpp @@ -0,0 +1,99 @@ +/* + * Copyright (C) 2005-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 "PictureInfoLoader.h" + +#include "FileItem.h" +#include "PictureInfoTag.h" +#include "ServiceBroker.h" +#include "settings/Settings.h" +#include "settings/SettingsComponent.h" + +CPictureInfoLoader::CPictureInfoLoader() +{ + m_mapFileItems = new CFileItemList; + m_tagReads = 0; +} + +CPictureInfoLoader::~CPictureInfoLoader() +{ + StopThread(); + delete m_mapFileItems; +} + +void CPictureInfoLoader::OnLoaderStart() +{ + // Load previously cached items from HD + m_mapFileItems->SetPath(m_pVecItems->GetPath()); + m_mapFileItems->Load(); + m_mapFileItems->SetFastLookup(true); + + m_tagReads = 0; + m_loadTags = CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool(CSettings::SETTING_PICTURES_USETAGS); + + if (m_pProgressCallback) + m_pProgressCallback->SetProgressMax(m_pVecItems->GetFileCount()); +} + +bool CPictureInfoLoader::LoadItem(CFileItem* pItem) +{ + bool result = LoadItemCached(pItem); + result |= LoadItemLookup(pItem); + + return result; +} + +bool CPictureInfoLoader::LoadItemCached(CFileItem* pItem) +{ + if (!pItem->IsPicture() || pItem->IsZIP() || pItem->IsRAR() || pItem->IsCBR() || pItem->IsCBZ() || pItem->IsInternetStream() || pItem->IsVideo()) + return false; + + if (pItem->HasPictureInfoTag()) + return true; + + // Check the cached item + CFileItemPtr mapItem = (*m_mapFileItems)[pItem->GetPath()]; + if (mapItem && mapItem->m_dateTime==pItem->m_dateTime && mapItem->HasPictureInfoTag()) + { // Query map if we previously cached the file on HD + *pItem->GetPictureInfoTag() = *mapItem->GetPictureInfoTag(); + pItem->SetArt("thumb", mapItem->GetArt("thumb")); + return true; + } + + return true; +} + +bool CPictureInfoLoader::LoadItemLookup(CFileItem* pItem) +{ + if (m_pProgressCallback && !pItem->m_bIsFolder) + m_pProgressCallback->SetProgressAdvance(); + + if (!pItem->IsPicture() || pItem->IsZIP() || pItem->IsRAR() || pItem->IsCBR() || pItem->IsCBZ() || pItem->IsInternetStream() || pItem->IsVideo()) + return false; + + if (pItem->HasPictureInfoTag()) + return false; + + if (m_loadTags) + { // Nothing found, load tag from file + pItem->GetPictureInfoTag()->Load(pItem->GetPath()); + m_tagReads++; + } + + return true; +} + +void CPictureInfoLoader::OnLoaderFinish() +{ + // cleanup cache loaded from HD + m_mapFileItems->Clear(); + + // Save loaded items to HD + if (!m_bStop && m_tagReads > 0) + m_pVecItems->Save(); +} |