Add play count filter
This commit is contained in:
+34
@@ -56,6 +56,8 @@ public class RandomPlayQueueController extends ParameterizableViewController {
|
|||||||
Integer toYear = null;
|
Integer toYear = null;
|
||||||
Integer minAlbumRating = null;
|
Integer minAlbumRating = null;
|
||||||
Integer maxAlbumRating = null;
|
Integer maxAlbumRating = null;
|
||||||
|
Integer minPlayCount = null;
|
||||||
|
Integer maxPlayCount = null;
|
||||||
Date minLastPlayedDate = null;
|
Date minLastPlayedDate = null;
|
||||||
Date maxLastPlayedDate = null;
|
Date maxLastPlayedDate = null;
|
||||||
boolean doesShowStarredSongs = false;
|
boolean doesShowStarredSongs = false;
|
||||||
@@ -159,6 +161,36 @@ public class RandomPlayQueueController extends ParameterizableViewController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Handle the play count filter
|
||||||
|
Integer playCountValue = null;
|
||||||
|
try { playCountValue = Integer.parseInt(request.getParameter("playCountValue")); }
|
||||||
|
catch (NumberFormatException e) { }
|
||||||
|
String playCountComp = request.getParameter("playCountComp");
|
||||||
|
if (playCountValue != null) {
|
||||||
|
switch (playCountComp) {
|
||||||
|
case "lt":
|
||||||
|
minPlayCount = null;
|
||||||
|
maxPlayCount = playCountValue - 1;
|
||||||
|
break;
|
||||||
|
case "gt":
|
||||||
|
minPlayCount = playCountValue + 1;
|
||||||
|
maxPlayCount = null;
|
||||||
|
break;
|
||||||
|
case "le":
|
||||||
|
minPlayCount = null;
|
||||||
|
maxPlayCount = playCountValue;
|
||||||
|
break;
|
||||||
|
case "ge":
|
||||||
|
minPlayCount = playCountValue;
|
||||||
|
maxPlayCount = null;
|
||||||
|
break;
|
||||||
|
case "eq":
|
||||||
|
minPlayCount = playCountValue;
|
||||||
|
maxPlayCount = playCountValue;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Handle the format filter
|
// Handle the format filter
|
||||||
String format = request.getParameter("format");
|
String format = request.getParameter("format");
|
||||||
if (StringUtils.equalsIgnoreCase(format, "any")) format = null;
|
if (StringUtils.equalsIgnoreCase(format, "any")) format = null;
|
||||||
@@ -180,6 +212,8 @@ public class RandomPlayQueueController extends ParameterizableViewController {
|
|||||||
maxLastPlayedDate,
|
maxLastPlayedDate,
|
||||||
minAlbumRating,
|
minAlbumRating,
|
||||||
maxAlbumRating,
|
maxAlbumRating,
|
||||||
|
minPlayCount,
|
||||||
|
maxPlayCount,
|
||||||
doesShowStarredSongs,
|
doesShowStarredSongs,
|
||||||
doesShowUnstarredSongs,
|
doesShowUnstarredSongs,
|
||||||
format
|
format
|
||||||
|
|||||||
@@ -498,6 +498,8 @@ public class MediaFileDao extends AbstractDao {
|
|||||||
put("maxLastPlayed", criteria.getMaxLastPlayedDate());
|
put("maxLastPlayed", criteria.getMaxLastPlayedDate());
|
||||||
put("minAlbumRating", criteria.getMinAlbumRating());
|
put("minAlbumRating", criteria.getMinAlbumRating());
|
||||||
put("maxAlbumRating", criteria.getMaxAlbumRating());
|
put("maxAlbumRating", criteria.getMaxAlbumRating());
|
||||||
|
put("minPlayCount", criteria.getMinPlayCount());
|
||||||
|
put("maxPlayCount", criteria.getMaxPlayCount());
|
||||||
put("starred", criteria.isShowStarredSongs());
|
put("starred", criteria.isShowStarredSongs());
|
||||||
put("unstarred", criteria.isShowUnstarredSongs());
|
put("unstarred", criteria.isShowUnstarredSongs());
|
||||||
put("format", criteria.getFormat());
|
put("format", criteria.getFormat());
|
||||||
@@ -563,6 +565,18 @@ public class MediaFileDao extends AbstractDao {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (criteria.getMinPlayCount() != null) {
|
||||||
|
query += " and media_file.play_count >= :minPlayCount";
|
||||||
|
}
|
||||||
|
|
||||||
|
if (criteria.getMaxPlayCount() != null) {
|
||||||
|
if (criteria.getMinPlayCount() == null) {
|
||||||
|
query += " and (media_file.play_count is null or media_file.play_count <= :maxPlayCount)";
|
||||||
|
} else {
|
||||||
|
query += " and media_file.play_count <= :maxPlayCount";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (criteria.isShowStarredSongs() && !criteria.isShowUnstarredSongs()) {
|
if (criteria.isShowStarredSongs() && !criteria.isShowUnstarredSongs()) {
|
||||||
query += " and starred_media_file.id is not null";
|
query += " and starred_media_file.id is not null";
|
||||||
}
|
}
|
||||||
|
|||||||
+17
-1
@@ -39,6 +39,8 @@ public class RandomSearchCriteria {
|
|||||||
private final Date maxLastPlayedDate;
|
private final Date maxLastPlayedDate;
|
||||||
private final Integer minAlbumRating;
|
private final Integer minAlbumRating;
|
||||||
private final Integer maxAlbumRating;
|
private final Integer maxAlbumRating;
|
||||||
|
private final Integer minPlayCount;
|
||||||
|
private final Integer maxPlayCount;
|
||||||
private final boolean showStarredSongs;
|
private final boolean showStarredSongs;
|
||||||
private final boolean showUnstarredSongs;
|
private final boolean showUnstarredSongs;
|
||||||
private final String format;
|
private final String format;
|
||||||
@@ -55,7 +57,7 @@ public class RandomSearchCriteria {
|
|||||||
public RandomSearchCriteria(int count, String genre, Integer fromYear, Integer toYear, List<MusicFolder> musicFolders) {
|
public RandomSearchCriteria(int count, String genre, Integer fromYear, Integer toYear, List<MusicFolder> musicFolders) {
|
||||||
this(
|
this(
|
||||||
count, genre, fromYear, toYear, musicFolders,
|
count, genre, fromYear, toYear, musicFolders,
|
||||||
null, null, null, null, true, true, null
|
null, null, null, null, null, null, true, true, null
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,6 +73,8 @@ public class RandomSearchCriteria {
|
|||||||
* @param maxLastPlayedDate Only return songs last played before this date. May be <code>null</code>.
|
* @param maxLastPlayedDate Only return songs last played before this date. May be <code>null</code>.
|
||||||
* @param minAlbumRating Only return songs rated more or equalt to this value. May be <code>null</code>.
|
* @param minAlbumRating Only return songs rated more or equalt to this value. May be <code>null</code>.
|
||||||
* @param maxAlbumRating Only return songs rated less or equal to this value. May be <code>null</code>.
|
* @param maxAlbumRating Only return songs rated less or equal to this value. May be <code>null</code>.
|
||||||
|
* @param minPlayCount Only return songs whose play count is more or equal to this value. May be <code>null</code>.
|
||||||
|
* @param maxPlayCount Only return songs whose play count is less or equal to this value. May be <code>null</code>.
|
||||||
* @param showStarredSongs Show starred songs. May NOT be <code>null</code>.
|
* @param showStarredSongs Show starred songs. May NOT be <code>null</code>.
|
||||||
* @param showUnstarredSongs Show unstarred songs. May NOT be <code>null</code>.
|
* @param showUnstarredSongs Show unstarred songs. May NOT be <code>null</code>.
|
||||||
* @param format Only return songs whose file format is equal to this value. May be <code>null</code>.
|
* @param format Only return songs whose file format is equal to this value. May be <code>null</code>.
|
||||||
@@ -85,6 +89,8 @@ public class RandomSearchCriteria {
|
|||||||
Date maxLastPlayedDate,
|
Date maxLastPlayedDate,
|
||||||
Integer minAlbumRating,
|
Integer minAlbumRating,
|
||||||
Integer maxAlbumRating,
|
Integer maxAlbumRating,
|
||||||
|
Integer minPlayCount,
|
||||||
|
Integer maxPlayCount,
|
||||||
boolean showStarredSongs,
|
boolean showStarredSongs,
|
||||||
boolean showUnstarredSongs,
|
boolean showUnstarredSongs,
|
||||||
String format
|
String format
|
||||||
@@ -99,6 +105,8 @@ public class RandomSearchCriteria {
|
|||||||
this.maxLastPlayedDate = maxLastPlayedDate;
|
this.maxLastPlayedDate = maxLastPlayedDate;
|
||||||
this.minAlbumRating = minAlbumRating;
|
this.minAlbumRating = minAlbumRating;
|
||||||
this.maxAlbumRating = maxAlbumRating;
|
this.maxAlbumRating = maxAlbumRating;
|
||||||
|
this.minPlayCount = minPlayCount;
|
||||||
|
this.maxPlayCount = maxPlayCount;
|
||||||
this.showStarredSongs = showStarredSongs;
|
this.showStarredSongs = showStarredSongs;
|
||||||
this.showUnstarredSongs = showUnstarredSongs;
|
this.showUnstarredSongs = showUnstarredSongs;
|
||||||
this.format = format;
|
this.format = format;
|
||||||
@@ -151,4 +159,12 @@ public class RandomSearchCriteria {
|
|||||||
public String getFormat() {
|
public String getFormat() {
|
||||||
return format;
|
return format;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Integer getMinPlayCount() {
|
||||||
|
return minPlayCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Integer getMaxPlayCount() {
|
||||||
|
return maxPlayCount;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-3
@@ -233,11 +233,9 @@ more.random.text = Shuffle play
|
|||||||
more.random.songs = {0} songs
|
more.random.songs = {0} songs
|
||||||
more.random.auto = Play more random songs when end of play queue is reached.
|
more.random.auto = Play more random songs when end of play queue is reached.
|
||||||
more.random.ok = OK
|
more.random.ok = OK
|
||||||
more.random.add = Add to current playlist
|
more.random.addtoplaylist = Add to current playlist
|
||||||
more.random.any = Any
|
more.random.any = Any
|
||||||
more.random.format = Format
|
more.random.format = Format
|
||||||
more.random.before = Before
|
|
||||||
more.random.after = After
|
|
||||||
more.random.genre = Genre
|
more.random.genre = Genre
|
||||||
more.random.anygenre = Any
|
more.random.anygenre = Any
|
||||||
more.random.year = Year
|
more.random.year = Year
|
||||||
@@ -251,6 +249,7 @@ more.random.unstarred = Unstarred
|
|||||||
more.random.songrating = Song rating
|
more.random.songrating = Song rating
|
||||||
more.random.albumrating = Album rating
|
more.random.albumrating = Album rating
|
||||||
more.random.lastplayed = Last played
|
more.random.lastplayed = Last played
|
||||||
|
more.random.playcount = Play count
|
||||||
more.random.1day = 1 day ago
|
more.random.1day = 1 day ago
|
||||||
more.random.1week = 1 week ago
|
more.random.1week = 1 week ago
|
||||||
more.random.1month = 1 month ago
|
more.random.1month = 1 month ago
|
||||||
|
|||||||
@@ -5,6 +5,7 @@
|
|||||||
<style type="text/css">
|
<style type="text/css">
|
||||||
#progressBar {width: 350px; height: 10px; border: 1px solid black; display:none;}
|
#progressBar {width: 350px; height: 10px; border: 1px solid black; display:none;}
|
||||||
#progressBarContent {width: 0; height: 10px; background: url("<c:url value="/icons/default_light/progress.png"/>") repeat;}
|
#progressBarContent {width: 0; height: 10px; background: url("<c:url value="/icons/default_light/progress.png"/>") repeat;}
|
||||||
|
#randomPlayQueue td { padding: 0 5px; }
|
||||||
</style>
|
</style>
|
||||||
<script type="text/javascript" src="<c:url value="/dwr/interface/transferService.js"/>"></script>
|
<script type="text/javascript" src="<c:url value="/dwr/interface/transferService.js"/>"></script>
|
||||||
<script type="text/javascript" src="<c:url value="/dwr/engine.js"/>"></script>
|
<script type="text/javascript" src="<c:url value="/dwr/engine.js"/>"></script>
|
||||||
@@ -52,12 +53,12 @@
|
|||||||
<span style="vertical-align: middle"><fmt:message key="more.random.title"/></span>
|
<span style="vertical-align: middle"><fmt:message key="more.random.title"/></span>
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<form method="post" action="randomPlayQueue.view?">
|
<form id="randomPlayQueue" method="post" action="randomPlayQueue.view?">
|
||||||
<table>
|
<table>
|
||||||
<tr>
|
<tr>
|
||||||
<td><fmt:message key="more.random.text"/></td>
|
<td><fmt:message key="more.random.text"/></td>
|
||||||
<td>
|
<td>
|
||||||
<select name="size">
|
<select style="width: 100%;" name="size">
|
||||||
<option value="10"><fmt:message key="more.random.songs"><fmt:param value="10"/></fmt:message></option>
|
<option value="10"><fmt:message key="more.random.songs"><fmt:param value="10"/></fmt:message></option>
|
||||||
<option value="20" selected><fmt:message key="more.random.songs"><fmt:param value="20"/></fmt:message></option>
|
<option value="20" selected><fmt:message key="more.random.songs"><fmt:param value="20"/></fmt:message></option>
|
||||||
<option value="30"><fmt:message key="more.random.songs"><fmt:param value="30"/></fmt:message></option>
|
<option value="30"><fmt:message key="more.random.songs"><fmt:param value="30"/></fmt:message></option>
|
||||||
@@ -66,22 +67,9 @@
|
|||||||
<option value="100"><fmt:message key="more.random.songs"><fmt:param value="100"/></fmt:message></option>
|
<option value="100"><fmt:message key="more.random.songs"><fmt:param value="100"/></fmt:message></option>
|
||||||
</select>
|
</select>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><fmt:message key="more.random.genre"/></td>
|
|
||||||
<td>
|
|
||||||
<select name="genre">
|
|
||||||
<option value="any"><fmt:message key="more.random.anygenre"/></option>
|
|
||||||
<c:forEach items="${model.genres}" var="genre">
|
|
||||||
<option value="${genre.name}"><str:truncateNicely upper="20">${genre.name} (${genre.songCount})</str:truncateNicely></option>
|
|
||||||
</c:forEach>
|
|
||||||
</select>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><fmt:message key="more.random.year"/></td>
|
<td><fmt:message key="more.random.year"/></td>
|
||||||
<td>
|
<td>
|
||||||
<select name="year">
|
<select style="width: 100%;" name="year">
|
||||||
<option value="any"><fmt:message key="more.random.anyyear"/></option>
|
<option value="any"><fmt:message key="more.random.anyyear"/></option>
|
||||||
|
|
||||||
<c:forEach begin="0" end="${model.currentYear - 2010}" var="yearOffset">
|
<c:forEach begin="0" end="${model.currentYear - 2010}" var="yearOffset">
|
||||||
@@ -102,16 +90,15 @@
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td><fmt:message key="more.random.songrating"/></td>
|
<td><fmt:message key="more.random.genre"/></td>
|
||||||
<td>
|
<td>
|
||||||
<select name="songRating">
|
<select style="width: 100%;" name="genre">
|
||||||
<option value="any" selected="selected"><fmt:message key="more.random.any"/></option>
|
<option value="any"><fmt:message key="more.random.anygenre"/></option>
|
||||||
<option value="starred"><fmt:message key="more.random.starred"/></option>
|
<c:forEach items="${model.genres}" var="genre">
|
||||||
<option value="unstarred"><fmt:message key="more.random.unstarred"/></option>
|
<option value="${genre.name}"><str:truncateNicely upper="20">${genre.name} (${genre.songCount})</str:truncateNicely></option>
|
||||||
|
</c:forEach>
|
||||||
</select>
|
</select>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<td><fmt:message key="more.random.albumrating"/></td>
|
<td><fmt:message key="more.random.albumrating"/></td>
|
||||||
<td>
|
<td>
|
||||||
<select name="albumRatingComp">
|
<select name="albumRatingComp">
|
||||||
@@ -133,11 +120,19 @@
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
<td><fmt:message key="more.random.songrating"/></td>
|
||||||
|
<td>
|
||||||
|
<select style="width: 100%;" name="songRating">
|
||||||
|
<option value="any" selected="selected"><fmt:message key="more.random.any"/></option>
|
||||||
|
<option value="starred"><fmt:message key="more.random.starred"/></option>
|
||||||
|
<option value="unstarred"><fmt:message key="more.random.unstarred"/></option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
<td><fmt:message key="more.random.lastplayed"/></td>
|
<td><fmt:message key="more.random.lastplayed"/></td>
|
||||||
<td>
|
<td>
|
||||||
<select name="lastPlayedComp">
|
<select name="lastPlayedComp">
|
||||||
<option value="lt" selected="selected"><fmt:message key="more.random.before"/></option>
|
<option value="lt" selected="selected"><</option>
|
||||||
<option value="gt"><fmt:message key="more.random.after"/></option>
|
<option value="gt">></option>
|
||||||
</select>
|
</select>
|
||||||
<select name="lastPlayedValue">
|
<select name="lastPlayedValue">
|
||||||
<option value="any" selected="selected"><fmt:message key="more.random.any"/></option>
|
<option value="any" selected="selected"><fmt:message key="more.random.any"/></option>
|
||||||
@@ -150,31 +145,42 @@
|
|||||||
</select>
|
</select>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
|
||||||
<td><fmt:message key="more.random.format"/></td>
|
|
||||||
<td>
|
|
||||||
<select name="format">
|
|
||||||
<option value="any" selected="selected"><fmt:message key="more.random.any"/></option>
|
|
||||||
<option value="flac">FLAC</option>
|
|
||||||
<option value="mp3">MP3</option>
|
|
||||||
</select>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
<tr>
|
||||||
<td><fmt:message key="more.random.folder"/></td>
|
<td><fmt:message key="more.random.folder"/></td>
|
||||||
<td>
|
<td>
|
||||||
<select name="musicFolderId">
|
<select style="width: 100%;" name="musicFolderId">
|
||||||
<option value="-1"><fmt:message key="more.random.anyfolder"/></option>
|
<option value="-1"><fmt:message key="more.random.anyfolder"/></option>
|
||||||
<c:forEach items="${model.musicFolders}" var="musicFolder">
|
<c:forEach items="${model.musicFolders}" var="musicFolder">
|
||||||
<option value="${musicFolder.id}">${musicFolder.name}</option>
|
<option value="${musicFolder.id}">${musicFolder.name}</option>
|
||||||
</c:forEach>
|
</c:forEach>
|
||||||
</select>
|
</select>
|
||||||
</td>
|
</td>
|
||||||
|
<td><fmt:message key="more.random.playcount"/></td>
|
||||||
|
<td>
|
||||||
|
<select name="playCountComp">
|
||||||
|
<option value="lt" selected="selected"><</option>
|
||||||
|
<option value="gt">></option>
|
||||||
|
</select>
|
||||||
|
<input type="number" name="playCountValue"/> times
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td><fmt:message key="more.random.format"/></td>
|
||||||
|
<td>
|
||||||
|
<select style="width: 100%;" name="format">
|
||||||
|
<option value="any" selected="selected"><fmt:message key="more.random.any"/></option>
|
||||||
|
<option value="flac">FLAC</option>
|
||||||
|
<option value="mp3">MP3</option>
|
||||||
|
</select>
|
||||||
|
</td>
|
||||||
|
<td><fmt:message key="more.random.addtoplaylist"/></td>
|
||||||
|
<td>
|
||||||
|
<input name="addToPlaylist" value="true" type="checkbox"/>
|
||||||
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
<td colspan="2">
|
<td colspan="2">
|
||||||
<input type="submit" value="<fmt:message key="more.random.ok"/>">
|
<input type="submit" value="<fmt:message key="more.random.ok"/>">
|
||||||
<input type="checkbox" name="addToPlaylist" value="true"/> <fmt:message key="more.random.add"/>
|
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<c:if test="${not model.clientSidePlaylist}">
|
<c:if test="${not model.clientSidePlaylist}">
|
||||||
|
|||||||
Reference in New Issue
Block a user