From d09bfe2818f3cec8aad54150ef959271ea5ccf2e Mon Sep 17 00:00:00 2001 From: montellese Date: Fri, 23 Nov 2012 17:54:40 +0100 Subject: [PATCH 1/3] smartplaylists: fix "is" and "isnot" operators for numerical values --- xbmc/playlists/SmartPlayList.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/xbmc/playlists/SmartPlayList.cpp b/xbmc/playlists/SmartPlayList.cpp index cf8f36e4a0624..e910d2ae0c264 100644 --- a/xbmc/playlists/SmartPlayList.cpp +++ b/xbmc/playlists/SmartPlayList.cpp @@ -693,9 +693,20 @@ CStdString CSmartPlaylistRule::GetWhereClause(const CDatabase &db, const CStdStr case OPERATOR_DOES_NOT_CONTAIN: negate = " NOT"; operatorString = " LIKE '%%%s%%'"; break; case OPERATOR_EQUALS: - operatorString = " LIKE '%s'"; break; + if (GetFieldType(m_field) == NUMERIC_FIELD || GetFieldType(m_field) == SECONDS_FIELD) + operatorString = " = %s"; + else + operatorString = " LIKE '%s'"; + break; case OPERATOR_DOES_NOT_EQUAL: - negate = " NOT"; operatorString = " LIKE '%s'"; break; + if (GetFieldType(m_field) == NUMERIC_FIELD || GetFieldType(m_field) == SECONDS_FIELD) + operatorString = " != %s"; + else + { + negate = " NOT"; + operatorString = " LIKE '%s'"; + } + break; case OPERATOR_STARTS_WITH: operatorString = " LIKE '%s%%'"; break; case OPERATOR_ENDS_WITH: From 12091af05b9b452c84b726ad8ba3191ceb49deb2 Mon Sep 17 00:00:00 2001 From: montellese Date: Fri, 23 Nov 2012 17:55:15 +0100 Subject: [PATCH 2/3] smartplaylists: fix playcount rule for tvshows (fixes #13596) --- xbmc/playlists/SmartPlayList.cpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/xbmc/playlists/SmartPlayList.cpp b/xbmc/playlists/SmartPlayList.cpp index e910d2ae0c264..ac39b456d31ad 100644 --- a/xbmc/playlists/SmartPlayList.cpp +++ b/xbmc/playlists/SmartPlayList.cpp @@ -902,6 +902,8 @@ CStdString CSmartPlaylistRule::GetWhereClause(const CDatabase &db, const CStdStr query = GetField(FieldId, strType) + negate + " IN (SELECT idShow FROM tvshowview WHERE " + GetField(m_field, strType) + parameter + ")"; else if ((m_field == FieldLastPlayed || m_field == FieldDateAdded) && (m_operator == OPERATOR_LESS_THAN || m_operator == OPERATOR_BEFORE || m_operator == OPERATOR_NOT_IN_THE_LAST)) query = GetField(m_field, strType) + " IS NULL OR " + GetField(m_field, strType) + parameter; + else if (m_field == FieldPlaycount) + query = "CASE WHEN COALESCE(" + GetField(FieldNumberOfEpisodes, strType) + " - " + GetField(FieldNumberOfWatchedEpisodes, strType) + ", 0) > 0 THEN 0 ELSE 1 END " + parameter; } else if (strType == "episodes") { @@ -936,7 +938,7 @@ CStdString CSmartPlaylistRule::GetWhereClause(const CDatabase &db, const CStdStr query = table + ".idFile" + negate + " IN (SELECT DISTINCT idFile FROM streamdetails WHERE strSubtitleLanguage " + parameter + ")"; else if (m_field == FieldVideoAspectRatio) query = table + ".idFile" + negate + " IN (SELECT DISTINCT idFile FROM streamdetails WHERE fVideoAspect " + parameter + ")"; - if (m_field == FieldPlaycount && strType != "songs" && strType != "albums") + if (m_field == FieldPlaycount && strType != "songs" && strType != "albums" && strType != "tvshows") { // playcount IS stored as NULL OR number IN video db if ((m_operator == OPERATOR_EQUALS && it->Equals("0")) || (m_operator == OPERATOR_DOES_NOT_EQUAL && !it->Equals("0")) || From b8d3e4eb6a5423143ebdc6eea8c106a506307205 Mon Sep 17 00:00:00 2001 From: montellese Date: Sat, 24 Nov 2012 13:39:39 +0100 Subject: [PATCH 3/3] smartplaylist: add "watched episode count" string for tvshows --- language/English/strings.po | 6 +++++- xbmc/playlists/SmartPlayList.cpp | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/language/English/strings.po b/language/English/strings.po index ead5a13a4bf87..30e9815a28bff 100644 --- a/language/English/strings.po +++ b/language/English/strings.po @@ -9702,7 +9702,11 @@ msgctxt "#21456" msgid "External storage" msgstr "" -#empty strings from id 21457 to 21459 +msgctxt "#21457" +msgid "Watched episode count" +msgstr "" + +#empty strings from id 21458 to 21459 msgctxt "#21460" msgid "Subtitle location" diff --git a/xbmc/playlists/SmartPlayList.cpp b/xbmc/playlists/SmartPlayList.cpp index ac39b456d31ad..aad7c683f470e 100644 --- a/xbmc/playlists/SmartPlayList.cpp +++ b/xbmc/playlists/SmartPlayList.cpp @@ -91,7 +91,7 @@ static const translateField fields[] = { { "season", FieldSeason, SortBySeason, CSmartPlaylistRule::NUMERIC_FIELD, 20373 }, { "episode", FieldEpisodeNumber, SortByEpisodeNumber, CSmartPlaylistRule::NUMERIC_FIELD, 20359 }, { "numepisodes", FieldNumberOfEpisodes, SortByNumberOfEpisodes, CSmartPlaylistRule::NUMERIC_FIELD, 20360 }, - { "numwatched", FieldNumberOfWatchedEpisodes, SortByNumberOfWatchedEpisodes, CSmartPlaylistRule::NUMERIC_FIELD, 21441 }, + { "numwatched", FieldNumberOfWatchedEpisodes, SortByNumberOfWatchedEpisodes, CSmartPlaylistRule::NUMERIC_FIELD, 21457 }, { "videoresolution", FieldVideoResolution, SortByVideoResolution, CSmartPlaylistRule::NUMERIC_FIELD, 21443 }, { "videocodec", FieldVideoCodec, SortByVideoCodec, CSmartPlaylistRule::TEXTIN_FIELD, 21445 }, { "videoaspect", FieldVideoAspectRatio, SortByVideoAspectRatio, CSmartPlaylistRule::NUMERIC_FIELD, 21374 },