2 * Copyright (C) 2005-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.
11 #include "dbwrappers/DatabaseQuery.h"
12 #include "utils/SortUtils.h"
13 #include "utils/XBMCTinyXML.h"
19 class CGUIDialogSmartPlaylistEditor
;
20 class CGUIDialogMediaFilter
;
24 namespace KODI::PLAYLIST
27 class CSmartPlaylistRule
: public CDatabaseQueryRule
31 ~CSmartPlaylistRule() override
= default;
33 std::string
GetLocalizedRule() const;
35 static SortBy
TranslateOrder(const char *order
);
36 static std::string
TranslateOrder(SortBy order
);
37 static Field
TranslateGroup(const char *group
);
38 static std::string
TranslateGroup(Field group
);
40 static std::string
GetLocalizedField(int field
);
41 static std::string
GetLocalizedGroup(Field group
);
42 static bool CanGroupMix(Field group
);
44 static std::vector
<Field
> GetFields(const std::string
&type
);
45 static std::vector
<SortBy
> GetOrders(const std::string
&type
);
46 static std::vector
<Field
> GetGroups(const std::string
&type
);
47 FIELD_TYPE
GetFieldType(int field
) const override
;
48 static bool IsFieldBrowseable(int field
);
50 static bool Validate(const std::string
&input
, void *data
);
51 static bool ValidateRating(const std::string
&input
, void *data
);
52 static bool ValidateMyRating(const std::string
&input
, void *data
);
55 std::string
GetField(int field
, const std::string
& type
) const override
;
56 int TranslateField(const char *field
) const override
;
57 std::string
TranslateField(int field
) const override
;
58 std::string
FormatParameter(const std::string
&negate
,
59 const std::string
&oper
,
61 const std::string
&type
) const override
;
62 std::string
FormatWhereClause(const std::string
&negate
,
63 const std::string
& oper
,
64 const std::string
¶m
,
66 const std::string
&type
) const override
;
67 SEARCH_OPERATOR
GetOperator(const std::string
&type
) const override
;
68 std::string
GetBooleanQuery(const std::string
&negate
,
69 const std::string
&strType
) const override
;
72 std::string
GetVideoResolutionQuery(const std::string
¶meter
) const;
73 static std::string
FormatLinkQuery(const char* field
,
75 const MediaType
& mediaType
,
76 const std::string
& mediaField
,
77 const std::string
& parameter
);
78 std::string
FormatYearQuery(const std::string
& field
,
79 const std::string
& param
,
80 const std::string
& parameter
) const;
83 class CSmartPlaylistRuleCombination
: public CDatabaseQueryRuleCombination
86 CSmartPlaylistRuleCombination() = default;
87 ~CSmartPlaylistRuleCombination() override
= default;
89 std::string
GetWhereClause(const CDatabase
&db
,
90 const std::string
& strType
,
91 std::set
<std::string
> &referencedPlaylists
) const;
92 void GetVirtualFolders(const std::string
& strType
,
93 std::vector
<std::string
> &virtualFolders
) const;
95 void AddRule(const CSmartPlaylistRule
&rule
);
98 class CSmartPlaylist
: public IDatabaseQueryRuleFactory
102 ~CSmartPlaylist() override
= default;
104 bool Load(const CURL
& url
);
105 bool Load(const std::string
&path
);
106 bool Load(const CVariant
&obj
);
107 bool LoadFromXml(const std::string
&xml
);
108 bool LoadFromJson(const std::string
&json
);
109 bool Save(const std::string
&path
) const;
110 bool Save(CVariant
&obj
, bool full
= true) const;
111 bool SaveAsJson(std::string
&json
, bool full
= true) const;
113 bool OpenAndReadName(const CURL
&url
);
114 bool LoadFromXML(const TiXmlNode
*root
, const std::string
&encoding
= "UTF-8");
118 void SetName(const std::string
&name
);
119 void SetType(const std::string
&type
); // music, video, mixed
120 const std::string
& GetName() const { return m_playlistName
; }
121 const std::string
& GetType() const { return m_playlistType
; }
122 bool IsVideoType() const;
123 bool IsMusicType() const;
125 void SetMatchAllRules(bool matchAll
)
127 m_ruleCombination
.SetType(matchAll
? CSmartPlaylistRuleCombination::CombinationAnd
128 : CSmartPlaylistRuleCombination::CombinationOr
);
131 bool GetMatchAllRules() const
133 return m_ruleCombination
.GetType() == CSmartPlaylistRuleCombination::CombinationAnd
;
136 void SetLimit(unsigned int limit
) { m_limit
= limit
; }
137 unsigned int GetLimit() const { return m_limit
; }
139 void SetOrder(SortBy order
) { m_orderField
= order
; }
140 SortBy
GetOrder() const { return m_orderField
; }
141 void SetOrderAscending(bool orderAscending
)
143 m_orderDirection
= orderAscending
? SortOrderAscending
: SortOrderDescending
;
145 bool GetOrderAscending() const { return m_orderDirection
!= SortOrderDescending
; }
146 SortOrder
GetOrderDirection() const { return m_orderDirection
; }
147 void SetOrderAttributes(SortAttribute attributes
) { m_orderAttributes
= attributes
; }
148 SortAttribute
GetOrderAttributes() const { return m_orderAttributes
; }
150 void SetGroup(const std::string
&group
) { m_group
= group
; }
151 const std::string
& GetGroup() const { return m_group
; }
152 void SetGroupMixed(bool mixed
) { m_groupMixed
= mixed
; }
153 bool IsGroupMixed() const { return m_groupMixed
; }
155 /*! \brief get the where clause for a playlist
156 We handle playlists inside playlists separately in order to ensure we don't introduce infinite loops
157 by playlist A including playlist B which also (perhaps via other playlists) then includes playlistA.
159 \param db the database to use to format up results
160 \param referencedPlaylists a set of playlists to know when we reach a cycle
161 \param needWhere whether we need to prepend the where clause with "WHERE "
163 std::string
GetWhereClause(const CDatabase
&db
, std::set
<std::string
> &referencedPlaylists
) const;
164 void GetVirtualFolders(std::vector
<std::string
> &virtualFolders
) const;
166 std::string
GetSaveLocation() const;
168 static void GetAvailableFields(const std::string
&type
, std::vector
<std::string
> &fieldList
);
170 static bool IsVideoType(const std::string
&type
);
171 static bool IsMusicType(const std::string
&type
);
172 static bool CheckTypeCompatibility(const std::string
&typeLeft
, const std::string
&typeRight
);
174 bool IsEmpty(bool ignoreSortAndLimit
= true) const;
177 CDatabaseQueryRule
*CreateRule() const override
;
178 CDatabaseQueryRuleCombination
*CreateCombination() const override
;
181 friend class ::CGUIDialogSmartPlaylistEditor
;
182 friend class ::CGUIDialogMediaFilter
;
184 const TiXmlNode
* readName(const TiXmlNode
*root
);
185 const TiXmlNode
* readNameFromPath(const CURL
&url
);
186 const TiXmlNode
* readNameFromXml(const std::string
&xml
);
187 bool load(const TiXmlNode
*root
);
189 CSmartPlaylistRuleCombination m_ruleCombination
;
190 std::string m_playlistName
;
191 std::string m_playlistType
;
194 unsigned int m_limit
;
196 SortOrder m_orderDirection
;
197 SortAttribute m_orderAttributes
;
201 CXBMCTinyXML m_xmlDoc
;
204 } // namespace KODI::PLAYLIST