Conflicts: libresonic-main/pom.xml libresonic-main/src/main/java/org/libresonic/player/controller/ChangeCoverArtController.java libresonic-main/src/main/java/org/libresonic/player/controller/DLNASettingsController.java libresonic-main/src/main/java/org/libresonic/player/controller/InternetRadioSettingsController.java libresonic-main/src/main/java/org/libresonic/player/controller/PlayQueueController.java libresonic-main/src/main/java/org/libresonic/player/controller/RightController.java libresonic-main/src/main/java/org/libresonic/player/controller/ShareManagementController.java libresonic-main/src/main/java/org/libresonic/player/controller/ShareSettingsController.java libresonic-main/src/main/java/org/libresonic/player/controller/SonosSettingsController.java libresonic-main/src/main/java/org/libresonic/player/controller/TranscodingSettingsController.java libresonic-main/src/main/webapp/WEB-INF/libresonic-servlet.xml pom.xmlmaster
						commit
						e5dc517fa1
					
				| @ -0,0 +1,69 @@ | |||||||
|  | /* | ||||||
|  |  *  This file is part of Libresonic. | ||||||
|  |  * | ||||||
|  |  *  Libresonic is free software: you can redistribute it and/or modify | ||||||
|  |  *  it under the terms of the GNU General Public License as published by | ||||||
|  |  *  the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  *  (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  *  Libresonic is distributed in the hope that it will be useful, | ||||||
|  |  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  *  GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  *  You should have received a copy of the GNU General Public License | ||||||
|  |  *  along with Libresonic.  If not, see <http://www.gnu.org/licenses/>.
 | ||||||
|  |  * | ||||||
|  |  *  Copyright 2016 (C) Libresonic Authors | ||||||
|  |  *  Based upon Subsonic, Copyright 2009 (C) Sindre Mehus | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | package org.libresonic.player.domain; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * @author Sindre Mehus | ||||||
|  |  * @version $Id$ | ||||||
|  |  */ | ||||||
|  | public class AlbumNotes { | ||||||
|  | 
 | ||||||
|  |     private final String notes; | ||||||
|  |     private final String musicBrainzId; | ||||||
|  |     private final String lastFmUrl; | ||||||
|  |     private final String smallImageUrl; | ||||||
|  |     private final String mediumImageUrl; | ||||||
|  |     private final String largeImageUrl; | ||||||
|  | 
 | ||||||
|  |     public AlbumNotes(String notes, String musicBrainzId, String lastFmUrl, String smallImageUrl, | ||||||
|  |                       String mediumImageUrl, String largeImageUrl) { | ||||||
|  |         this.notes = notes; | ||||||
|  |         this.musicBrainzId = musicBrainzId; | ||||||
|  |         this.lastFmUrl = lastFmUrl; | ||||||
|  |         this.smallImageUrl = smallImageUrl; | ||||||
|  |         this.mediumImageUrl = mediumImageUrl; | ||||||
|  |         this.largeImageUrl = largeImageUrl; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getNotes() { | ||||||
|  |         return notes; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getMusicBrainzId() { | ||||||
|  |         return musicBrainzId; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getLastFmUrl() { | ||||||
|  |         return lastFmUrl; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getSmallImageUrl() { | ||||||
|  |         return smallImageUrl; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getMediumImageUrl() { | ||||||
|  |         return mediumImageUrl; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getLargeImageUrl() { | ||||||
|  |         return largeImageUrl; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -0,0 +1,50 @@ | |||||||
|  | /* | ||||||
|  |  * This file is part of Libresonic. | ||||||
|  |  * | ||||||
|  |  *  Libresonic is free software: you can redistribute it and/or modify | ||||||
|  |  *  it under the terms of the GNU General Public License as published by | ||||||
|  |  *  the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  *  (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  *  Libresonic is distributed in the hope that it will be useful, | ||||||
|  |  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  *  GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  *  You should have received a copy of the GNU General Public License | ||||||
|  |  *  along with Libresonic.  If not, see <http://www.gnu.org/licenses/>.
 | ||||||
|  |  * | ||||||
|  |  *  Copyright 2014 (C) Sindre Mehus | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | package org.libresonic.player.domain; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * @author Sindre Mehus | ||||||
|  |  * @version $Id$ | ||||||
|  |  */ | ||||||
|  | public class LastFmCoverArt { | ||||||
|  | 
 | ||||||
|  |     private final String imageUrl; | ||||||
|  |     private final String artist; | ||||||
|  |     private final String album; | ||||||
|  | 
 | ||||||
|  |     public LastFmCoverArt(String imageUrl, String artist, String album) { | ||||||
|  |         this.imageUrl = imageUrl; | ||||||
|  |         this.artist = artist; | ||||||
|  |         this.album = album; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getImageUrl() { | ||||||
|  |         return imageUrl; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getArtist() { | ||||||
|  |         return artist; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public String getAlbum() { | ||||||
|  |         return album; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| @ -1,89 +0,0 @@ | |||||||
| /* |  | ||||||
|  This file is part of Libresonic. |  | ||||||
| 
 |  | ||||||
|  Libresonic is free software: you can redistribute it and/or modify |  | ||||||
|  it under the terms of the GNU General Public License as published by |  | ||||||
|  the Free Software Foundation, either version 3 of the License, or |  | ||||||
|  (at your option) any later version. |  | ||||||
| 
 |  | ||||||
|  Libresonic is distributed in the hope that it will be useful, |  | ||||||
|  but WITHOUT ANY WARRANTY; without even the implied warranty of |  | ||||||
|  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |  | ||||||
|  GNU General Public License for more details. |  | ||||||
| 
 |  | ||||||
|  You should have received a copy of the GNU General Public License |  | ||||||
|  along with Libresonic.  If not, see <http://www.gnu.org/licenses/>.
 |  | ||||||
| 
 |  | ||||||
|  Copyright 2016 (C) Libresonic Authors |  | ||||||
|  Based upon Subsonic, Copyright 2009 (C) Sindre Mehus |  | ||||||
|  */ |  | ||||||
| package org.libresonic.player.domain; |  | ||||||
| 
 |  | ||||||
| import java.util.Date; |  | ||||||
| 
 |  | ||||||
| import org.apache.commons.lang.StringUtils; |  | ||||||
| 
 |  | ||||||
| import org.libresonic.player.service.SettingsService; |  | ||||||
| 
 |  | ||||||
| /** |  | ||||||
|  * Controller for the "Podcast receiver" page. |  | ||||||
|  * |  | ||||||
|  * @author Sindre Mehus |  | ||||||
|  */ |  | ||||||
| public class LicenseInfo { |  | ||||||
| 
 |  | ||||||
|     private String licenseEmail; |  | ||||||
|     private boolean licenseValid; |  | ||||||
|     private final Date trialExpires; |  | ||||||
|     private long trialDaysLeft; |  | ||||||
|     private final Date licenseExpires; |  | ||||||
| 
 |  | ||||||
|     public LicenseInfo(String licenseEmail, boolean licenseValid, Date trialExpires, |  | ||||||
|             long trialDaysLeft, Date licenseExpires) { |  | ||||||
|         this.licenseEmail = licenseEmail; |  | ||||||
|         this.licenseValid = licenseValid; |  | ||||||
|         this.trialExpires = trialExpires; |  | ||||||
|         this.trialDaysLeft = trialDaysLeft; |  | ||||||
|         this.licenseExpires = licenseExpires; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public String getLicenseEmail() { |  | ||||||
|         return licenseEmail; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public void setLicenseEmail(String licenseEmail) { |  | ||||||
|         this.licenseEmail = StringUtils.trimToNull(licenseEmail); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public boolean isLicenseValid() { |  | ||||||
|         return licenseValid; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public void setLicenseValid(boolean licenseValid) { |  | ||||||
|         this.licenseValid = licenseValid; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public boolean isTrial() { |  | ||||||
|         return trialExpires != null && !licenseValid; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public boolean isTrialExpired() { |  | ||||||
|         return trialExpires != null && (trialExpires.before(new Date()) || trialDaysLeft > SettingsService.TRIAL_DAYS + 1); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public boolean isLicenseOrTrialValid() { |  | ||||||
|         return isLicenseValid() || !isTrialExpired(); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public Date getTrialExpires() { |  | ||||||
|         return trialExpires; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public long getTrialDaysLeft() { |  | ||||||
|         return trialDaysLeft; |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public Date getLicenseExpires() { |  | ||||||
|         return licenseExpires; |  | ||||||
|     } |  | ||||||
| } |  | ||||||
| @ -0,0 +1,49 @@ | |||||||
|  | /** | ||||||
|  |  * This file is part of Libresonic. | ||||||
|  |  * | ||||||
|  |  *  Libresonic is free software: you can redistribute it and/or modify | ||||||
|  |  *  it under the terms of the GNU General Public License as published by | ||||||
|  |  *  the Free Software Foundation, either version 3 of the License, or | ||||||
|  |  *  (at your option) any later version. | ||||||
|  |  * | ||||||
|  |  *  Libresonic is distributed in the hope that it will be useful, | ||||||
|  |  *  but WITHOUT ANY WARRANTY; without even the implied warranty of | ||||||
|  |  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | ||||||
|  |  *  GNU General Public License for more details. | ||||||
|  |  * | ||||||
|  |  *  You should have received a copy of the GNU General Public License | ||||||
|  |  *  along with Libresonic.  If not, see <http://www.gnu.org/licenses/>.
 | ||||||
|  |  * | ||||||
|  |  *  Copyright 2014 (C) Sindre Mehus | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | package org.libresonic.player.service; | ||||||
|  | 
 | ||||||
|  | import java.util.LinkedHashMap; | ||||||
|  | import java.util.Map; | ||||||
|  | 
 | ||||||
|  | import de.umass.lastfm.cache.ExpirationPolicy; | ||||||
|  | 
 | ||||||
|  | /** | ||||||
|  |  * Artist and album info is cached permanently. Everything else is cached one year. | ||||||
|  |  * | ||||||
|  |  * @author Sindre Mehus | ||||||
|  |  * @version $Id$ | ||||||
|  |  */ | ||||||
|  | public class LastFmExpirationPolicy implements ExpirationPolicy { | ||||||
|  | 
 | ||||||
|  |     private final static long ONE_YEAR = 12 * 30 * 24 * 3600 * 1000L; | ||||||
|  | 
 | ||||||
|  |     private final Map<String, Long> methodToExpirationTime = new LinkedHashMap<String, Long>() {{ | ||||||
|  |         put("artist.getInfo", Long.MAX_VALUE);  // Cache forever
 | ||||||
|  |         put("album.getInfo", Long.MAX_VALUE);   // Cache forever
 | ||||||
|  |         put("album.search", -1L);               // Don't cache
 | ||||||
|  |     }}; | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public long getExpirationTime(String method, Map<String, String> params) { | ||||||
|  |         Long expirationTime = methodToExpirationTime.get(method); | ||||||
|  |         return expirationTime == null ? ONE_YEAR : expirationTime; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| @ -0,0 +1,26 @@ | |||||||
|  | package org.libresonic.player.spring; | ||||||
|  | 
 | ||||||
|  | import javax.servlet.http.HttpServletRequest; | ||||||
|  | import javax.servlet.http.HttpServletResponse; | ||||||
|  | import org.libresonic.player.Logger; | ||||||
|  | import org.springframework.core.Ordered; | ||||||
|  | import org.springframework.web.servlet.HandlerExceptionResolver; | ||||||
|  | import org.springframework.web.servlet.ModelAndView; | ||||||
|  | 
 | ||||||
|  | public class LoggingExceptionResolver implements HandlerExceptionResolver, Ordered { | ||||||
|  | 
 | ||||||
|  |     private static final Logger logger = Logger.getLogger(LoggingExceptionResolver.class); | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public ModelAndView resolveException( | ||||||
|  |             HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e | ||||||
|  |     ) { | ||||||
|  |         logger.error("Exception occurred", e); | ||||||
|  |         return null; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     @Override | ||||||
|  |     public int getOrder() { | ||||||
|  |         return Integer.MIN_VALUE; | ||||||
|  |     } | ||||||
|  | } | ||||||
| @ -1,144 +1,143 @@ | |||||||
| <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="iso-8859-1" %> | <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="iso-8859-1" %> | ||||||
| <%@ include file="include.jsp" %> | <%@ include file="include.jsp" %> | ||||||
| 
 | 
 | ||||||
| <%-- | <%-- | ||||||
| PARAMETERS | PARAMETERS | ||||||
|   albumId: ID of album. |   albumId: ID of album. | ||||||
|   playlistId: ID of playlist. |   playlistId: ID of playlist. | ||||||
|   podcastChannelId: ID of podcast channel |   podcastChannelId: ID of podcast channel | ||||||
|   coverArtSize: Height and width of cover art. |   coverArtSize: Height and width of cover art. | ||||||
|   caption1: Caption line 1 |   caption1: Caption line 1 | ||||||
|   caption2: Caption line 2 |   caption2: Caption line 2 | ||||||
|   caption3: Caption line 3 |   caption3: Caption line 3 | ||||||
|   captionCount: Number of caption lines to display (default 0) |   captionCount: Number of caption lines to display (default 0) | ||||||
|   showLink: Whether to make the cover art image link to the album page. |   showLink: Whether to make the cover art image link to the album page. | ||||||
|   showZoom: Whether to display a link for zooming the cover art. |   showZoom: Whether to display a link for zooming the cover art. | ||||||
|   showChange: Whether to display a link for changing the cover art. |   showChange: Whether to display a link for changing the cover art. | ||||||
|   appearAfter: Fade in after this many milliseconds, or nil if no fading in should happen. |   appearAfter: Fade in after this many milliseconds, or nil if no fading in should happen. | ||||||
|   hideOverflow: Hide cover art overflow when height is greater than width | --%> | ||||||
| --%> | <c:choose> | ||||||
| <c:choose> |     <c:when test="${empty param.coverArtSize}"> | ||||||
|     <c:when test="${empty param.coverArtSize}"> |         <c:set var="size" value="auto"/> | ||||||
|         <c:set var="size" value="auto"/> |     </c:when> | ||||||
|     </c:when> |     <c:otherwise> | ||||||
|     <c:otherwise> |         <c:set var="size" value="${param.coverArtSize}px"/> | ||||||
|         <c:set var="size" value="${param.coverArtSize}px"/> |     </c:otherwise> | ||||||
|     </c:otherwise> | </c:choose> | ||||||
| </c:choose> | 
 | ||||||
| 
 | <c:set var="captionCount" value="${empty param.captionCount ? 0 : param.captionCount}"/> | ||||||
| <c:set var="captionCount" value="${empty param.captionCount ? 0 : param.captionCount}"/> | 
 | ||||||
| 
 | <str:randomString count="5" type="alphabet" var="divId"/> | ||||||
| <str:randomString count="5" type="alphabet" var="divId"/> | <str:randomString count="5" type="alphabet" var="imgId"/> | ||||||
| <str:randomString count="5" type="alphabet" var="imgId"/> | <str:randomString count="5" type="alphabet" var="playId"/> | ||||||
| <str:randomString count="5" type="alphabet" var="playId"/> | 
 | ||||||
| 
 | <div class="coverart dropshadow"> | ||||||
| <div class="coverart dropshadow"> |     <div style="width:${size};max-width:${size};height:${size};max-height:${size};cursor:pointer" title="${param.caption1}" id="${divId}"> | ||||||
|     <div style="width:${size};max-width:${size};height:${size};max-height:${size};cursor:pointer;<c:if test="${param.hideOverflow}">overflow:hidden</c:if>;" title="${param.caption1}" id="${divId}"> | 
 | ||||||
| 
 |         <c:if test="${not empty param.albumId}"> | ||||||
|         <c:if test="${not empty param.albumId}"> |             <c:url value="main.view" var="targetUrl"> | ||||||
|             <c:url value="main.view" var="targetUrl"> |                 <c:param name="id" value="${param.albumId}"/> | ||||||
|                 <c:param name="id" value="${param.albumId}"/> |             </c:url> | ||||||
|             </c:url> |         </c:if> | ||||||
|         </c:if> |         <c:if test="${not empty param.playlistId}"> | ||||||
|         <c:if test="${not empty param.playlistId}"> |             <c:url value="playlist.view" var="targetUrl"> | ||||||
|             <c:url value="playlist.view" var="targetUrl"> |                 <c:param name="id" value="${param.playlistId}"/> | ||||||
|                 <c:param name="id" value="${param.playlistId}"/> |             </c:url> | ||||||
|             </c:url> |         </c:if> | ||||||
|         </c:if> |         <c:if test="${not empty param.podcastChannelId}"> | ||||||
|         <c:if test="${not empty param.podcastChannelId}"> |             <c:url value="podcastChannel.view" var="targetUrl"> | ||||||
|             <c:url value="podcastChannel.view" var="targetUrl"> |                 <c:param name="id" value="${param.podcastChannelId}"/> | ||||||
|                 <c:param name="id" value="${param.podcastChannelId}"/> |             </c:url> | ||||||
|             </c:url> |         </c:if> | ||||||
|         </c:if> | 
 | ||||||
| 
 |         <c:url value="/coverArt.view" var="coverArtUrl"> | ||||||
|         <c:url value="/coverArt.view" var="coverArtUrl"> |             <c:if test="${not empty param.coverArtSize}"> | ||||||
|             <c:if test="${not empty param.coverArtSize}"> |                 <c:param name="size" value="${param.coverArtSize}"/> | ||||||
|                 <c:param name="size" value="${param.coverArtSize}"/> |             </c:if> | ||||||
|             </c:if> |             <c:if test="${not empty param.albumId}"> | ||||||
|             <c:if test="${not empty param.albumId}"> |                 <c:param name="id" value="${param.albumId}"/> | ||||||
|                 <c:param name="id" value="${param.albumId}"/> |             </c:if> | ||||||
|             </c:if> |             <c:if test="${not empty param.podcastChannelId}"> | ||||||
|             <c:if test="${not empty param.podcastChannelId}"> |                 <c:param name="id" value="pod-${param.podcastChannelId}"/> | ||||||
|                 <c:param name="id" value="pod-${param.podcastChannelId}"/> |             </c:if> | ||||||
|             </c:if> |             <c:if test="${not empty param.playlistId}"> | ||||||
|             <c:if test="${not empty param.playlistId}"> |                 <c:param name="id" value="pl-${param.playlistId}"/> | ||||||
|                 <c:param name="id" value="pl-${param.playlistId}"/> |             </c:if> | ||||||
|             </c:if> |         </c:url> | ||||||
|         </c:url> | 
 | ||||||
| 
 |         <c:url value="/coverArt.view" var="zoomCoverArtUrl"> | ||||||
|         <c:url value="/coverArt.view" var="zoomCoverArtUrl"> |             <c:param name="id" value="${param.albumId}"/> | ||||||
|             <c:param name="id" value="${param.albumId}"/> |         </c:url> | ||||||
|         </c:url> | 
 | ||||||
| 
 |         <div style="position: relative; width: 0; height: 0"> | ||||||
|         <div style="position: relative; width: 0; height: 0"> |             <img src="<spring:theme code="playOverlayImage"/>" id="${playId}" | ||||||
|             <img src="<spring:theme code="playOverlayImage"/>" id="${playId}" |                  style="position: relative; top: 8px; left: 8px; z-index: 2; display:none" > | ||||||
|                  style="position: relative; top: 8px; left: 8px; z-index: 2; display:none" > |         </div> | ||||||
|         </div> |         <c:choose> | ||||||
|         <c:choose> |         <c:when test="${param.showLink}"><a href="${targetUrl}" title="${param.caption1}"></c:when> | ||||||
|         <c:when test="${param.showLink}"><a href="${targetUrl}" title="${param.caption1}"></c:when> |         <c:when test="${param.showZoom}"><a href="${zoomCoverArtUrl}" rel="zoom" title="${param.caption1}"></c:when> | ||||||
|         <c:when test="${param.showZoom}"><a href="${zoomCoverArtUrl}" rel="zoom" title="${param.caption1}"></c:when> |             </c:choose> | ||||||
|             </c:choose> |             <img src="${coverArtUrl}" id="${imgId}" alt="${param.caption1}" | ||||||
|             <img src="${coverArtUrl}" id="${imgId}" alt="${param.caption1}" |                  style="display:none"> | ||||||
|                  style="display:none"> |             <c:if test="${param.showLink or param.showZoom}"></a></c:if> | ||||||
|             <c:if test="${param.showLink or param.showZoom}"></a></c:if> |     </div> | ||||||
|     </div> | 
 | ||||||
| 
 |     <c:if test="${captionCount gt 0}"> | ||||||
|     <c:if test="${captionCount gt 0}"> |         <div class="caption1" style="width:${param.coverArtSize - 16}px"><a href="${targetUrl}" title="${param.caption1}">${param.caption1}</a></div> | ||||||
|         <div class="caption1" style="width:${param.coverArtSize - 16}px"><a href="${targetUrl}" title="${param.caption1}">${param.caption1}</a></div> |     </c:if> | ||||||
|     </c:if> |     <c:if test="${captionCount gt 1}"> | ||||||
|     <c:if test="${captionCount gt 1}"> |         <div class="caption2" style="width:${param.coverArtSize - 16}px">${param.caption2} </div> | ||||||
|         <div class="caption2" style="width:${param.coverArtSize - 16}px">${param.caption2} </div> |     </c:if> | ||||||
|     </c:if> |     <c:if test="${captionCount gt 2}"> | ||||||
|     <c:if test="${captionCount gt 2}"> |         <div class="caption3" style="width:${param.coverArtSize - 16}px">${param.caption3} </div> | ||||||
|         <div class="caption3" style="width:${param.coverArtSize - 16}px">${param.caption3} </div> |     </c:if> | ||||||
|     </c:if> | </div> | ||||||
| </div> | 
 | ||||||
| 
 | <c:if test="${param.showChange or param.showZoom}"> | ||||||
| <c:if test="${param.showChange or param.showZoom}"> |     <div style="padding-top:6px;text-align:right"> | ||||||
|     <div style="padding-top:6px;text-align:right"> |         <c:if test="${param.showChange}"> | ||||||
|         <c:if test="${param.showChange}"> |             <c:url value="/changeCoverArt.view" var="changeCoverArtUrl"> | ||||||
|             <c:url value="/changeCoverArt.view" var="changeCoverArtUrl"> |                 <c:param name="id" value="${param.albumId}"/> | ||||||
|                 <c:param name="id" value="${param.albumId}"/> |             </c:url> | ||||||
|             </c:url> |             <a class="detail" href="${changeCoverArtUrl}"><fmt:message key="coverart.change"/></a> | ||||||
|             <a class="detail" href="${changeCoverArtUrl}"><fmt:message key="coverart.change"/></a> |         </c:if> | ||||||
|         </c:if> | 
 | ||||||
| 
 |         <c:if test="${param.showZoom and param.showChange}"> | ||||||
|         <c:if test="${param.showZoom and param.showChange}"> |             | | ||||||
|             | |         </c:if> | ||||||
|         </c:if> | 
 | ||||||
| 
 |         <c:if test="${param.showZoom}"> | ||||||
|         <c:if test="${param.showZoom}"> |             <a class="detail" rel="zoom" title="${param.caption1}" href="${zoomCoverArtUrl}"><fmt:message key="coverart.zoom"/></a> | ||||||
|             <a class="detail" rel="zoom" title="${param.caption1}" href="${zoomCoverArtUrl}"><fmt:message key="coverart.zoom"/></a> |         </c:if> | ||||||
|         </c:if> |     </div> | ||||||
|     </div> | </c:if> | ||||||
| </c:if> | 
 | ||||||
| 
 | <script type="text/javascript"> | ||||||
| <script type="text/javascript"> |     $(document).ready(function () { | ||||||
|     $(document).ready(function () { |         setTimeout("$('#${imgId}').fadeIn(500)", ${empty param.appearAfter ? 0 : param.appearAfter}); | ||||||
|         setTimeout("$('#${imgId}').fadeIn(500)", ${empty param.appearAfter ? 0 : param.appearAfter}); |     }); | ||||||
|     }); | 
 | ||||||
| 
 |     $("#${divId}").mouseenter(function () { | ||||||
|     $("#${divId}").mouseenter(function () { |         $("#${playId}").show(); | ||||||
|         $("#${playId}").show(); |         $("#${imgId}").stop(); | ||||||
|         $("#${imgId}").stop(); |         $("#${imgId}").animate({opacity: 0.7}, 150); | ||||||
|         $("#${imgId}").animate({opacity: 0.7}, 150); |     }); | ||||||
|     }); |     $("#${divId}").mouseleave(function () { | ||||||
|     $("#${divId}").mouseleave(function () { |         $("#${playId}").hide(); | ||||||
|         $("#${playId}").hide(); |         $("#${imgId}").stop(); | ||||||
|         $("#${imgId}").stop(); |         $("#${imgId}").animate({opacity: 1.0}, 150); | ||||||
|         $("#${imgId}").animate({opacity: 1.0}, 150); |     }); | ||||||
|     }); |     $("#${playId}").click(function () { | ||||||
|     $("#${playId}").click(function () { |         <c:if test="${not empty param.albumId}"> | ||||||
|         <c:if test="${not empty param.albumId}"> |         top.playQueue.onPlay(${param.albumId}); | ||||||
|         top.playQueue.onPlay(${param.albumId}); |         </c:if> | ||||||
|         </c:if> |         <c:if test="${not empty param.playlistId}"> | ||||||
|         <c:if test="${not empty param.playlistId}"> |         top.playQueue.onPlayPlaylist(${param.playlistId}); | ||||||
|         top.playQueue.onPlayPlaylist(${param.playlistId}); |         </c:if> | ||||||
|         </c:if> |         <c:if test="${not empty param.podcastChannelId}"> | ||||||
|         <c:if test="${not empty param.podcastChannelId}"> |         top.playQueue.onPlayPodcastChannel(${param.podcastChannelId}); | ||||||
|         top.playQueue.onPlayPodcastChannel(${param.podcastChannelId}); |         </c:if> | ||||||
|         </c:if> |     }); | ||||||
|     }); | 
 | ||||||
| 
 | </script> | ||||||
| </script> | 
 | ||||||
| 
 |  | ||||||
|  | |||||||
| @ -1,93 +0,0 @@ | |||||||
| <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="iso-8859-1" %> |  | ||||||
| <%--@elvariable id="command" type="org.libresonic.player.command.PremiumSettingsCommand"--%> |  | ||||||
| <html> |  | ||||||
| <head> |  | ||||||
|     <%@ include file="head.jsp" %> |  | ||||||
|     <%@ include file="jquery.jsp" %> |  | ||||||
| </head> |  | ||||||
| <body class="mainframe bgcolor1"> |  | ||||||
| 
 |  | ||||||
| <c:import url="settingsHeader.jsp"> |  | ||||||
|     <c:param name="cat" value="premium"/> |  | ||||||
|     <c:param name="restricted" value="${not command.user.adminRole}"/> |  | ||||||
|     <c:param name="toast" value="${command.toast}"/> |  | ||||||
| </c:import> |  | ||||||
| 
 |  | ||||||
| <c:if test="${not empty command.path}"> |  | ||||||
|     <sub:url value="main.view" var="backUrl"> |  | ||||||
|         <sub:param name="path" value="${command.path}"/> |  | ||||||
|     </sub:url> |  | ||||||
|     <div class="back"><a href="${backUrl}"> |  | ||||||
|         <fmt:message key="common.back"/> |  | ||||||
|     </a></div> |  | ||||||
|     <br/> |  | ||||||
| </c:if> |  | ||||||
| 
 |  | ||||||
| <div style="width:50em; max-width:50em"> |  | ||||||
| 
 |  | ||||||
|     <fmt:message key="premium.text"/> |  | ||||||
|     <fmt:formatDate value="${command.licenseInfo.licenseExpires}" dateStyle="long" var="expirationDate"/> |  | ||||||
| 
 |  | ||||||
|     <c:if test="${command.licenseInfo.licenseValid}"> |  | ||||||
|         <c:choose> |  | ||||||
|             <c:when test="${empty command.licenseInfo.licenseExpires}"> |  | ||||||
|                 <p><b><fmt:message key="premium.licensed"/></b></p> |  | ||||||
|             </c:when> |  | ||||||
|             <c:otherwise> |  | ||||||
|                 <p><b><fmt:message key="premium.licensedexpires"><fmt:param value="${expirationDate}"/></fmt:message></b></p> |  | ||||||
|             </c:otherwise> |  | ||||||
|         </c:choose> |  | ||||||
|         <c:if test="${not command.forceChange and not command.submissionError}"> |  | ||||||
|             <p> |  | ||||||
|                 <fmt:message key="premium.licensedto"><fmt:param value="${command.licenseInfo.licenseEmail}"/></fmt:message> |  | ||||||
|             </p> |  | ||||||
|             <c:if test="${command.user.adminRole}"> |  | ||||||
|                 <div class="forward"><a href="premiumSettings.view?change"><fmt:message key="premium.forcechange"/></a></div> |  | ||||||
|             </c:if> |  | ||||||
|         </c:if> |  | ||||||
|     </c:if> |  | ||||||
| 
 |  | ||||||
|     <c:if test="${not command.licenseInfo.licenseValid}"> |  | ||||||
|         <c:if test="${not empty command.licenseInfo.licenseExpires}"> |  | ||||||
|             <p><b><fmt:message key="premium.licensedexpired"><fmt:param value="${expirationDate}"/></fmt:message></b></p> |  | ||||||
|         </c:if> |  | ||||||
|         <p class="forward" style="font-size:1.2em;margin-left: 1em"><b><a href="http://libresonic.org/pages/premium.jsp" target="_blank"> |  | ||||||
|             <fmt:message key="premium.getpremium"/> |  | ||||||
|             <c:if test="${command.licenseInfo.trialDaysLeft gt 0}"> |  | ||||||
|                 – <fmt:message key="top.trialdaysleft"><fmt:param value="${command.licenseInfo.trialDaysLeft}"/></fmt:message> |  | ||||||
|             </c:if> |  | ||||||
|         </a></b></p> |  | ||||||
| 
 |  | ||||||
|         <p><fmt:message key="premium.register"/></p> |  | ||||||
|     </c:if> |  | ||||||
| 
 |  | ||||||
|     <c:if test="${not command.licenseInfo.licenseValid or command.forceChange or command.submissionError}"> |  | ||||||
|         <form:form commandName="command" method="post" action="premiumSettings.view"> |  | ||||||
|             <form:hidden path="path"/> |  | ||||||
|             <table> |  | ||||||
|                 <tr> |  | ||||||
|                     <td><fmt:message key="premium.register.email"/></td> |  | ||||||
|                     <td> |  | ||||||
|                         <form:input path="licenseInfo.licenseEmail" size="60"/> |  | ||||||
|                     </td> |  | ||||||
|                 </tr> |  | ||||||
|                 <tr> |  | ||||||
|                     <td><fmt:message key="premium.register.license"/></td> |  | ||||||
|                     <td> |  | ||||||
|                         <form:input path="licenseCode" size="60"/> |  | ||||||
|                     </td> |  | ||||||
|                     <td><input type="submit" value="<fmt:message key="common.ok"/>"/></td> |  | ||||||
|                 </tr> |  | ||||||
|                 <tr> |  | ||||||
|                     <td/> |  | ||||||
|                     <td class="warning"><form:errors path="licenseCode"/></td> |  | ||||||
|                 </tr> |  | ||||||
|             </table> |  | ||||||
|         </form:form> |  | ||||||
| 
 |  | ||||||
|         <p><fmt:message key="premium.resend"/></p> |  | ||||||
|     </c:if> |  | ||||||
| 
 |  | ||||||
| </div> |  | ||||||
| </body> |  | ||||||
| </html> |  | ||||||
| After Width: | Height: | Size: 1.7 KiB | 
					Loading…
					
					
				
		Reference in new issue