2 * Copyright (C) 2016-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
9 #include "MusicFileItemListModifier.h"
12 #include "FileItemList.h"
13 #include "ServiceBroker.h"
14 #include "filesystem/MusicDatabaseDirectory/DirectoryNode.h"
15 #include "guilib/LocalizeStrings.h"
16 #include "music/MusicDbUrl.h"
17 #include "music/MusicFileItemClassify.h"
18 #include "settings/AdvancedSettings.h"
19 #include "settings/Settings.h"
20 #include "settings/SettingsComponent.h"
25 using namespace XFILE::MUSICDATABASEDIRECTORY
;
27 bool CMusicFileItemListModifier::CanModify(const CFileItemList
&items
) const
29 if (MUSIC::IsMusicDb(items
))
35 bool CMusicFileItemListModifier::Modify(CFileItemList
&items
) const
37 AddQueuingFolder(items
);
41 // Add an "* All ..." folder to the CFileItemList
42 // depending on the child node
43 void CMusicFileItemListModifier::AddQueuingFolder(CFileItemList
& items
)
45 if (!MUSIC::IsMusicDb(items
))
48 auto directoryNode
= CDirectoryNode::ParseURL(items
.GetPath());
53 if (!musicUrl
.FromString(directoryNode
->BuildPath()))
56 // always show "all" items by default
57 if (!CServiceBroker::GetSettingsComponent()->GetSettings()->GetBool(CSettings::SETTING_MUSICLIBRARY_SHOWALLITEMS
))
60 // no need for "all" item when only one item
61 if (items
.GetObjectCount() <= 1)
64 auto nodeChildType
= directoryNode
->GetChildType();
66 // No need for "*all" when overview node and child node is "albums" or "artists"
67 // without options (hence all albums or artists unfiltered).
68 if (directoryNode
->GetType() == NODE_TYPE_OVERVIEW
&&
69 (nodeChildType
== NODE_TYPE_ARTIST
|| nodeChildType
== NODE_TYPE_ALBUM
) &&
70 musicUrl
.GetOptions().empty())
72 // Smart playlist rules on parent node do not get applied to child nodes so no "*all"
73 // ! @Todo: Remove this allowing "*all" once rules do get applied to child nodes.
74 if (directoryNode
->GetType() == NODE_TYPE_OVERVIEW
&&
75 (nodeChildType
== NODE_TYPE_ARTIST
|| nodeChildType
== NODE_TYPE_ALBUM
) &&
76 musicUrl
.HasOption("xsp"))
79 switch (nodeChildType
)
81 case NODE_TYPE_ARTIST
:
82 pItem
= std::make_shared
<CFileItem
>(g_localizeStrings
.Get(15103)); // "All Artists"
83 musicUrl
.AppendPath("-1/");
84 pItem
->SetPath(musicUrl
.ToString());
87 // All album related nodes
89 case NODE_TYPE_ALBUM_RECENTLY_PLAYED
:
90 case NODE_TYPE_ALBUM_RECENTLY_ADDED
:
91 case NODE_TYPE_ALBUM_TOP100
:
92 pItem
= std::make_shared
<CFileItem
>(g_localizeStrings
.Get(15102)); // "All Albums"
93 musicUrl
.AppendPath("-1/");
94 pItem
->SetPath(musicUrl
.ToString());
99 pItem
= std::make_shared
<CFileItem
>(g_localizeStrings
.Get(38075)); // "All Discs"
100 musicUrl
.AppendPath("-1/");
101 pItem
->SetPath(musicUrl
.ToString());
110 pItem
->m_bIsFolder
= true;
111 pItem
->SetSpecialSort(CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_bMusicLibraryAllItemsOnBottom
? SortSpecialOnBottom
: SortSpecialOnTop
);
112 pItem
->SetCanQueue(false);
113 pItem
->SetLabelPreformatted(true);
114 if (CServiceBroker::GetSettingsComponent()->GetAdvancedSettings()->m_bMusicLibraryAllItemsOnBottom
)
117 items
.AddFront(pItem
, (items
.Size() > 0 && items
[0]->IsParentFolder()) ? 1 : 0);