aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArne Morten Kvarving <spiff@kodi.tv>2024-06-30 18:31:59 +0200
committerGitHub <noreply@github.com>2024-06-30 18:31:59 +0200
commitd17ccd8ed22c9054ce60e771a2527f683bd28714 (patch)
tree84572582d5133d9d4cdb3a161272f1f85db228ac
parent1f63487e5b1c9049edf017c8d20789d270d013ab (diff)
parentd3f3373dc9b430dc3e81c7caeed42c5c344b1731 (diff)
Merge pull request #25387 from notspiff/add_artutils
changed: move CFileItem::GetTBNFile to ArtUtils
-rw-r--r--xbmc/FileItem.cpp54
-rw-r--r--xbmc/FileItem.h2
-rw-r--r--xbmc/ThumbLoader.cpp5
-rw-r--r--xbmc/utils/ArtUtils.cpp69
-rw-r--r--xbmc/utils/ArtUtils.h21
-rw-r--r--xbmc/utils/CMakeLists.txt2
-rw-r--r--xbmc/utils/test/CMakeLists.txt1
-rw-r--r--xbmc/utils/test/TestArtUtils.cpp63
-rw-r--r--xbmc/video/VideoDatabase.cpp7
9 files changed, 168 insertions, 56 deletions
diff --git a/xbmc/FileItem.cpp b/xbmc/FileItem.cpp
index 98360446a3..5065b51c46 100644
--- a/xbmc/FileItem.cpp
+++ b/xbmc/FileItem.cpp
@@ -52,6 +52,7 @@
#include "settings/SettingsComponent.h"
#include "settings/lib/Setting.h"
#include "utils/Archive.h"
+#include "utils/ArtUtils.h"
#include "utils/FileExtensionProvider.h"
#include "utils/Mime.h"
#include "utils/RegExp.h"
@@ -1926,7 +1927,7 @@ std::string CFileItem::GetUserMusicThumb(bool alwaysCheckRemote /* = false */, b
return "";
// we first check for <filename>.tbn or <foldername>.tbn
- std::string fileThumb(GetTBNFile());
+ std::string fileThumb(ART::GetTBNFile(*this));
if (CFile::Exists(fileThumb))
return fileThumb;
@@ -1984,53 +1985,6 @@ std::string CFileItem::GetUserMusicThumb(bool alwaysCheckRemote /* = false */, b
return "";
}
-// Gets the .tbn filename from a file or folder name.
-// <filename>.ext -> <filename>.tbn
-// <foldername>/ -> <foldername>.tbn
-std::string CFileItem::GetTBNFile() const
-{
- std::string thumbFile;
- std::string strFile = m_strPath;
-
- if (IsStack())
- {
- std::string strPath, strReturn;
- URIUtils::GetParentPath(m_strPath,strPath);
- CFileItem item(CStackDirectory::GetFirstStackedFile(strFile),false);
- std::string strTBNFile = item.GetTBNFile();
- strReturn = URIUtils::AddFileToFolder(strPath, URIUtils::GetFileName(strTBNFile));
- if (CFile::Exists(strReturn))
- return strReturn;
-
- strFile = URIUtils::AddFileToFolder(strPath,URIUtils::GetFileName(CStackDirectory::GetStackedTitlePath(strFile)));
- }
-
- if (URIUtils::IsInRAR(strFile) || URIUtils::IsInZIP(strFile))
- {
- std::string strPath = URIUtils::GetDirectory(strFile);
- std::string strParent;
- URIUtils::GetParentPath(strPath,strParent);
- strFile = URIUtils::AddFileToFolder(strParent, URIUtils::GetFileName(m_strPath));
- }
-
- CURL url(strFile);
- strFile = url.GetFileName();
-
- if (m_bIsFolder && !IsFileFolder())
- URIUtils::RemoveSlashAtEnd(strFile);
-
- if (!strFile.empty())
- {
- if (m_bIsFolder && !IsFileFolder())
- thumbFile = strFile + ".tbn"; // folder, so just add ".tbn"
- else
- thumbFile = URIUtils::ReplaceExtension(strFile, ".tbn");
- url.SetFileName(thumbFile);
- thumbFile = url.Get();
- }
- return thumbFile;
-}
-
bool CFileItem::SkipLocalArt() const
{
return (m_strPath.empty() || StringUtils::StartsWithNoCase(m_strPath, "newsmartplaylist://") ||
@@ -2257,7 +2211,7 @@ std::string CFileItem::GetLocalFanart() const
strPath2 = dir.GetStackedTitlePath(strFile);
strFile = URIUtils::AddFileToFolder(strPath, URIUtils::GetFileName(strPath2));
CFileItem item(dir.GetFirstStackedFile(m_strPath),false);
- std::string strTBNFile(URIUtils::ReplaceExtension(item.GetTBNFile(), "-fanart"));
+ std::string strTBNFile(URIUtils::ReplaceExtension(ART::GetTBNFile(item), "-fanart"));
strFile2 = URIUtils::AddFileToFolder(strPath, URIUtils::GetFileName(strTBNFile));
}
if (URIUtils::IsInRAR(strFile) || URIUtils::IsInZIP(strFile))
@@ -2663,7 +2617,7 @@ std::string CFileItem::FindTrailer() const
strPath2 = dir.GetStackedTitlePath(strFile);
strFile = URIUtils::AddFileToFolder(strPath,URIUtils::GetFileName(strPath2));
CFileItem item(dir.GetFirstStackedFile(m_strPath),false);
- std::string strTBNFile(URIUtils::ReplaceExtension(item.GetTBNFile(), "-trailer"));
+ std::string strTBNFile(URIUtils::ReplaceExtension(ART::GetTBNFile(item), "-trailer"));
strFile2 = URIUtils::AddFileToFolder(strPath,URIUtils::GetFileName(strTBNFile));
}
if (URIUtils::IsInRAR(strFile) || URIUtils::IsInZIP(strFile))
diff --git a/xbmc/FileItem.h b/xbmc/FileItem.h
index 2023c2e43e..140d130f48 100644
--- a/xbmc/FileItem.h
+++ b/xbmc/FileItem.h
@@ -443,8 +443,6 @@ public:
*/
std::string GetThumbHideIfUnwatched(const CFileItem* item) const;
- // Gets the .tbn file associated with this item
- std::string GetTBNFile() const;
// Gets the folder image associated with this item (defaults to folder.jpg)
std::string GetFolderThumb(const std::string &folderJPG = "folder.jpg") const;
// Gets the correct movie title
diff --git a/xbmc/ThumbLoader.cpp b/xbmc/ThumbLoader.cpp
index 3e1508cc49..40db919d52 100644
--- a/xbmc/ThumbLoader.cpp
+++ b/xbmc/ThumbLoader.cpp
@@ -11,8 +11,11 @@
#include "FileItem.h"
#include "ServiceBroker.h"
#include "TextureCache.h"
+#include "utils/ArtUtils.h"
#include "utils/FileUtils.h"
+using namespace KODI;
+
CThumbLoader::CThumbLoader() :
CBackgroundInfoLoader()
{
@@ -117,7 +120,7 @@ std::string CProgramThumbLoader::GetLocalThumb(const CFileItem &item)
}
else
{
- std::string fileThumb(item.GetTBNFile());
+ std::string fileThumb(ART::GetTBNFile(item));
if (CFileUtils::Exists(fileThumb))
return fileThumb;
}
diff --git a/xbmc/utils/ArtUtils.cpp b/xbmc/utils/ArtUtils.cpp
new file mode 100644
index 0000000000..c76192956e
--- /dev/null
+++ b/xbmc/utils/ArtUtils.cpp
@@ -0,0 +1,69 @@
+/*
+ * Copyright (C) 2024 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 "ArtUtils.h"
+
+#include "FileItem.h"
+#include "filesystem/File.h"
+#include "filesystem/StackDirectory.h"
+#include "utils/URIUtils.h"
+
+using namespace XFILE;
+
+namespace KODI::ART
+{
+
+// Gets the .tbn filename from a file or folder name.
+// <filename>.ext -> <filename>.tbn
+// <foldername>/ -> <foldername>.tbn
+std::string GetTBNFile(const CFileItem& item)
+{
+ std::string thumbFile;
+ std::string file = item.GetPath();
+
+ if (item.IsStack())
+ {
+ std::string path, returnPath;
+ URIUtils::GetParentPath(item.GetPath(), path);
+ CFileItem item(CStackDirectory::GetFirstStackedFile(file), false);
+ const std::string TBNFile = GetTBNFile(item);
+ returnPath = URIUtils::AddFileToFolder(path, URIUtils::GetFileName(TBNFile));
+ if (CFile::Exists(returnPath))
+ return returnPath;
+
+ const std::string& stackPath = CStackDirectory::GetStackedTitlePath(file);
+ file = URIUtils::AddFileToFolder(path, URIUtils::GetFileName(stackPath));
+ }
+
+ if (URIUtils::IsInRAR(file) || URIUtils::IsInZIP(file))
+ {
+ const std::string path = URIUtils::GetDirectory(file);
+ std::string parent;
+ URIUtils::GetParentPath(path, parent);
+ file = URIUtils::AddFileToFolder(parent, URIUtils::GetFileName(item.GetPath()));
+ }
+
+ CURL url(file);
+ file = url.GetFileName();
+
+ if (item.m_bIsFolder && !item.IsFileFolder())
+ URIUtils::RemoveSlashAtEnd(file);
+
+ if (!file.empty())
+ {
+ if (item.m_bIsFolder && !item.IsFileFolder())
+ thumbFile = file + ".tbn"; // folder, so just add ".tbn"
+ else
+ thumbFile = URIUtils::ReplaceExtension(file, ".tbn");
+ url.SetFileName(thumbFile);
+ thumbFile = url.Get();
+ }
+ return thumbFile;
+}
+
+} // namespace KODI::ART
diff --git a/xbmc/utils/ArtUtils.h b/xbmc/utils/ArtUtils.h
new file mode 100644
index 0000000000..b2ae688206
--- /dev/null
+++ b/xbmc/utils/ArtUtils.h
@@ -0,0 +1,21 @@
+/*
+ * Copyright (C) 2024 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.
+ */
+
+#pragma once
+
+#include <string>
+
+class CFileItem;
+
+namespace KODI::ART
+{
+
+// Gets the .tbn file associated with an item
+std::string GetTBNFile(const CFileItem& item);
+
+} // namespace KODI::ART
diff --git a/xbmc/utils/CMakeLists.txt b/xbmc/utils/CMakeLists.txt
index 13dbe058a9..7379405cd5 100644
--- a/xbmc/utils/CMakeLists.txt
+++ b/xbmc/utils/CMakeLists.txt
@@ -2,6 +2,7 @@ set(SOURCES ActorProtocol.cpp
AlarmClock.cpp
AliasShortcutUtils.cpp
Archive.cpp
+ ArtUtils.cpp
Base64.cpp
BitstreamConverter.cpp
BitstreamReader.cpp
@@ -82,6 +83,7 @@ set(HEADERS ActorProtocol.h
AlarmClock.h
AliasShortcutUtils.h
Archive.h
+ ArtUtils.h
Base64.h
BitstreamConverter.h
BitstreamReader.h
diff --git a/xbmc/utils/test/CMakeLists.txt b/xbmc/utils/test/CMakeLists.txt
index 3cdc5d6448..99bd4faaf7 100644
--- a/xbmc/utils/test/CMakeLists.txt
+++ b/xbmc/utils/test/CMakeLists.txt
@@ -1,6 +1,7 @@
set(SOURCES TestAlarmClock.cpp
TestAliasShortcutUtils.cpp
TestArchive.cpp
+ TestArtUtils.cpp
TestBase64.cpp
TestBitstreamStats.cpp
TestCharsetConverter.cpp
diff --git a/xbmc/utils/test/TestArtUtils.cpp b/xbmc/utils/test/TestArtUtils.cpp
new file mode 100644
index 0000000000..92770435ec
--- /dev/null
+++ b/xbmc/utils/test/TestArtUtils.cpp
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) 2024 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 "FileItem.h"
+#include "platform/Filesystem.h"
+#include "utils/ArtUtils.h"
+#include "utils/FileUtils.h"
+#include "utils/URIUtils.h"
+
+#include <array>
+#include <fstream>
+
+#include <fmt/format.h>
+#include <gtest/gtest.h>
+
+using namespace KODI;
+
+struct TbnTest
+{
+ std::string path;
+ std::string result;
+ bool isFolder = false;
+};
+
+class GetTbnTest : public testing::WithParamInterface<TbnTest>, public testing::Test
+{
+};
+
+TEST_P(GetTbnTest, TbnTest)
+{
+ EXPECT_EQ(ART::GetTBNFile(CFileItem(GetParam().path, GetParam().isFolder)), GetParam().result);
+}
+
+const auto tbn_tests = std::array{
+ TbnTest{"/home/user/video.avi", "/home/user/video.tbn"},
+ TbnTest{"/home/user/video/", "/home/user/video.tbn", true},
+ TbnTest{"/home/user/bar.xbt", "/home/user/bar.tbn", true},
+ TbnTest{"zip://%2fhome%2fuser%2fbar.zip/foo.avi", "/home/user/foo.tbn"},
+ TbnTest{"stack:///home/user/foo-cd1.avi , /home/user/foo-cd2.avi", "/home/user/foo.tbn"}};
+
+INSTANTIATE_TEST_SUITE_P(TestArtUtils, GetTbnTest, testing::ValuesIn(tbn_tests));
+
+TEST(TestArtUtils, GetTbnStack)
+{
+ std::error_code ec;
+ auto path = KODI::PLATFORM::FILESYSTEM::temp_directory_path(ec);
+ ASSERT_TRUE(!ec);
+ const auto file_path = URIUtils::AddFileToFolder(path, "foo-cd1.tbn");
+ {
+ std::ofstream of(file_path, std::ios::out);
+ }
+ const std::string stackPath =
+ fmt::format("stack://{} , {}", URIUtils::AddFileToFolder(path, "foo-cd1.avi"),
+ URIUtils::AddFileToFolder(path, "foo-cd2.avi"));
+ CFileItem item(stackPath, false);
+ EXPECT_EQ(ART::GetTBNFile(item), file_path);
+ CFileUtils::DeleteItem(file_path);
+}
diff --git a/xbmc/video/VideoDatabase.cpp b/xbmc/video/VideoDatabase.cpp
index 1e9cf8993f..686dbbbe3d 100644
--- a/xbmc/video/VideoDatabase.cpp
+++ b/xbmc/video/VideoDatabase.cpp
@@ -44,6 +44,7 @@
#include "settings/Settings.h"
#include "settings/SettingsComponent.h"
#include "storage/MediaManager.h"
+#include "utils/ArtUtils.h"
#include "utils/FileUtils.h"
#include "utils/GroupUtils.h"
#include "utils/LabelFormatter.h"
@@ -10710,7 +10711,7 @@ void CVideoDatabase::ExportToXML(const std::string &path, bool singleFile /* = t
}
else
{
- std::string nfoFile(URIUtils::ReplaceExtension(item.GetTBNFile(), ".nfo"));
+ std::string nfoFile(URIUtils::ReplaceExtension(ART::GetTBNFile(item), ".nfo"));
if (item.IsOpticalMediaFile())
{
@@ -10863,7 +10864,7 @@ void CVideoDatabase::ExportToXML(const std::string &path, bool singleFile /* = t
}
else
{
- std::string nfoFile(URIUtils::ReplaceExtension(item.GetTBNFile(), ".nfo"));
+ std::string nfoFile(URIUtils::ReplaceExtension(ART::GetTBNFile(item), ".nfo"));
if (overwrite || !CFile::Exists(nfoFile, false))
{
@@ -11064,7 +11065,7 @@ void CVideoDatabase::ExportToXML(const std::string &path, bool singleFile /* = t
}
else
{
- std::string nfoFile(URIUtils::ReplaceExtension(item.GetTBNFile(), ".nfo"));
+ std::string nfoFile(URIUtils::ReplaceExtension(ART::GetTBNFile(item), ".nfo"));
if (overwrite || !CFile::Exists(nfoFile, false))
{