diff --git a/libresonic-installer-windows/pom.xml b/libresonic-installer-windows/pom.xml index 72f293c5..727a7768 100644 --- a/libresonic-installer-windows/pom.xml +++ b/libresonic-installer-windows/pom.xml @@ -59,7 +59,6 @@ - diff --git a/libresonic-main/pom.xml b/libresonic-main/pom.xml index bd0fe70b..cac1eac3 100644 --- a/libresonic-main/pom.xml +++ b/libresonic-main/pom.xml @@ -127,14 +127,8 @@ com.google.guava - guava-base - r03 - - - - com.google.guava - guava-collections - r03 + guava + 18.0 diff --git a/libresonic-main/src/main/java/org/libresonic/player/ajax/CoverArtService.java b/libresonic-main/src/main/java/org/libresonic/player/ajax/CoverArtService.java index 360c668d..c626250b 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/ajax/CoverArtService.java +++ b/libresonic-main/src/main/java/org/libresonic/player/ajax/CoverArtService.java @@ -23,6 +23,7 @@ import java.io.File; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; +import java.util.List; import org.apache.commons.io.IOUtils; import org.apache.http.client.config.RequestConfig; @@ -32,7 +33,9 @@ import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.libresonic.player.Logger; +import org.libresonic.player.domain.LastFmCoverArt; import org.libresonic.player.domain.MediaFile; +import org.libresonic.player.service.LastFmService; import org.libresonic.player.service.MediaFileService; import org.libresonic.player.service.SecurityService; import org.libresonic.player.util.StringUtil; @@ -50,6 +53,11 @@ public class CoverArtService { private SecurityService securityService; private MediaFileService mediaFileService; + private LastFmService lastFmService; + + public List searchCoverArt(String artist, String album) { + return lastFmService.searchCoverArt(artist, album); + } /** * Downloads and saves the cover art at the given URL. @@ -162,4 +170,8 @@ public class CoverArtService { public void setMediaFileService(MediaFileService mediaFileService) { this.mediaFileService = mediaFileService; } -} \ No newline at end of file + + public void setLastFmService(LastFmService lastFmService) { + this.lastFmService = lastFmService; + } +} diff --git a/libresonic-main/src/main/java/org/libresonic/player/command/AdvancedSettingsCommand.java b/libresonic-main/src/main/java/org/libresonic/player/command/AdvancedSettingsCommand.java index eaad28af..2f8168e6 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/command/AdvancedSettingsCommand.java +++ b/libresonic-main/src/main/java/org/libresonic/player/command/AdvancedSettingsCommand.java @@ -37,8 +37,6 @@ public class AdvancedSettingsCommand { private String ldapManagerPassword; private boolean ldapAutoShadowing; private String brand; - private boolean isReloadNeeded; - private boolean toast; private String smtpServer; private String smtpEncryption; @@ -120,19 +118,6 @@ public class AdvancedSettingsCommand { } public void setReloadNeeded(boolean reloadNeeded) { - isReloadNeeded = reloadNeeded; - } - - public boolean isReloadNeeded() { - return isReloadNeeded; - } - - public boolean isToast() { - return toast; - } - - public void setToast(boolean toast) { - this.toast = toast; } public String getSmtpServer() { diff --git a/libresonic-main/src/main/java/org/libresonic/player/command/GeneralSettingsCommand.java b/libresonic-main/src/main/java/org/libresonic/player/command/GeneralSettingsCommand.java index 52ffbd47..c8fad18a 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/command/GeneralSettingsCommand.java +++ b/libresonic-main/src/main/java/org/libresonic/player/command/GeneralSettingsCommand.java @@ -46,8 +46,6 @@ public class GeneralSettingsCommand { private String[] locales; private String themeIndex; private Theme[] themes; - private boolean isReloadNeeded; - private boolean toast; public String getPlaylistFolder() { return playlistFolder; @@ -169,12 +167,7 @@ public class GeneralSettingsCommand { this.themes = themes; } - public boolean isReloadNeeded() { - return isReloadNeeded; - } - public void setReloadNeeded(boolean reloadNeeded) { - isReloadNeeded = reloadNeeded; } public boolean isSortAlbumsByYear() { @@ -193,11 +186,4 @@ public class GeneralSettingsCommand { this.gettingStartedEnabled = gettingStartedEnabled; } - public boolean isToast() { - return toast; - } - - public void setToast(boolean toast) { - this.toast = toast; - } } diff --git a/libresonic-main/src/main/java/org/libresonic/player/command/MusicFolderSettingsCommand.java b/libresonic-main/src/main/java/org/libresonic/player/command/MusicFolderSettingsCommand.java index 1c45816e..1bb0b546 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/command/MusicFolderSettingsCommand.java +++ b/libresonic-main/src/main/java/org/libresonic/player/command/MusicFolderSettingsCommand.java @@ -41,7 +41,6 @@ public class MusicFolderSettingsCommand { private boolean organizeByFolderStructure; private List musicFolders; private MusicFolderInfo newMusicFolder; - private boolean reload; public String getInterval() { return interval; @@ -91,14 +90,6 @@ public class MusicFolderSettingsCommand { this.newMusicFolder = newMusicFolder; } - public void setReload(boolean reload) { - this.reload = reload; - } - - public boolean isReload() { - return reload; - } - public boolean isOrganizeByFolderStructure() { return organizeByFolderStructure; } diff --git a/libresonic-main/src/main/java/org/libresonic/player/command/NetworkSettingsCommand.java b/libresonic-main/src/main/java/org/libresonic/player/command/NetworkSettingsCommand.java index 67fe762b..bff40e6c 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/command/NetworkSettingsCommand.java +++ b/libresonic-main/src/main/java/org/libresonic/player/command/NetworkSettingsCommand.java @@ -19,7 +19,6 @@ */ package org.libresonic.player.command; -import org.libresonic.player.domain.LicenseInfo; /** * @author Sindre Mehus @@ -34,7 +33,6 @@ public class NetworkSettingsCommand { private String urlRedirectType; private int port; private boolean toast; - private LicenseInfo licenseInfo; public void setPortForwardingEnabled(boolean portForwardingEnabled) { this.portForwardingEnabled = portForwardingEnabled; @@ -83,14 +81,6 @@ public class NetworkSettingsCommand { this.toast = toast; } - public void setLicenseInfo(LicenseInfo licenseInfo) { - this.licenseInfo = licenseInfo; - } - - public LicenseInfo getLicenseInfo() { - return licenseInfo; - } - public String getUrlRedirectType() { return urlRedirectType; } diff --git a/libresonic-main/src/main/java/org/libresonic/player/command/PersonalSettingsCommand.java b/libresonic-main/src/main/java/org/libresonic/player/command/PersonalSettingsCommand.java index 1f182583..57e3c4ff 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/command/PersonalSettingsCommand.java +++ b/libresonic-main/src/main/java/org/libresonic/player/command/PersonalSettingsCommand.java @@ -61,7 +61,6 @@ public class PersonalSettingsCommand { private int listReloadDelay; private String lastFmUsername; private String lastFmPassword; - private boolean isReloadNeeded; public User getUser() { return user; @@ -271,14 +270,6 @@ public class PersonalSettingsCommand { this.lastFmPassword = lastFmPassword; } - public boolean isReloadNeeded() { - return isReloadNeeded; - } - - public void setReloadNeeded(boolean reloadNeeded) { - isReloadNeeded = reloadNeeded; - } - public boolean isQueueFollowingSongs() { return queueFollowingSongs; } diff --git a/libresonic-main/src/main/java/org/libresonic/player/command/PlayerSettingsCommand.java b/libresonic-main/src/main/java/org/libresonic/player/command/PlayerSettingsCommand.java index 89260232..3377e44a 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/command/PlayerSettingsCommand.java +++ b/libresonic-main/src/main/java/org/libresonic/player/command/PlayerSettingsCommand.java @@ -52,7 +52,6 @@ public class PlayerSettingsCommand { private EnumHolder[] transcodeSchemeHolders; private Player[] players; private boolean isAdmin; - private boolean isReloadNeeded; public String getPlayerId() { return playerId; @@ -206,12 +205,8 @@ public class PlayerSettingsCommand { isAdmin = admin; } - public boolean isReloadNeeded() { - return isReloadNeeded; - } public void setReloadNeeded(boolean reloadNeeded) { - isReloadNeeded = reloadNeeded; } /** diff --git a/libresonic-main/src/main/java/org/libresonic/player/command/PodcastSettingsCommand.java b/libresonic-main/src/main/java/org/libresonic/player/command/PodcastSettingsCommand.java index bfe5a136..84ec7dfb 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/command/PodcastSettingsCommand.java +++ b/libresonic-main/src/main/java/org/libresonic/player/command/PodcastSettingsCommand.java @@ -32,7 +32,6 @@ public class PodcastSettingsCommand { private String folder; private String episodeRetentionCount; private String episodeDownloadCount; - private boolean toast; public String getInterval() { return interval; @@ -66,11 +65,4 @@ public class PodcastSettingsCommand { this.episodeDownloadCount = episodeDownloadCount; } - public boolean isToast() { - return toast; - } - - public void setToast(boolean toast) { - this.toast = toast; - } } diff --git a/libresonic-main/src/main/java/org/libresonic/player/command/UserSettingsCommand.java b/libresonic-main/src/main/java/org/libresonic/player/command/UserSettingsCommand.java index e10bbc7c..a6d12a59 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/command/UserSettingsCommand.java +++ b/libresonic-main/src/main/java/org/libresonic/player/command/UserSettingsCommand.java @@ -61,8 +61,6 @@ public class UserSettingsCommand { private EnumHolder[] transcodeSchemeHolders; private boolean transcodingSupported; private String transcodeDirectory; - private boolean toast; - private boolean reload; public String getUsername() { return username; @@ -297,21 +295,7 @@ public class UserSettingsCommand { isSettingsRole = user != null && user.isSettingsRole(); isShareRole = user != null && user.isShareRole(); isLdapAuthenticated = user != null && user.isLdapAuthenticated(); + setNewUser(false); } - public void setToast(boolean toast) { - this.toast = toast; - } - - public boolean isToast() { - return toast; - } - - public boolean isReload() { - return reload; - } - - public void setReload(boolean reload) { - this.reload = reload; - } } \ No newline at end of file diff --git a/libresonic-main/src/main/java/org/libresonic/player/controller/AdvancedSettingsController.java b/libresonic-main/src/main/java/org/libresonic/player/controller/AdvancedSettingsController.java index 6cbc2392..b86667e9 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/controller/AdvancedSettingsController.java +++ b/libresonic-main/src/main/java/org/libresonic/player/controller/AdvancedSettingsController.java @@ -30,6 +30,7 @@ import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; /** * Controller for the page used to administrate advanced settings. @@ -67,10 +68,10 @@ public class AdvancedSettingsController { } @RequestMapping(method = RequestMethod.POST) - protected String doSubmitAction(@ModelAttribute AdvancedSettingsCommand command,Model model) throws Exception { + protected String doSubmitAction(@ModelAttribute AdvancedSettingsCommand command, RedirectAttributes redirectAttributes) throws Exception { - command.setToast(true); - command.setReloadNeeded(false); + redirectAttributes.addFlashAttribute("settings_reload", false); + redirectAttributes.addFlashAttribute("settings_toast", true); try { settingsService.setDownloadBitrateLimit(Long.parseLong(command.getDownloadLimit())); @@ -99,8 +100,7 @@ public class AdvancedSettingsController { settingsService.setSmtpPassword(command.getSmtpPassword()); } - model.addAttribute("command", command); - return "advancedSettings"; + return "redirect:advancedSettings.view"; } } diff --git a/libresonic-main/src/main/java/org/libresonic/player/controller/ChangeCoverArtController.java b/libresonic-main/src/main/java/org/libresonic/player/controller/ChangeCoverArtController.java index 6a021d17..f8ffa7f5 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/controller/ChangeCoverArtController.java +++ b/libresonic-main/src/main/java/org/libresonic/player/controller/ChangeCoverArtController.java @@ -53,10 +53,10 @@ public class ChangeCoverArtController { String album = request.getParameter("album"); MediaFile dir = mediaFileService.getMediaFile(id); - if (artist == null) { + if (StringUtils.isBlank(artist)) { artist = dir.getArtist(); } - if (album == null) { + if (StringUtils.isBlank(album)) { album = dir.getAlbumName(); } diff --git a/libresonic-main/src/main/java/org/libresonic/player/controller/DLNASettingsController.java b/libresonic-main/src/main/java/org/libresonic/player/controller/DLNASettingsController.java index 4b1deaca..60eda464 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/controller/DLNASettingsController.java +++ b/libresonic-main/src/main/java/org/libresonic/player/controller/DLNASettingsController.java @@ -22,19 +22,18 @@ import java.util.HashMap; import java.util.Map; import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; import org.springframework.web.bind.ServletRequestUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.mvc.ParameterizableViewController; import org.libresonic.player.service.SettingsService; import org.libresonic.player.service.UPnPService; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; /** * Controller for the page used to administrate the UPnP/DLNA server settings. @@ -43,38 +42,31 @@ import org.libresonic.player.service.UPnPService; */ @Controller @RequestMapping("/dlnaSettings") -public class DLNASettingsController { +public class DLNASettingsController { @Autowired private UPnPService upnpService; + @Autowired private SettingsService settingsService; @RequestMapping(method = RequestMethod.GET) - protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { + public String handleGet(Model model) throws Exception { Map map = new HashMap(); - if (isFormSubmission(request)) { - handleParameters(request); - map.put("toast", true); - } - map.put("dlnaEnabled", settingsService.isDlnaEnabled()); map.put("dlnaServerName", settingsService.getDlnaServerName()); - map.put("licenseInfo", settingsService.getLicenseInfo()); - return new ModelAndView("dlnaSettings","model",map); + model.addAttribute("model", map); + return "dlnaSettings"; } - /** - * Determine if the given request represents a form submission. - * - * @param request current HTTP request - * @return if the request represents a form submission - */ - private boolean isFormSubmission(HttpServletRequest request) { - return "POST".equals(request.getMethod()); + @RequestMapping(method = RequestMethod.POST) + public String handlePost(HttpServletRequest request, RedirectAttributes redirectAttributes) throws Exception { + handleParameters(request); + redirectAttributes.addFlashAttribute("settings_toast", true); + return "redirect:dlnaSettings.view"; } private void handleParameters(HttpServletRequest request) { @@ -91,5 +83,11 @@ public class DLNASettingsController { upnpService.setMediaServerEnabled(dlnaEnabled); } + public void setSettingsService(SettingsService settingsService) { + this.settingsService = settingsService; + } -} \ No newline at end of file + public void setUpnpService(UPnPService upnpService) { + this.upnpService = upnpService; + } +} diff --git a/libresonic-main/src/main/java/org/libresonic/player/controller/GeneralSettingsController.java b/libresonic-main/src/main/java/org/libresonic/player/controller/GeneralSettingsController.java index b549ee56..3355a452 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/controller/GeneralSettingsController.java +++ b/libresonic-main/src/main/java/org/libresonic/player/controller/GeneralSettingsController.java @@ -28,6 +28,7 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; import java.util.Locale; @@ -91,7 +92,7 @@ public class GeneralSettingsController { } @RequestMapping(method = RequestMethod.POST) - protected String doSubmitAction(@ModelAttribute("command") GeneralSettingsCommand command, Model model) throws Exception { + protected String doSubmitAction(@ModelAttribute("command") GeneralSettingsCommand command, RedirectAttributes redirectAttributes) throws Exception { int themeIndex = Integer.parseInt(command.getThemeIndex()); Theme theme = settingsService.getAvailableThemes()[themeIndex]; @@ -99,12 +100,14 @@ public class GeneralSettingsController { int localeIndex = Integer.parseInt(command.getLocaleIndex()); Locale locale = settingsService.getAvailableLocales()[localeIndex]; - command.setToast(true); - command.setReloadNeeded(!settingsService.getIndexString().equals(command.getIndex()) || - !settingsService.getIgnoredArticles().equals(command.getIgnoredArticles()) || - !settingsService.getShortcuts().equals(command.getShortcuts()) || - !settingsService.getThemeId().equals(theme.getId()) || - !settingsService.getLocale().equals(locale)); + redirectAttributes.addFlashAttribute("settings_toast", true); + redirectAttributes.addFlashAttribute( + "settings_reload", + !settingsService.getIndexString().equals(command.getIndex()) + || !settingsService.getIgnoredArticles().equals(command.getIgnoredArticles()) + || !settingsService.getShortcuts().equals(command.getShortcuts()) + || !settingsService.getThemeId().equals(theme.getId()) + || !settingsService.getLocale().equals(locale)); settingsService.setIndexString(command.getIndex()); settingsService.setIgnoredArticles(command.getIgnoredArticles()); diff --git a/libresonic-main/src/main/java/org/libresonic/player/controller/HelpController.java b/libresonic-main/src/main/java/org/libresonic/player/controller/HelpController.java index d46dabb7..67613f4e 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/controller/HelpController.java +++ b/libresonic-main/src/main/java/org/libresonic/player/controller/HelpController.java @@ -72,7 +72,6 @@ public class HelpController { ", java " + System.getProperty("java.version") + ", " + System.getProperty("os.name"); - map.put("licenseInfo", settingsService.getLicenseInfo()); map.put("user", securityService.getCurrentUser(request)); map.put("brand", settingsService.getBrand()); map.put("localVersion", versionService.getLocalVersion()); diff --git a/libresonic-main/src/main/java/org/libresonic/player/controller/InternetRadioSettingsController.java b/libresonic-main/src/main/java/org/libresonic/player/controller/InternetRadioSettingsController.java index 3ae969bd..c57ac9f5 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/controller/InternetRadioSettingsController.java +++ b/libresonic-main/src/main/java/org/libresonic/player/controller/InternetRadioSettingsController.java @@ -24,6 +24,7 @@ import org.libresonic.player.service.SettingsService; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; @@ -31,6 +32,8 @@ import org.springframework.web.servlet.mvc.ParameterizableViewController; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + import java.util.Date; import java.util.HashMap; import java.util.List; @@ -49,30 +52,27 @@ public class InternetRadioSettingsController { private SettingsService settingsService; @RequestMapping(method = RequestMethod.GET) - protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { - - Map map = new HashMap(); + public String doGet(Model model) throws Exception { - if (isFormSubmission(request)) { - String error = handleParameters(request); - map.put("error", error); - if (error == null) { - map.put("reload", true); - } - } + Map map = new HashMap<>(); map.put("internetRadios", settingsService.getAllInternetRadios(true)); - return new ModelAndView("internetRadioSettings","model",map); + + model.addAttribute("model", map); + return "internetRadioSettings"; } - /** - * Determine if the given request represents a form submission. - * - * @param request current HTTP request - * @return if the request represents a form submission - */ - private boolean isFormSubmission(HttpServletRequest request) { - return "POST".equals(request.getMethod()); + @RequestMapping(method = RequestMethod.POST) + public String doPost(HttpServletRequest request, RedirectAttributes redirectAttributes) throws Exception { + + String error = handleParameters(request); + Map map = new HashMap<>(); + if(error == null) { + redirectAttributes.addFlashAttribute("settings_toast", true); + redirectAttributes.addFlashAttribute("settings_reload", true); + } + redirectAttributes.addFlashAttribute("error", error); + return "redirect:internetRadioSettings.view"; } private String handleParameters(HttpServletRequest request) { @@ -120,5 +120,4 @@ public class InternetRadioSettingsController { return StringUtils.trimToNull(request.getParameter(name + "[" + id + "]")); } - } diff --git a/libresonic-main/src/main/java/org/libresonic/player/controller/MainController.java b/libresonic-main/src/main/java/org/libresonic/player/controller/MainController.java index 29511e23..b9fc3004 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/controller/MainController.java +++ b/libresonic-main/src/main/java/org/libresonic/player/controller/MainController.java @@ -112,7 +112,6 @@ public class MainController { map.put("showArtistInfo", userSettings.isShowArtistInfoEnabled()); map.put("partyMode", userSettings.isPartyModeEnabled()); map.put("brand", settingsService.getBrand()); - map.put("showAd", !settingsService.isLicenseValid() && adService.showAd()); map.put("viewAsList", isViewAsList(request, userSettings)); if (dir.isAlbum()) { map.put("sieblingAlbums", getSieblingAlbums(dir)); diff --git a/libresonic-main/src/main/java/org/libresonic/player/controller/MusicFolderSettingsController.java b/libresonic-main/src/main/java/org/libresonic/player/controller/MusicFolderSettingsController.java index 96bebde1..314b88e6 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/controller/MusicFolderSettingsController.java +++ b/libresonic-main/src/main/java/org/libresonic/player/controller/MusicFolderSettingsController.java @@ -33,6 +33,7 @@ import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; import java.util.ArrayList; import java.util.List; @@ -66,7 +67,6 @@ public class MusicFolderSettingsController { @ModelAttribute protected void formBackingObject(@RequestParam(value = "scanNow",required = false) String scanNow, @RequestParam(value = "expunge",required = false) String expunge, - @RequestParam(value = "reload",required = false) String reload, Model model) throws Exception { MusicFolderSettingsCommand command = new MusicFolderSettingsCommand(); @@ -85,7 +85,6 @@ public class MusicFolderSettingsController { command.setScanning(mediaScannerService.isScanning()); command.setMusicFolders(wrap(settingsService.getAllMusicFolders(true, true))); command.setNewMusicFolder(new MusicFolderSettingsCommand.MusicFolderInfo()); - command.setReload(reload != null || scanNow != null); model.addAttribute("command",command); } @@ -102,7 +101,7 @@ public class MusicFolderSettingsController { } @RequestMapping(method = RequestMethod.POST) - protected String onSubmit(@ModelAttribute("command") MusicFolderSettingsCommand command, Model model) throws Exception { + protected String onSubmit(@ModelAttribute("command") MusicFolderSettingsCommand command, RedirectAttributes redirectAttributes) throws Exception { for (MusicFolderSettingsCommand.MusicFolderInfo musicFolderInfo : command.getMusicFolders()) { if (musicFolderInfo.isDelete()) { @@ -126,6 +125,10 @@ public class MusicFolderSettingsController { settingsService.setOrganizeByFolderStructure(command.isOrganizeByFolderStructure()); settingsService.save(); + + redirectAttributes.addFlashAttribute("settings_toast", true); + redirectAttributes.addFlashAttribute("settings_reload", true); + mediaScannerService.schedule(); return "redirect:musicFolderSettings.view"; } diff --git a/libresonic-main/src/main/java/org/libresonic/player/controller/NetworkSettingsController.java b/libresonic-main/src/main/java/org/libresonic/player/controller/NetworkSettingsController.java index ed341e94..84a35379 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/controller/NetworkSettingsController.java +++ b/libresonic-main/src/main/java/org/libresonic/player/controller/NetworkSettingsController.java @@ -30,6 +30,7 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; import java.util.Random; @@ -56,7 +57,6 @@ public class NetworkSettingsController { command.setUrlRedirectFrom(settingsService.getUrlRedirectFrom()); command.setUrlRedirectCustomUrl(settingsService.getUrlRedirectCustomUrl()); command.setPort(settingsService.getPort()); - command.setLicenseInfo(settingsService.getLicenseInfo()); model.addAttribute("command",command); } @@ -66,8 +66,7 @@ public class NetworkSettingsController { } @RequestMapping(method = RequestMethod.POST) - protected String doSubmitAction(@ModelAttribute("command") NetworkSettingsCommand command, Model model) throws Exception { - command.setToast(true); + protected String doSubmitAction(@ModelAttribute("command") NetworkSettingsCommand command, RedirectAttributes redirectAttributes) throws Exception { settingsService.setPortForwardingEnabled(command.isPortForwardingEnabled()); settingsService.setUrlRedirectionEnabled(command.isUrlRedirectionEnabled()); @@ -83,7 +82,10 @@ public class NetworkSettingsController { settingsService.save(); networkService.initPortForwarding(0); networkService.initUrlRedirection(true); - return "networkSettings"; + + redirectAttributes.addFlashAttribute("settings_toast", true); + + return "redirect:networkSettings.view"; } -} \ No newline at end of file +} diff --git a/libresonic-main/src/main/java/org/libresonic/player/controller/PersonalSettingsController.java b/libresonic-main/src/main/java/org/libresonic/player/controller/PersonalSettingsController.java index f09afc82..0a1bd2a9 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/controller/PersonalSettingsController.java +++ b/libresonic-main/src/main/java/org/libresonic/player/controller/PersonalSettingsController.java @@ -32,6 +32,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import javax.servlet.http.HttpServletRequest; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + import java.util.Date; import java.util.Locale; @@ -112,7 +114,7 @@ public class PersonalSettingsController { } @RequestMapping(method = RequestMethod.POST) - protected String doSubmitAction(@ModelAttribute("command") PersonalSettingsCommand command,Model model) throws Exception { + protected String doSubmitAction(@ModelAttribute("command") PersonalSettingsCommand command, RedirectAttributes redirectAttributes) throws Exception { int localeIndex = Integer.parseInt(command.getLocaleIndex()); Locale locale = null; @@ -158,10 +160,10 @@ public class PersonalSettingsController { settings.setChanged(new Date()); settingsService.updateUserSettings(settings); - command.setReloadNeeded(true); + redirectAttributes.addFlashAttribute("settings_reload", true); + redirectAttributes.addFlashAttribute("settings_toast", true); - model.addAttribute("command",command); - return "personalSettings"; + return "redirect:personalSettings.view"; } private int getAvatarId(UserSettings userSettings) { diff --git a/libresonic-main/src/main/java/org/libresonic/player/controller/PlayQueueController.java b/libresonic-main/src/main/java/org/libresonic/player/controller/PlayQueueController.java index 3d2e0e05..11a9d085 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/controller/PlayQueueController.java +++ b/libresonic-main/src/main/java/org/libresonic/player/controller/PlayQueueController.java @@ -67,7 +67,6 @@ public class PlayQueueController { map.put("partyMode", userSettings.isPartyModeEnabled()); map.put("notify", userSettings.isSongNotificationEnabled()); map.put("autoHide", userSettings.isAutoHidePlayQueue()); - map.put("licenseInfo", settingsService.getLicenseInfo()); return new ModelAndView("playQueue","model",map); } @@ -82,4 +81,4 @@ public class PlayQueueController { public void setSettingsService(SettingsService settingsService) { this.settingsService = settingsService; } -} \ No newline at end of file +} diff --git a/libresonic-main/src/main/java/org/libresonic/player/controller/PlayerSettingsController.java b/libresonic-main/src/main/java/org/libresonic/player/controller/PlayerSettingsController.java index 433467bb..0d88f127 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/controller/PlayerSettingsController.java +++ b/libresonic-main/src/main/java/org/libresonic/player/controller/PlayerSettingsController.java @@ -33,6 +33,8 @@ import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import javax.servlet.http.HttpServletRequest; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + import java.util.ArrayList; import java.util.List; @@ -104,7 +106,7 @@ public class PlayerSettingsController { } @RequestMapping(method = RequestMethod.POST) - protected String doSubmitAction(@ModelAttribute("command") PlayerSettingsCommand command, Model model) throws Exception { + protected String doSubmitAction(@ModelAttribute("command") PlayerSettingsCommand command, RedirectAttributes redirectAttributes) throws Exception { Player player = playerService.getPlayerById(command.getPlayerId()); player.setAutoControlEnabled(command.isAutoControlEnabled()); @@ -117,7 +119,8 @@ public class PlayerSettingsController { playerService.updatePlayer(player); transcodingService.setTranscodingsForPlayer(player, command.getActiveTranscodingIds()); - command.setReloadNeeded(true); + redirectAttributes.addFlashAttribute("settings_reload", true); + redirectAttributes.addFlashAttribute("settings_toast", true); return "redirect:playerSettings.view"; } diff --git a/libresonic-main/src/main/java/org/libresonic/player/controller/PodcastChannelsController.java b/libresonic-main/src/main/java/org/libresonic/player/controller/PodcastChannelsController.java index eeb898a2..a01155e1 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/controller/PodcastChannelsController.java +++ b/libresonic-main/src/main/java/org/libresonic/player/controller/PodcastChannelsController.java @@ -70,7 +70,6 @@ public class PodcastChannelsController { map.put("channels", channels); map.put("channelMap", channelMap); map.put("newestEpisodes", podcastService.getNewestEpisodes(10)); - map.put("licenseInfo", settingsService.getLicenseInfo()); return result; } diff --git a/libresonic-main/src/main/java/org/libresonic/player/controller/PodcastSettingsController.java b/libresonic-main/src/main/java/org/libresonic/player/controller/PodcastSettingsController.java index bec26a95..d8dbb347 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/controller/PodcastSettingsController.java +++ b/libresonic-main/src/main/java/org/libresonic/player/controller/PodcastSettingsController.java @@ -28,6 +28,7 @@ import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; /** * Controller for the page used to administrate the Podcast receiver. @@ -57,9 +58,7 @@ public class PodcastSettingsController { } @RequestMapping(method = RequestMethod.POST) - protected String doSubmitAction(@ModelAttribute PodcastSettingsCommand command, Model model) throws Exception { - command.setToast(true); - + protected String doSubmitAction(@ModelAttribute PodcastSettingsCommand command, RedirectAttributes redirectAttributes) throws Exception { settingsService.setPodcastUpdateInterval(Integer.parseInt(command.getInterval())); settingsService.setPodcastEpisodeRetentionCount(Integer.parseInt(command.getEpisodeRetentionCount())); settingsService.setPodcastEpisodeDownloadCount(Integer.parseInt(command.getEpisodeDownloadCount())); @@ -67,8 +66,8 @@ public class PodcastSettingsController { settingsService.save(); podcastService.schedule(); - model.addAttribute("command",command); - return "podcastSettings"; + redirectAttributes.addFlashAttribute("settings_toast", true); + return "redirect:podcastSettings.view"; } } diff --git a/libresonic-main/src/main/java/org/libresonic/player/controller/RESTController.java b/libresonic-main/src/main/java/org/libresonic/player/controller/RESTController.java index 6d99031f..a61b7fb7 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/controller/RESTController.java +++ b/libresonic-main/src/main/java/org/libresonic/player/controller/RESTController.java @@ -60,7 +60,6 @@ import org.libresonic.restapi.InternetRadioStation; import org.libresonic.restapi.InternetRadioStations; import org.libresonic.restapi.JukeboxPlaylist; import org.libresonic.restapi.JukeboxStatus; -import org.libresonic.restapi.License; import org.libresonic.restapi.Lyrics; import org.libresonic.restapi.MediaType; import org.libresonic.restapi.MusicFolders; @@ -101,7 +100,6 @@ import org.libresonic.player.domain.ArtistBio; import org.libresonic.player.domain.Bookmark; import org.libresonic.player.domain.Genre; import org.libresonic.player.domain.InternetRadio; -import org.libresonic.player.domain.LicenseInfo; import org.libresonic.player.domain.MediaFile; import org.libresonic.player.domain.MusicFolder; import org.libresonic.player.domain.MusicFolderContent; @@ -207,23 +205,6 @@ public class RESTController extends MultiActionController { jaxbWriter.writeResponse(request, response, res); } - @SuppressWarnings("UnusedDeclaration") - public void getLicense(HttpServletRequest request, HttpServletResponse response) throws Exception { - request = wrapRequest(request); - License license = new License(); - - LicenseInfo licenseInfo = settingsService.getLicenseInfo(); - - license.setEmail(licenseInfo.getLicenseEmail()); - license.setValid(licenseInfo.isLicenseValid()); - license.setLicenseExpires(jaxbWriter.convertDate(licenseInfo.getLicenseExpires())); - license.setTrialExpires(jaxbWriter.convertDate(licenseInfo.getTrialExpires())); - - Response res = createResponse(); - res.setLicense(license); - jaxbWriter.writeResponse(request, response, res); - } - @SuppressWarnings("UnusedDeclaration") public void getMusicFolders(HttpServletRequest request, HttpServletResponse response) throws Exception { request = wrapRequest(request); @@ -2489,7 +2470,6 @@ public class RESTController extends MultiActionController { PROTOCOL_MISMATCH_SERVER_TOO_OLD(30, "Incompatible Libresonic REST protocol version. Server must upgrade."), NOT_AUTHENTICATED(40, "Wrong username or password."), NOT_AUTHORIZED(50, "User is not authorized for the given operation."), - NOT_LICENSED(60, "The trial period for the Libresonic server is over. Please upgrade to Subsonic Premium. Visit libresonic.org for details."), NOT_FOUND(70, "Requested data was not found."); private final int code; diff --git a/libresonic-main/src/main/java/org/libresonic/player/controller/RightController.java b/libresonic-main/src/main/java/org/libresonic/player/controller/RightController.java index 31a39925..42ecb68b 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/controller/RightController.java +++ b/libresonic-main/src/main/java/org/libresonic/player/controller/RightController.java @@ -68,10 +68,9 @@ public class RightController { map.put("showNowPlaying", userSettings.isShowNowPlayingEnabled()); map.put("showChat", userSettings.isShowChatEnabled()); map.put("user", securityService.getCurrentUser(request)); - map.put("licenseInfo", settingsService.getLicenseInfo()); result.addObject("model", map); return result; } -} \ No newline at end of file +} diff --git a/libresonic-main/src/main/java/org/libresonic/player/controller/ShareManagementController.java b/libresonic-main/src/main/java/org/libresonic/player/controller/ShareManagementController.java index aad11bdd..4305906d 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/controller/ShareManagementController.java +++ b/libresonic-main/src/main/java/org/libresonic/player/controller/ShareManagementController.java @@ -83,7 +83,6 @@ public class ShareManagementController { } map.put("playUrl", shareService.getShareUrl(share)); - map.put("licenseInfo", settingsService.getLicenseInfo()); return new ModelAndView("createShare", "model", map); } @@ -125,4 +124,4 @@ public class ShareManagementController { return result; } -} \ No newline at end of file +} diff --git a/libresonic-main/src/main/java/org/libresonic/player/controller/ShareSettingsController.java b/libresonic-main/src/main/java/org/libresonic/player/controller/ShareSettingsController.java index b753b743..1f3de435 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/controller/ShareSettingsController.java +++ b/libresonic-main/src/main/java/org/libresonic/player/controller/ShareSettingsController.java @@ -19,25 +19,8 @@ */ package org.libresonic.player.controller; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - import org.apache.commons.lang.StringUtils; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Controller; -import org.springframework.web.bind.ServletRequestUtils; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.mvc.ParameterizableViewController; - import org.libresonic.player.domain.MediaFile; import org.libresonic.player.domain.MusicFolder; import org.libresonic.player.domain.Share; @@ -46,6 +29,20 @@ import org.libresonic.player.service.MediaFileService; import org.libresonic.player.service.SecurityService; import org.libresonic.player.service.SettingsService; import org.libresonic.player.service.ShareService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.ServletRequestUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; /** * Controller for the page used to administrate the set of shared media. @@ -65,32 +62,26 @@ public class ShareSettingsController { @Autowired private SettingsService settingsService; + @RequestMapping(method = RequestMethod.GET) - protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { + public String doGet(HttpServletRequest request, Model model) throws Exception { Map map = new HashMap(); - - if (isFormSubmission(request)) { - handleParameters(request); - map.put("toast", true); - } - map.put("shareBaseUrl", shareService.getShareBaseUrl()); map.put("shareInfos", getShareInfos(request)); map.put("user", securityService.getCurrentUser(request)); - map.put("licenseInfo", settingsService.getLicenseInfo()); - return new ModelAndView("shareSettings","model",map); + model.addAttribute("model", map); + return "shareSettings"; } - /** - * Determine if the given request represents a form submission. - * - * @param request current HTTP request - * @return if the request represents a form submission - */ - private boolean isFormSubmission(HttpServletRequest request) { - return "POST".equals(request.getMethod()); + @RequestMapping(method = RequestMethod.POST) + public String doPost(HttpServletRequest request, RedirectAttributes redirectAttributes) throws Exception { + handleParameters(request); + + redirectAttributes.addFlashAttribute("settings_toast", true); + + return "redirect:shareSettings.view"; } private void handleParameters(HttpServletRequest request) { @@ -156,7 +147,6 @@ public class ShareSettingsController { return calendar.getTime(); } - public static class ShareInfo { private final Share share; private final MediaFile dir; @@ -174,4 +164,4 @@ public class ShareSettingsController { return dir; } } -} \ No newline at end of file +} diff --git a/libresonic-main/src/main/java/org/libresonic/player/controller/SonosSettingsController.java b/libresonic-main/src/main/java/org/libresonic/player/controller/SonosSettingsController.java index 36cc02e8..ab740ad4 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/controller/SonosSettingsController.java +++ b/libresonic-main/src/main/java/org/libresonic/player/controller/SonosSettingsController.java @@ -18,23 +18,20 @@ */ package org.libresonic.player.controller; -import java.util.HashMap; -import java.util.Map; - import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - import org.apache.commons.lang.StringUtils; +import org.libresonic.player.service.SettingsService; +import org.libresonic.player.service.SonosService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; import org.springframework.web.bind.ServletRequestUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; -import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.mvc.ParameterizableViewController; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; -import org.libresonic.player.service.SettingsService; -import org.libresonic.player.service.SonosService; +import java.util.HashMap; +import java.util.Map; /** * Controller for the page used to administrate the Sonos music service settings. @@ -43,7 +40,7 @@ import org.libresonic.player.service.SonosService; */ @Controller @RequestMapping("/sonosSettings") -public class SonosSettingsController { +public class SonosSettingsController { @Autowired private SettingsService settingsService; @@ -51,30 +48,24 @@ public class SonosSettingsController { private SonosService sonosService; @RequestMapping(method = RequestMethod.GET) - protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { + public String doGet(Model model) throws Exception { Map map = new HashMap(); - if (isFormSubmission(request)) { - handleParameters(request); - map.put("toast", true); - } - map.put("sonosEnabled", settingsService.isSonosEnabled()); map.put("sonosServiceName", settingsService.getSonosServiceName()); - map.put("licenseInfo", settingsService.getLicenseInfo()); - return new ModelAndView("sonosSettings","model",map); + model.addAttribute("model", map); + return "sonosSettings"; } - /** - * Determine if the given request represents a form submission. - * - * @param request current HTTP request - * @return if the request represents a form submission - */ - private boolean isFormSubmission(HttpServletRequest request) { - return "POST".equals(request.getMethod()); + @RequestMapping(method = RequestMethod.POST) + public String doPost(HttpServletRequest request, RedirectAttributes redirectAttributes) throws Exception { + handleParameters(request); + + redirectAttributes.addFlashAttribute("settings_toast", true); + + return "redirect:sonosSettings.view"; } private void handleParameters(HttpServletRequest request) { @@ -92,4 +83,11 @@ public class SonosSettingsController { sonosService.setMusicServiceEnabled(sonosEnabled); } -} \ No newline at end of file + public void setSettingsService(SettingsService settingsService) { + this.settingsService = settingsService; + } + + public void setSonosService(SonosService sonosService) { + this.sonosService = sonosService; + } +} diff --git a/libresonic-main/src/main/java/org/libresonic/player/controller/TranscodingSettingsController.java b/libresonic-main/src/main/java/org/libresonic/player/controller/TranscodingSettingsController.java index 68b1dfb6..b857ffda 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/controller/TranscodingSettingsController.java +++ b/libresonic-main/src/main/java/org/libresonic/player/controller/TranscodingSettingsController.java @@ -25,13 +25,15 @@ import org.libresonic.player.service.SettingsService; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.servlet.ModelAndView; -import org.springframework.web.servlet.mvc.ParameterizableViewController; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + import java.util.HashMap; import java.util.Map; @@ -50,35 +52,31 @@ public class TranscodingSettingsController { private SettingsService settingsService; @RequestMapping(method = RequestMethod.GET) - protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { + public String doGet(Model model) throws Exception { Map map = new HashMap(); - if (isFormSubmission(request)) { - handleParameters(request, map); - map.put("toast", true); - } - map.put("transcodings", transcodingService.getAllTranscodings()); map.put("transcodeDirectory", transcodingService.getTranscodeDirectory()); map.put("downsampleCommand", settingsService.getDownsamplingCommand()); map.put("hlsCommand", settingsService.getHlsCommand()); map.put("brand", settingsService.getBrand()); - return new ModelAndView("transcodingSettings","model",map); + model.addAttribute("model", map); + return "transcodingSettings"; } - /** - * Determine if the given request represents a form submission. - * - * @param request current HTTP request - * @return if the request represents a form submission - */ - private boolean isFormSubmission(HttpServletRequest request) { - return "POST".equals(request.getMethod()); + @RequestMapping(method = RequestMethod.POST) + public String doPost(HttpServletRequest request, RedirectAttributes redirectAttributes) throws Exception { + String error = handleParameters(request, redirectAttributes); + if(error != null) { + redirectAttributes.addFlashAttribute("settings_toast", true); + } + redirectAttributes.addFlashAttribute("error", error); + return "redirect:transcodingSettings.view"; } - private void handleParameters(HttpServletRequest request, Map map) { + private String handleParameters(HttpServletRequest request, RedirectAttributes redirectAttributes) { for (Transcoding transcoding : transcodingService.getAllTranscodings()) { Integer id = transcoding.getId(); @@ -92,13 +90,13 @@ public class TranscodingSettingsController { if (delete) { transcodingService.deleteTranscoding(id); } else if (name == null) { - map.put("error", "transcodingsettings.noname"); + return "transcodingsettings.noname"; } else if (sourceFormats == null) { - map.put("error", "transcodingsettings.nosourceformat"); + return "transcodingsettings.nosourceformat"; } else if (targetFormat == null) { - map.put("error", "transcodingsettings.notargetformat"); + return "transcodingsettings.notargetformat"; } else if (step1 == null) { - map.put("error", "transcodingsettings.nostep1"); + return "transcodingsettings.nostep1"; } else { transcoding.setName(name); transcoding.setSourceFormats(sourceFormats); @@ -118,28 +116,30 @@ public class TranscodingSettingsController { if (name != null || sourceFormats != null || targetFormat != null || step1 != null || step2 != null) { Transcoding transcoding = new Transcoding(null, name, sourceFormats, targetFormat, step1, step2, null, defaultActive); + String error = null; if (name == null) { - map.put("error", "transcodingsettings.noname"); + error = "transcodingsettings.noname"; } else if (sourceFormats == null) { - map.put("error", "transcodingsettings.nosourceformat"); + error = "transcodingsettings.nosourceformat"; } else if (targetFormat == null) { - map.put("error", "transcodingsettings.notargetformat"); + error = "transcodingsettings.notargetformat"; } else if (step1 == null) { - map.put("error", "transcodingsettings.nostep1"); + error = "transcodingsettings.nostep1"; } else { transcodingService.createTranscoding(transcoding); } - if (map.containsKey("error")) { - map.put("newTranscoding", transcoding); + if(error != null) { + redirectAttributes.addAttribute("newTranscoding", transcoding); + return error; } } settingsService.setDownsamplingCommand(StringUtils.trim(request.getParameter("downsampleCommand"))); settingsService.setHlsCommand(StringUtils.trim(request.getParameter("hlsCommand"))); settingsService.save(); + return null; } private String getParameter(HttpServletRequest request, String name, Integer id) { return StringUtils.trimToNull(request.getParameter(name + "[" + id + "]")); } - } diff --git a/libresonic-main/src/main/java/org/libresonic/player/controller/UserSettingsController.java b/libresonic-main/src/main/java/org/libresonic/player/controller/UserSettingsController.java index 02b8c294..40a66132 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/controller/UserSettingsController.java +++ b/libresonic-main/src/main/java/org/libresonic/player/controller/UserSettingsController.java @@ -40,6 +40,8 @@ import org.springframework.web.bind.WebDataBinder; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; +import org.springframework.web.servlet.mvc.support.RedirectAttributes; + import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -51,7 +53,6 @@ import java.util.List; */ @Controller @RequestMapping("/userSettings") -@SessionAttributes(value = "command") public class UserSettingsController { @Autowired @@ -69,14 +70,15 @@ public class UserSettingsController { } @RequestMapping(method = RequestMethod.GET) - protected String displayForm() throws Exception { - return "userSettings"; - } - - @ModelAttribute - protected void formBackingObject(HttpServletRequest request,Model model) throws Exception { + protected String displayForm(HttpServletRequest request, Model model) throws Exception { UserSettingsCommand command = new UserSettingsCommand(); + command.setUsers(securityService.getAllUsers()); + command.setTranscodingSupported(transcodingService.isDownsamplingSupported(null)); + command.setTranscodeDirectory(transcodingService.getTranscodeDirectory().getPath()); + command.setTranscodeSchemes(TranscodeScheme.values()); + command.setLdapEnabled(settingsService.isLdapEnabled()); + command.setAllMusicFolders(settingsService.getAllMusicFolders()); User user = getUser(request); if (user != null) { command.setUser(user); @@ -84,22 +86,15 @@ public class UserSettingsController { command.setAdmin(User.USERNAME_ADMIN.equals(user.getUsername())); UserSettings userSettings = settingsService.getUserSettings(user.getUsername()); command.setTranscodeSchemeName(userSettings.getTranscodeScheme().name()); - + command.setAllowedMusicFolderIds(Util.toIntArray(getAllowedMusicFolderIds(user))); } else { command.setNewUser(true); command.setStreamRole(true); command.setSettingsRole(true); } - command.setUsers(securityService.getAllUsers()); - command.setTranscodingSupported(transcodingService.isDownsamplingSupported(null)); - command.setTranscodeDirectory(transcodingService.getTranscodeDirectory().getPath()); - command.setTranscodeSchemes(TranscodeScheme.values()); - command.setLdapEnabled(settingsService.isLdapEnabled()); - command.setAllMusicFolders(settingsService.getAllMusicFolders()); - command.setAllowedMusicFolderIds(Util.toIntArray(getAllowedMusicFolderIds(user))); - model.addAttribute("command",command); + return "userSettings"; } private User getUser(HttpServletRequest request) throws ServletRequestBindingException { @@ -126,7 +121,7 @@ public class UserSettingsController { } @RequestMapping(method = RequestMethod.POST) - protected String doSubmitAction(@ModelAttribute("command") @Validated UserSettingsCommand command) throws Exception { + protected String doSubmitAction(@ModelAttribute("command") @Validated UserSettingsCommand command, RedirectAttributes redirectAttributes) throws Exception { if (command.isDeleteUser()) { deleteUser(command); @@ -135,9 +130,10 @@ public class UserSettingsController { } else { updateUser(command); } - resetCommand(command); + redirectAttributes.addFlashAttribute("settings_reload", true); + redirectAttributes.addFlashAttribute("settings_toast", true); - return "userSettings"; + return "redirect:userSettings.view"; } private void deleteUser(UserSettingsCommand command) { @@ -181,22 +177,4 @@ public class UserSettingsController { settingsService.setMusicFoldersForUser(command.getUsername(), allowedMusicFolderIds); } - private void resetCommand(UserSettingsCommand command) { - command.setUser(null); - command.setUsers(securityService.getAllUsers()); - command.setDeleteUser(false); - command.setPasswordChange(false); - command.setNewUser(true); - command.setStreamRole(true); - command.setSettingsRole(true); - command.setPassword(null); - command.setConfirmPassword(null); - command.setEmail(null); - command.setTranscodeSchemeName(null); - command.setAllMusicFolders(settingsService.getAllMusicFolders()); - command.setAllowedMusicFolderIds(Util.toIntArray(getAllowedMusicFolderIds(null))); - command.setToast(true); - command.setReload(true); - } - } diff --git a/libresonic-main/src/main/java/org/libresonic/player/controller/VideoPlayerController.java b/libresonic-main/src/main/java/org/libresonic/player/controller/VideoPlayerController.java index b585d43b..4cc8b3f1 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/controller/VideoPlayerController.java +++ b/libresonic-main/src/main/java/org/libresonic/player/controller/VideoPlayerController.java @@ -85,7 +85,6 @@ public class VideoPlayerController extends ParameterizableViewController { map.put("duration", duration); map.put("bitRates", BIT_RATES); map.put("defaultBitRate", DEFAULT_BIT_RATE); - map.put("licenseInfo", settingsService.getLicenseInfo()); map.put("user", user); ModelAndView result = super.handleRequestInternal(request, response); diff --git a/libresonic-main/src/main/java/org/libresonic/player/domain/AlbumNotes.java b/libresonic-main/src/main/java/org/libresonic/player/domain/AlbumNotes.java new file mode 100644 index 00000000..d3d48237 --- /dev/null +++ b/libresonic-main/src/main/java/org/libresonic/player/domain/AlbumNotes.java @@ -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 . + * + * 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; + } +} diff --git a/libresonic-main/src/main/java/org/libresonic/player/domain/LastFmCoverArt.java b/libresonic-main/src/main/java/org/libresonic/player/domain/LastFmCoverArt.java new file mode 100644 index 00000000..d328113a --- /dev/null +++ b/libresonic-main/src/main/java/org/libresonic/player/domain/LastFmCoverArt.java @@ -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 . + * + * 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; + } +} + diff --git a/libresonic-main/src/main/java/org/libresonic/player/domain/LicenseInfo.java b/libresonic-main/src/main/java/org/libresonic/player/domain/LicenseInfo.java deleted file mode 100644 index ca56766a..00000000 --- a/libresonic-main/src/main/java/org/libresonic/player/domain/LicenseInfo.java +++ /dev/null @@ -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 . - - 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; - } -} diff --git a/libresonic-main/src/main/java/org/libresonic/player/security/RESTRequestParameterProcessingFilter.java b/libresonic-main/src/main/java/org/libresonic/player/security/RESTRequestParameterProcessingFilter.java index efa374b6..f5274148 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/security/RESTRequestParameterProcessingFilter.java +++ b/libresonic-main/src/main/java/org/libresonic/player/security/RESTRequestParameterProcessingFilter.java @@ -24,7 +24,6 @@ import org.apache.commons.lang.StringUtils; import org.libresonic.player.Logger; import org.libresonic.player.controller.JAXBWriter; import org.libresonic.player.controller.RESTController; -import org.libresonic.player.domain.LicenseInfo; import org.libresonic.player.domain.User; import org.libresonic.player.domain.Version; import org.libresonic.player.service.SecurityService; @@ -99,10 +98,6 @@ public class RESTRequestParameterProcessingFilter implements Filter { errorCode = authenticate(username, password, salt, token, previousAuth); } - if (errorCode == null) { - errorCode = checkLicense(client); - } - if (errorCode == null) { chain.doFilter(request, response); } else { @@ -162,15 +157,6 @@ public class RESTRequestParameterProcessingFilter implements Filter { return RESTController.ErrorCode.MISSING_PARAMETER; } - private RESTController.ErrorCode checkLicense(String client) { - LicenseInfo licenseInfo = settingsService.getLicenseInfo(); - if (licenseInfo.isLicenseOrTrialValid()) { - return null; - } - LOG.info("REST access for client '" + client + "' has expired."); - return RESTController.ErrorCode.NOT_LICENSED; - } - public static String decrypt(String s) { if (s == null) { return null; diff --git a/libresonic-main/src/main/java/org/libresonic/player/service/LastFmExpirationPolicy.java b/libresonic-main/src/main/java/org/libresonic/player/service/LastFmExpirationPolicy.java new file mode 100644 index 00000000..e5a378a5 --- /dev/null +++ b/libresonic-main/src/main/java/org/libresonic/player/service/LastFmExpirationPolicy.java @@ -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 . + * + * 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 methodToExpirationTime = new LinkedHashMap() {{ + 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 params) { + Long expirationTime = methodToExpirationTime.get(method); + return expirationTime == null ? ONE_YEAR : expirationTime; + } +} + diff --git a/libresonic-main/src/main/java/org/libresonic/player/service/LastFmService.java b/libresonic-main/src/main/java/org/libresonic/player/service/LastFmService.java index fcb75ce6..037c8d7e 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/service/LastFmService.java +++ b/libresonic-main/src/main/java/org/libresonic/player/service/LastFmService.java @@ -22,6 +22,7 @@ package org.libresonic.player.service; import java.io.File; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.List; @@ -30,13 +31,23 @@ import java.util.regex.Pattern; import org.apache.commons.lang.StringUtils; +import com.google.common.base.Function; +import com.google.common.base.Predicates; +import com.google.common.collect.FluentIterable; +import com.google.common.collect.Lists; + +import de.umass.lastfm.Album; import de.umass.lastfm.Artist; import de.umass.lastfm.Caller; import de.umass.lastfm.ImageSize; import de.umass.lastfm.Track; +import de.umass.lastfm.cache.Cache; + import org.libresonic.player.Logger; import org.libresonic.player.dao.ArtistDao; import org.libresonic.player.dao.MediaFileDao; +import org.libresonic.player.domain.LastFmCoverArt; +import org.libresonic.player.domain.AlbumNotes; import org.libresonic.player.domain.ArtistBio; import org.libresonic.player.domain.MediaFile; import org.libresonic.player.domain.MusicFolder; @@ -273,6 +284,96 @@ public class LastFmService { } } + /** + * Returns album notes and images. + * + * @param mediaFile The media file (song or album). + * @return Album notes. + */ + public AlbumNotes getAlbumNotes(MediaFile mediaFile) { + return getAlbumNotes(getCanonicalArtistName(getArtistName(mediaFile)), mediaFile.getAlbumName()); + } + + /** + * Returns album notes and images. + * + * @param album The album. + * @return Album notes. + */ + public AlbumNotes getAlbumNotes(org.libresonic.player.domain.Album album) { + return getAlbumNotes(getCanonicalArtistName(album.getArtist()), album.getName()); + } + + /** + * Returns album notes and images. + * + * @param artist The artist name. + * @param album The album name. + * @return Album notes. + */ + private AlbumNotes getAlbumNotes(String artist, String album) { + if (artist == null || album == null) { + return null; + } + try { + Album info = Album.getInfo(artist, album, LAST_FM_KEY); + if (info == null) { + return null; + } + return new AlbumNotes(processWikiText(info.getWikiSummary()), + info.getMbid(), + info.getUrl(), + info.getImageURL(ImageSize.MEDIUM), + info.getImageURL(ImageSize.LARGE), + info.getImageURL(ImageSize.MEGA)); + } catch (Throwable x) { + LOG.warn("Failed to find album notes for " + artist + " - " + album, x); + return null; + } + } + + public List searchCoverArt(String artist, String album) { + if (artist == null && album == null) { + return Collections.emptyList(); + } + try { + StringBuilder query = new StringBuilder(); + if (artist != null) { + query.append(artist).append(" "); + } + if (album != null) { + query.append(album); + } + + Collection matches = Album.search(query.toString(), LAST_FM_KEY); + return FluentIterable.from(matches) + .transform(new Function() { + @Override + public LastFmCoverArt apply(Album album) { + return convert(album); + } + }) + .filter(Predicates.notNull()) + .toList(); + } catch (Throwable x) { + LOG.warn("Failed to search for cover art for " + artist + " - " + album, x); + return Collections.emptyList(); + } + } + + private LastFmCoverArt convert(Album album) { + String imageUrl = null; + for (ImageSize imageSize : Lists.reverse(Arrays.asList(ImageSize.values()))) { + imageUrl = StringUtils.trimToNull(album.getImageURL(imageSize)); + if (imageUrl != null) { + break; + } + } + + return imageUrl == null ? null : new LastFmCoverArt(imageUrl, album.getArtist(), album.getName()); + } + + private ArtistBio getArtistBio(String artistName) { try { if (artistName == null) { diff --git a/libresonic-main/src/main/java/org/libresonic/player/service/NetworkService.java b/libresonic-main/src/main/java/org/libresonic/player/service/NetworkService.java index 1992c0ea..1d0d89e3 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/service/NetworkService.java +++ b/libresonic-main/src/main/java/org/libresonic/player/service/NetworkService.java @@ -232,8 +232,6 @@ public class NetworkService { HttpPost request = new HttpPost(enable ? URL_REDIRECTION_REGISTER_URL : URL_REDIRECTION_UNREGISTER_URL); int port = settingsService.getPort(); - boolean trial = !settingsService.isLicenseValid(); - Date trialExpires = settingsService.getTrialExpires(); List params = new ArrayList(); params.add(new BasicNameValuePair("serverId", settingsService.getServerId())); @@ -242,12 +240,6 @@ public class NetworkService { params.add(new BasicNameValuePair("localIp", settingsService.getLocalIpAddress())); params.add(new BasicNameValuePair("localPort", String.valueOf(port))); params.add(new BasicNameValuePair("contextPath", settingsService.getUrlRedirectContextPath())); - params.add(new BasicNameValuePair("trial", String.valueOf(trial))); - if (trial && trialExpires != null) { - params.add(new BasicNameValuePair("trialExpires", String.valueOf(trialExpires.getTime()))); - } else { - params.add(new BasicNameValuePair("licenseHolder", settingsService.getLicenseEmail())); - } diff --git a/libresonic-main/src/main/java/org/libresonic/player/service/PodcastService.java b/libresonic-main/src/main/java/org/libresonic/player/service/PodcastService.java index 7fd2ab9d..cd6e5b4d 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/service/PodcastService.java +++ b/libresonic-main/src/main/java/org/libresonic/player/service/PodcastService.java @@ -535,10 +535,6 @@ public class PodcastService { try (CloseableHttpClient client = HttpClients.createDefault()) { - if (!settingsService.getLicenseInfo().isLicenseOrTrialValid()) { - throw new Exception("Sorry, the trial period is expired."); - } - PodcastChannel channel = getChannel(episode.getChannelId()); RequestConfig requestConfig = RequestConfig.custom() .setConnectTimeout(2 * 60 * 1000) // 2 minutes diff --git a/libresonic-main/src/main/java/org/libresonic/player/service/SettingsService.java b/libresonic-main/src/main/java/org/libresonic/player/service/SettingsService.java index 44bcd48d..1f7185b7 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/service/SettingsService.java +++ b/libresonic-main/src/main/java/org/libresonic/player/service/SettingsService.java @@ -52,7 +52,6 @@ import org.libresonic.player.dao.UserDao; import org.libresonic.player.domain.AlbumListType; import org.libresonic.player.domain.Avatar; import org.libresonic.player.domain.InternetRadio; -import org.libresonic.player.domain.LicenseInfo; import org.libresonic.player.domain.MediaLibraryStatistics; import org.libresonic.player.domain.MusicFolder; import org.libresonic.player.domain.Theme; @@ -73,9 +72,6 @@ public class SettingsService { private static final File LIBRESONIC_HOME_WINDOWS = new File("c:/libresonic"); private static final File LIBRESONIC_HOME_OTHER = new File("/var/libresonic"); - // Number of free trial days. - public static final long TRIAL_DAYS = 30L; - // Global settings. private static final String KEY_INDEX_STRING = "IndexString"; private static final String KEY_IGNORED_ARTICLES = "IgnoredArticles"; @@ -102,9 +98,6 @@ public class SettingsService { private static final String KEY_PODCAST_EPISODE_DOWNLOAD_COUNT = "PodcastEpisodeDownloadCount"; private static final String KEY_DOWNLOAD_BITRATE_LIMIT = "DownloadBitrateLimit"; private static final String KEY_UPLOAD_BITRATE_LIMIT = "UploadBitrateLimit"; - private static final String KEY_LICENSE_EMAIL = "LicenseEmail"; - private static final String KEY_LICENSE_CODE = "LicenseCode"; - private static final String KEY_LICENSE_DATE = "LicenseDate"; private static final String KEY_DOWNSAMPLING_COMMAND = "DownsamplingCommand4"; private static final String KEY_HLS_COMMAND = "HlsCommand3"; private static final String KEY_JUKEBOX_COMMAND = "JukeboxCommand2"; @@ -131,7 +124,6 @@ public class SettingsService { private static final String KEY_ORGANIZE_BY_FOLDER_STRUCTURE = "OrganizeByFolderStructure"; private static final String KEY_SORT_ALBUMS_BY_YEAR = "SortAlbumsByYear"; private static final String KEY_MEDIA_LIBRARY_STATISTICS = "MediaLibraryStatistics"; - private static final String KEY_TRIAL_EXPIRES = "TrialExpires"; private static final String KEY_DLNA_ENABLED = "DlnaEnabled"; private static final String KEY_DLNA_SERVER_NAME = "DlnaServerName"; private static final String KEY_SONOS_ENABLED = "SonosEnabled"; @@ -178,9 +170,6 @@ public class SettingsService { private static final int DEFAULT_PODCAST_EPISODE_DOWNLOAD_COUNT = 1; private static final long DEFAULT_DOWNLOAD_BITRATE_LIMIT = 0; private static final long DEFAULT_UPLOAD_BITRATE_LIMIT = 0; - private static final String DEFAULT_LICENSE_EMAIL = null; - private static final String DEFAULT_LICENSE_CODE = null; - private static final String DEFAULT_LICENSE_DATE = null; private static final String DEFAULT_DOWNSAMPLING_COMMAND = "ffmpeg -i %s -map 0:0 -b:a %bk -v 0 -f mp3 -"; private static final String DEFAULT_HLS_COMMAND = "ffmpeg -ss %o -t %d -i %s -async 1 -b:v %bk -s %wx%h -ar 44100 -ac 2 -v 0 -f mpegts -c:v libx264 -preset superfast -c:a libmp3lame -threads 0 -"; private static final String DEFAULT_JUKEBOX_COMMAND = "ffmpeg -ss %o -i %s -map 0:0 -v 0 -ar 44100 -ac 2 -f s16be -"; @@ -206,7 +195,6 @@ public class SettingsService { private static final boolean DEFAULT_ORGANIZE_BY_FOLDER_STRUCTURE = true; private static final boolean DEFAULT_SORT_ALBUMS_BY_YEAR = true; private static final String DEFAULT_MEDIA_LIBRARY_STATISTICS = "0 0 0 0 0"; - private static final String DEFAULT_TRIAL_EXPIRES = null; private static final boolean DEFAULT_DLNA_ENABLED = false; private static final String DEFAULT_DLNA_SERVER_NAME = "Libresonic"; private static final boolean DEFAULT_SONOS_ENABLED = false; @@ -223,7 +211,7 @@ public class SettingsService { // Array of obsolete keys. Used to clean property file. private static final List OBSOLETE_KEYS = Arrays.asList("PortForwardingPublicPort", "PortForwardingLocalPort", "DownsamplingCommand", "DownsamplingCommand2", "DownsamplingCommand3", "AutoCoverBatch", "MusicMask", - "VideoMask", "CoverArtMask, HlsCommand", "HlsCommand2", "JukeboxCommand", "UrlRedirectTrialExpires", "VideoTrialExpires", + "VideoMask", "CoverArtMask, HlsCommand", "HlsCommand2", "JukeboxCommand", "CoverArtFileTypes", "UrlRedirectCustomHost", "CoverArtLimit", "StreamPort"); private static final String LOCALES_FILE = "/org/libresonic/player/i18n/locales.txt"; @@ -248,12 +236,6 @@ public class SettingsService { private static File libresonicHome; - private boolean licenseValidated = true; - private Date licenseExpires; - private final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); - private ScheduledFuture licenseValidationFuture; - - private static final long LICENSE_VALIDATION_DELAY_HOURS = 12; private static final long LOCAL_IP_LOOKUP_DELAY_SECONDS = 60; private String localIpAddress; @@ -280,16 +262,9 @@ public class SettingsService { } } } - - // Start trial. - if (getTrialExpires() == null) { - Date expiryDate = new Date(System.currentTimeMillis() + TRIAL_DAYS * 24L * 3600L * 1000L); - setTrialExpires(expiryDate); - } - - save(false); } + /** * Register in service locator so that non-Spring objects can access me. * This method is invoked automatically by Spring. @@ -298,7 +273,6 @@ public class SettingsService { logServerInfo(); ServiceLocator.setSettingsService(this); scheduleLocalIpAddressLookup(); - scheduleLicenseValidation(); } private void logServerInfo() { @@ -650,49 +624,6 @@ public class SettingsService { setLong(KEY_UPLOAD_BITRATE_LIMIT, limit); } - public String getLicenseEmail() { - return properties.getProperty(KEY_LICENSE_EMAIL, DEFAULT_LICENSE_EMAIL); - } - - public void setLicenseEmail(String email) { - setProperty(KEY_LICENSE_EMAIL, email); - } - - public String getLicenseCode() { - return properties.getProperty(KEY_LICENSE_CODE, DEFAULT_LICENSE_CODE); - } - - public void setLicenseCode(String code) { - setProperty(KEY_LICENSE_CODE, code); - } - - public Date getLicenseDate() { - String value = properties.getProperty(KEY_LICENSE_DATE, DEFAULT_LICENSE_DATE); - return value == null ? null : new Date(Long.parseLong(value)); - } - - public void setLicenseDate(Date date) { - String value = (date == null ? null : String.valueOf(date.getTime())); - setProperty(KEY_LICENSE_DATE, value); - } - - public boolean isLicenseValid() { - return true; - } - - public boolean isLicenseValid(String email, String license) { - return true; - } - - public LicenseInfo getLicenseInfo() { - Date trialExpires = getTrialExpires(); - Date now = new Date(); - boolean trialValid = trialExpires.after(now); - long trialDaysLeft = trialValid ? (trialExpires.getTime() - now.getTime()) / (24L * 3600L * 1000L) : 0L; - - return new LicenseInfo(getLicenseEmail(), isLicenseValid(), trialExpires, trialDaysLeft, licenseExpires); - } - public String getDownsamplingCommand() { return properties.getProperty(KEY_DOWNSAMPLING_COMMAND, DEFAULT_DOWNSAMPLING_COMMAND); } @@ -846,16 +777,6 @@ public class SettingsService { properties.setProperty(KEY_URL_REDIRECT_TYPE, urlRedirectType.name()); } - public Date getTrialExpires() { - String value = properties.getProperty(KEY_TRIAL_EXPIRES, DEFAULT_TRIAL_EXPIRES); - return value == null ? null : new Date(Long.parseLong(value)); - } - - private void setTrialExpires(Date date) { - String value = (date == null ? null : String.valueOf(date.getTime())); - setProperty(KEY_TRIAL_EXPIRES, value); - } - public String getUrlRedirectContextPath() { return properties.getProperty(KEY_URL_REDIRECT_CONTEXT_PATH, DEFAULT_URL_REDIRECT_CONTEXT_PATH); } @@ -1406,35 +1327,12 @@ public class SettingsService { return result.toArray(new String[result.size()]); } - private void validateLicense() { - String email = getLicenseEmail(); - Date date = getLicenseDate(); - licenseValidated = true; - return; - } - - public synchronized void scheduleLicenseValidation() { - if (licenseValidationFuture != null) { - licenseValidationFuture.cancel(true); - } - Runnable task = new Runnable() { - public void run() { - validateLicense(); - } - }; - licenseValidated = true; - licenseExpires = null; - - licenseValidationFuture = executor.scheduleWithFixedDelay(task, 0L, LICENSE_VALIDATION_DELAY_HOURS, TimeUnit.HOURS); - } - private void scheduleLocalIpAddressLookup() { Runnable task = new Runnable() { public void run() { localIpAddress = Util.getLocalIpAddress(); } }; - executor.scheduleWithFixedDelay(task, 0L, LOCAL_IP_LOOKUP_DELAY_SECONDS, TimeUnit.SECONDS); } public void setInternetRadioDao(InternetRadioDao internetRadioDao) { diff --git a/libresonic-main/src/main/java/org/libresonic/player/service/SonosService.java b/libresonic-main/src/main/java/org/libresonic/player/service/SonosService.java index 86c0815d..e9a1e013 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/service/SonosService.java +++ b/libresonic-main/src/main/java/org/libresonic/player/service/SonosService.java @@ -347,10 +347,6 @@ public class SonosService implements SonosSoap { throw new SonosSoapFault.LoginInvalid(); } - if (!settingsService.getLicenseInfo().isLicenseOrTrialValid()) { - throw new SonosSoapFault.LoginUnauthorized(); - } - // Use username as session ID for easy access to it later. GetSessionIdResponse result = new GetSessionIdResponse(); result.setGetSessionIdResult(user.getUsername()); diff --git a/libresonic-main/src/main/java/org/libresonic/player/service/UPnPService.java b/libresonic-main/src/main/java/org/libresonic/player/service/UPnPService.java index a4d37aee..e33efe10 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/service/UPnPService.java +++ b/libresonic-main/src/main/java/org/libresonic/player/service/UPnPService.java @@ -125,11 +125,9 @@ public class UPnPService { // TODO: DLNACaps Version version = versionService.getLocalVersion(); String versionString = version == null ? null : version.toString(); - String licenseEmail = settingsService.getLicenseEmail(); - String licenseString = licenseEmail == null ? "Unlicensed" : ("Licensed to " + licenseEmail); DeviceDetails details = new DeviceDetails(serverName, new ManufacturerDetails(serverName), - new ModelDetails(serverName, licenseString, versionString), + new ModelDetails(serverName), new DLNADoc[]{new DLNADoc("DMS", DLNADoc.Version.V1_5)}, null); Icon icon = new Icon("image/png", 512, 512, 32, getClass().getResource("logo-512.png")); diff --git a/libresonic-main/src/main/java/org/libresonic/player/service/upnp/FolderBasedContentDirectory.java b/libresonic-main/src/main/java/org/libresonic/player/service/upnp/FolderBasedContentDirectory.java index 7323039d..a706e062 100644 --- a/libresonic-main/src/main/java/org/libresonic/player/service/upnp/FolderBasedContentDirectory.java +++ b/libresonic-main/src/main/java/org/libresonic/player/service/upnp/FolderBasedContentDirectory.java @@ -67,11 +67,6 @@ public class FolderBasedContentDirectory extends LibresonicContentDirectory { public BrowseResult browse(String objectId, BrowseFlag browseFlag, String filter, long firstResult, long maxResults, SortCriterion[] orderby) throws ContentDirectoryException { - if (!settingsService.getLicenseInfo().isLicenseOrTrialValid()) { - LOG.warn("UPnP/DLNA media server not available. Please upgrade to Subsonic Premium."); - throw new ContentDirectoryException(ContentDirectoryErrorCode.CANNOT_PROCESS, "Please upgrade to Subsonic Premium"); - } - LOG.info("UPnP request - objectId: " + objectId + ", browseFlag: " + browseFlag + ", filter: " + filter + ", firstResult: " + firstResult + ", maxResults: " + maxResults); diff --git a/libresonic-main/src/main/java/org/libresonic/player/spring/LoggingExceptionResolver.java b/libresonic-main/src/main/java/org/libresonic/player/spring/LoggingExceptionResolver.java new file mode 100644 index 00000000..14c753a4 --- /dev/null +++ b/libresonic-main/src/main/java/org/libresonic/player/spring/LoggingExceptionResolver.java @@ -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; + } +} diff --git a/libresonic-main/src/main/resources/applicationContext-service.xml b/libresonic-main/src/main/resources/applicationContext-service.xml index daa22901..45e6f641 100644 --- a/libresonic-main/src/main/resources/applicationContext-service.xml +++ b/libresonic-main/src/main/resources/applicationContext-service.xml @@ -274,6 +274,7 @@ + diff --git a/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_cs.properties b/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_cs.properties index 97c8dd83..9967b82b 100644 --- a/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_cs.properties +++ b/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_cs.properties @@ -25,8 +25,6 @@ common.confirm = Potvr\u010Fte common.unknown = (Nezn\u00E1m\u00FD) common.default = (V\u00FDchoz\u00ED) common.settingssaved = Nastaven\u00ED byla ulo\u017Eena. -common.trialexpired = Zku\u0161ebn\u00ED doba vypr\u0161ela {0}. Z\u00EDskejte Subsonic Premium pro pou\u017Eit\u00ED t\u00E9to funkce. -common.trialnotexpired = Tato funkce je dostupn\u00E1 do {0}. Pot\u00E9 mus\u00EDte z\u00EDskat Subsonic Premium. # login.jsp login.username = U\u017Eivatelsk\u00E9 jm\u00E9no @@ -73,9 +71,6 @@ top.upgrade = Je dostupn\u00E1 nov\u00E1 verze. St\u00E1hnout {0} {1} \ zde. top.missing = Nebyly nalezeny \u017E\u00E1dn\u00E9 slo\u017Eky m\u00E9di\u00ED. Zm\u011B\u0148te nastaven\u00ED. top.logout = Odhl\u00E1sit u\u017Eivatele {0} -top.getpremium = Z\u00EDskat Subsonic Premium -top.gotpremium = Subsonic Premium -top.trialdaysleft = Zb\u00FDv\u00E1 {0} dn\u016F zku\u0161ebn\u00ED doby # left.jsp left.scanning = Prohled\u00E1v\u00E1n\u00ED slo\u017Eek m\u00E9di\u00ED... @@ -268,10 +263,6 @@ upload.unzipped = Rozbaleno {0} help.title = O aplikaci {0} help.upgrade = Pozor! Je dostupn\u00E1 nov\u00E1 verze. St\u00E1hnout {0} {1} \ zde. -help.premium.title = Licence -help.premium.expires = (vypr\u0161\u00ED {0}) -help.premium.upgrade = Upgradujte na Subsonic Premium, abyste si u\u017Eili spoustu funkc\u00ED nav\u00EDc! -help.premium.expired = (Licence vypr\u0161ela {0}) help.version.title = Verze help.builddate.title = Datum sestaven\u00ED help.server.title = Server @@ -568,7 +559,6 @@ main.sharealbum = Sd\u00EDlet main.more = V\u00EDce akc\u00ED... main.more.selection = Vybran\u00E9 skladby... main.more.share = Sd\u00EDlet -main.premium = Z\u00EDskat Subsonic Premium
(a odebrat tuto reklamu) main.nowplaying = P\u0159ehr\u00E1v\u00E1n\u00ED main.lyrics = Texty main.minutesago = minut zp\u011Bt @@ -637,33 +627,6 @@ share.disabled = Abyste s n\u011Bk\u00FDm mohli sd\u00EDlet svou hudbu, mus\u00E P\u0159ejd\u011Bte na Nastaven\u00ED > S\u00ED\u0165 (jsou vy\u017Eadov\u00E1na opr\u00E1vn\u011Bn\u00ED administr\u00E1tora). share.manage = Spravovat m\u00E1 sd\u00EDlen\u00E1 m\u00E9dia -# premium.jsp -premium.title = Subsonic Premium -premium.invalidlicense = Neplatn\u00FD licen\u010Dn\u00ED kl\u00ED\u010D. -premium.text =

Upgradujte na Subsonic Premium, abyste si u\u017Eili tyto dal\u0161\u00ED funkce:

\ -
    \ -
  • Aplikace pro Android, iPhone, Blackberry a Windows Phone*.
  • \ -
  • Aplikace pro Mac, Windows, Chrome, Roku a spoustu dal\u0161\u00EDch*.
  • \ -
  • Streamov\u00E1n\u00ED videa.
  • \ -
  • P\u0159ij\u00EDma\u010D Podcast\u016F.
  • \ -
  • Va\u0161e osobn\u00ED serverov\u00E1 adresa: vasejmeno.libresonic.org (viz Nastaven\u00ED > S\u00ED\u0165).
  • \ -
  • P\u0159ehr\u00E1v\u00E1n\u00ED sv\u00FDch m\u00E9di\u00ED na kompatibiln\u00EDch za\u0159\u00EDzen\u00EDch DLNA a UPnP.
  • \ -
  • Sd\u00EDlen\u00ED sv\u00FDch m\u00E9di\u00ED na Facebooku, Twitteru, Google+.
  • \ -
  • \u017D\u00E1dn\u00E9 reklamy ve webov\u00E9m rozhran\u00ED.
  • \ -
  • Ostatn\u00ED funkce, kter\u00E9 budou spu\u0161t\u011Bny pozd\u011Bji.
  • \ -
\ -

* N\u011Bkter\u00E9 aplikace mus\u00ED b\u00FDt zakoupeny samostatn\u011B.

-premium.getpremium = Z\u00EDskat Subsonic Premium -premium.licensed = M\u00E1te platnou licenci Subsonic Premium! -premium.licensedexpires = Va\u0161e licence Subsonic Premium je platn\u00E1 do {0} -premium.licensedexpired = Va\u0161e licence Subsonic Premium vypr\u0161ela {0} -premium.licensedto = Licence je registrov\u00E1na na u\u017Eivatele {0}. -premium.forcechange = Registrovat jin\u00FD licen\u010Dn\u00ED kl\u00ED\u010D -premium.register = P\u0159i upgradu na Subsonic Premium obdr\u017E\u00EDte licen\u010Dn\u00ED kl\u00ED\u010D e-mailem. Zaregistrujte se n\u00ED\u017Ee. -premium.resend = Ztracen\u00FD licen\u010Dn\u00ED kl\u00ED\u010D? Poslat ho znovu. -premium.register.email = E-mail -premium.register.license = Licen\u010Dn\u00ED kl\u00ED\u010D - # podcastReceiver.jsp podcastreceiver.title = P\u0159ij\u00EDma\u010D Podcast\u016F podcastreceiver.expandall = Zobrazit epizody diff --git a/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_de.properties b/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_de.properties index b7da1d8a..8f31fc8a 100644 --- a/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_de.properties +++ b/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_de.properties @@ -530,33 +530,6 @@ share.disabled = Um Musik mit jemanden teilen zu k\u00F6nnen musst du erst deine Bitte wechsle zu Settings > Network (Administratorrechte werden ben\u00F6tigt). share.manage = Meine geteilten Medien verwalten -# premium.jsp -premium.title = Subsonic Premium -premium.invalidlicense = Ung\u00FCltiger Lizenzschl\u00FCssel. -premium.text =

Upgrade zu Subsonic Premium um diese Funktionen zu geniessen:

\ -
    \ -
  • Apps f\u00FCr Android, iPhone, Windows Phone, Mac, Chrome und mehr*.
  • \ -
  • Videostreaming.
  • \ -
  • Streame zu deinen Chromecast und Sonos Ger\u00E4ten.
  • \ -
  • Podcast Empf\u00E4nger.
  • \ -
  • Deine pers\u00F6nliche Serveradresse: deinname.libresonic.org (siehe Einstellungen > Netzwerk).
  • \ -
  • Spiele deine Medien auf kompatiblen DLNA/UPnP Ger\u00E4ten.
  • \ -
  • Teile deine Medien auf Facebook, Twitter, Google+.
  • \ -
  • Keine Werbung im Webinterface.
  • \ -
  • Weitere Funktionen die sp\u00E4ter ver\u00F6ffentlicht werden.
  • \ -
\ -

* Einige Apps m\u00FCssen seperat gekauft werden.

-premium.getpremium = Erhalte Subsonic Premium -premium.licensed = Du hast eine g\u00FCltige Subsonic Premium Lizenz! -premium.licensedexpires = Deine Subsonic Premium Lizenz ist g\u00FCltig bis {0} -premium.licensedexpired = Deine Subsonic Premium Lizenz ist abgelaufen am {0} -premium.licensedto = Die Lizenz ist registriert f\u00FCr {0}. -premium.forcechange = Einen anderen Lizenzschl\u00FCssel registrieren -premium.register = Bei einem Upgrade auf Subsonic Premium erhalten sie ihren Lizenzschl\u00FCssel per Email. Bitte registrieren sie sich unten. -premium.resend = Lizenzschl\u00FCssel verloren? Erneut zusenden. -premium.register.email = Email -premium.register.license = License key - # userSettings.jsp usersettings.title = Benutzer ausw\u00E4hlen usersettings.newuser = Neuer Benutzer diff --git a/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_en.properties b/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_en.properties index 25cff3ab..512346ff 100644 --- a/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_en.properties +++ b/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_en.properties @@ -24,8 +24,6 @@ common.confirm = Please confirm common.unknown = (Unknown) common.default = (Default) common.settingssaved = Settings were saved. -common.trialexpired = The trial period expired on {0}. Get Subsonic Premium to use this feature. -common.trialnotexpired = This feature is available until {0}. After that you must get Subsonic Premium. # login.jsp login.username = Username @@ -73,9 +71,6 @@ top.upgrade = A new version is available. Download {0} {1} \ here. top.missing = No media folders found. Please change the settings. top.logout = Log out {0} -top.getpremium = Get Subsonic Premium -top.gotpremium = Subsonic Premium -top.trialdaysleft = {0} day(s) left of trial # left.jsp left.scanning = Scanning media folders... @@ -146,7 +141,6 @@ importPlaylist.error = Failed to import playlist. {0} # videoPlayer.jsp videoPlayer.getflash = Please install Flash Player -videoPlayer.getpremium = Get Subsonic Premium to play on Chromecast. # status.jsp status.title = Status @@ -316,10 +310,6 @@ upload.unzipped = Unzipped {0} help.title = About {0} help.upgrade = Note! A new version is available. Download {0} {1} \ here. -help.premium.title = License -help.premium.expires = (expires {0}) -help.premium.upgrade = Upgrade to Subsonic Premium to enjoy lots of extra features! -help.premium.expired = (License expired {0}) help.version.title = Version help.builddate.title = Build date help.server.title = Server @@ -344,7 +334,6 @@ settingsheader.podcast = Podcast settingsheader.player = Players settingsheader.dlna = DLNA/UPnP settingsheader.sonos = Sonos -settingsheader.premium = Subsonic Premium settingsheader.share = Shared media settingsheader.network = Network settingsheader.transcoding = Transcoding @@ -642,7 +631,6 @@ main.sharealbum = Share main.more = More actions... main.more.selection = Selected songs... main.more.share = Share -main.premium = Get Subsonic Premium
(and remove this ad) main.nowplaying = Now playing main.lyrics = Lyrics main.minutesago = minutes ago @@ -678,11 +666,12 @@ changecoverart.title = Change cover art changecoverart.address = Or enter image address changecoverart.artist = Artist changecoverart.album = Album -changecoverart.search = Google Image Search +changecoverart.search = Search Last.fm changecoverart.wait = Please wait... changecoverart.success = Image was successfully downloaded. changecoverart.error = Failed to download image. changecoverart.noimagesfound = No images found. +changecoverart.courtesy = Images courtesy of Last.fm # changeCoverArtConfirm.jsp changeCoverArtConfirm.failed = Failed to change cover art:
"{0}" @@ -718,33 +707,6 @@ share.disabled = To share your music with someone you must first register your o Please go to Settings > Network (administrative rights required). share.manage = Manage my shared media -# premium.jsp -premium.title = Subsonic Premium -premium.invalidlicense = Invalid license key. -premium.text =

Upgrade to Subsonic Premium to enjoy these extra features:

\ -
    \ -
  • Apps for Android, iPhone, Windows Phone, Mac, Chrome and more*.
  • \ -
  • Video streaming.
  • \ -
  • Stream to your Chromecast and Sonos devices.
  • \ -
  • Podcast receiver.
  • \ -
  • Your personal server address: yourname.libresonic.org (see Settings > Network).
  • \ -
  • Play your media on compatible DLNA/UPnP devices.
  • \ -
  • Share your media on Facebook, Twitter, Google+.
  • \ -
  • No ads in the web interface.
  • \ -
  • Other features to be released later.
  • \ -
\ -

* Some apps must be purchased separately.

-premium.getpremium = Get Subsonic Premium -premium.licensed = You have a valid Subsonic Premium license! -premium.licensedexpires = Your Subsonic Premium license is valid until {0} -premium.licensedexpired = Your Subsonic Premium license expired {0} -premium.licensedto = The license is registered to {0}. -premium.forcechange = Register a different license key -premium.register = When upgrading to Subsonic Premium you receive a license key by email. Please register it below. -premium.resend = Lost the license key? Send it again. -premium.register.email = Email -premium.register.license = License key - # podcastReceiver.jsp podcastreceiver.title = Podcasts podcastreceiver.empty = You haven't subscribed to any podcasts yet. diff --git a/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_en_GB.properties b/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_en_GB.properties index e0d2ef71..3d036231 100644 --- a/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_en_GB.properties +++ b/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_en_GB.properties @@ -15,9 +15,6 @@ help.license.text = {0} is free software distributed under the Get Subsonic Premium
(and remove this advert) - # helpPopup.jsp helppopup.musicmask.text =

Allows you to specify the type of files that should be recognised as music.

helppopup.videomask.text =

Allows you to specify the type of files that should be recognised as video.

diff --git a/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_et.properties b/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_et.properties index c9a062e7..32c0f3b5 100644 --- a/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_et.properties +++ b/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_et.properties @@ -24,8 +24,6 @@ common.confirm = Palun kinnita common.unknown = (Tundmatu) common.default = (Tavaline) common.settingssaved = Seaded on salvestatud. -common.trialexpired = {0} aegus Teie prooviversioon. Selle kasutamiseks hankige Subsonic Premium. -common.trialnotexpired = Seda saab kasutada kuni{0}. Pärast tähtaja lõppu peate hankima Subsonic Premiumi. # login.jsp login.username = Kasutajanimi @@ -73,9 +71,6 @@ top.upgrade = Uuem versioon on saadaval. Lae alla {0} {1} \ siit. top.missing = Meediakauste ei leitud. Palun muuda seadeid. top.logout = Logi välja {0} -top.getpremium = Hankige Subsonic Premium -top.gotpremium = Subsonic Premium -top.trialdaysleft = {0} päev(a) jäänud prooviversiooni lõpuni # left.jsp left.scanning = Meediakaustade skänneerimine... @@ -140,7 +135,6 @@ importPlaylist.error = Esitusloendi importimine ebaõnnestus. {0} # videoPlayer.jsp videoPlayer.getflash = Palun paigalda Flash meediaesitaja -videoPlayer.getpremium = Chromecastil esitamiseks ostke Subsonic Premium. # status.jsp status.title = Olek @@ -266,10 +260,6 @@ upload.unzipped = {0} on lahti pakitud help.title = Info {0}´i kohta help.upgrade = Note! Saadaval on uuem versioon. Lae alla {0} {1} \ siit. -help.premium.title = Litsents -help.premium.expires = (aegub {0}) -help.premium.upgrade = Paljude lisavõimaluste nautimiseks hankigeSubsonic Premium! -help.premium.expired = (Litsents aegus {0}) help.version.title = Versioon help.builddate.title = Valmistamiskuupäev help.server.title = Server @@ -569,7 +559,6 @@ main.sharealbum = Jaga main.more = Rohkem tegevusi... main.more.selection = Valitud lood main.more.share = Jaga -main.premium = Hankige Subsonic Premium
(ja sellega eemaldate siinse reklaami) main.nowplaying = Hetkel esitamisel main.lyrics = Laulusõnad main.minutesago = minutit tagasi @@ -638,33 +627,6 @@ share.disabled = Esmalt, et saaksite muusikat jagada kellegagi, peate te registr Palun mine Seaded > Võrk (administraatori õigus on vajalik). share.manage = Halda minu jagatud meediat -# premium.jsp -premium.title = Subsonic Premium -premium.invalidlicense = Vigage litsentsivõti. -premium.text =

Nende lisavõimaluste nautimiseks peate hankima Subsonic Premiumi:

\ -
    \ -
  • Rakendused Androidile, iPhoneile ja Windows Phoneile*.
  • \ -
  • Rakendused BlackBerryiel, Rokule, Macile, Windowsile, Chrome´le ja paljudele teistele*.
  • \ -
  • Video edastus.
  • \ -
  • Taskupleieri kasutusvõimalus (Podcast).
  • \ -
  • Teie personaalse nimega serveriaadress: teienimi.libresonic.org (asub Seaded > Võrk).
  • \ -
  • Esitage oma meediattoetatud DLNA/UPnP seadmetes.
  • \ -
  • Jagage oma meediat Facebookis, Twitteris, Google+´is.
  • \ -
  • Reklaamivaba interneti kasutajaliides.
  • \ -
  • Teised võimalused avaldatakse hiljem.
  • \ -
\ -

* Mõned rakendused tuleb eraldi osta või sisaldavad reklaame.

-premium.getpremium = Hankige Subsonic Premium -premium.licensed = Teil on kehtiv litsents Subsonic Premiumile! -premium.licensedexpires = Teie Subsonic Premiumi litsents kehtib kuni {0} -premium.licensedexpired = Teie Subsonic Premiumi litsents aegub {0} -premium.licensedto = Litsents on registreeritud aadressile {0}. -premium.forcechange = Registreerige teise litsentsi võtmega -premium.register = Subsonic Premiumi litsentsi võtme leiate oma e-postist. Palun registreerige see kõrvalolevast ankeedist. -premium.resend = Kaotasite litsentsi võtme? Saatke see uuesti. -premium.register.email = E-spost -premium.register.license = Litsentsi võti - # podcastReceiver.jsp podcastreceiver.title = Taskupleierite hankija podcastreceiver.expandall = Kuva osad diff --git a/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_ja_JP.properties b/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_ja_JP.properties index d63ba0f5..ef58ef7a 100644 --- a/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_ja_JP.properties +++ b/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_ja_JP.properties @@ -25,8 +25,6 @@ common.confirm = \u3088\u308D\u3057\u3044\u3067\u3059\u304B\uFF1F common.unknown = (\u4E0D\u660E) common.default = (\u30C7\u30D5\u30A9\u30EB\u30C8) common.settingssaved = \u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002 -common.trialexpired = \u8A66\u7528\u671F\u9593\u306F {0} \u307E\u3067\u3067\u3059\u3002\u3053\u306E\u6A5F\u80FD\u3092\u7D99\u7D9A\u3057\u3066\u5229\u7528\u3059\u308B\u306B\u306F Subsonic Premium \u306B\u767B\u9332\u3057\u3066\u304F\u3060\u3055\u3044\u3002 -common.trialnotexpired = \u3053\u306E\u6A5F\u80FD\u306F {0} \u307E\u3067\u5229\u7528\u3067\u304D\u307E\u3059\u3002\u7D99\u7D9A\u3057\u3066\u5229\u7528\u3059\u308B\u306B\u306FSubsonic Premium\u306B\u767B\u9332\u3057\u3066\u304F\u3060\u3055\u3044\u3002 # login.jsp login.username = \u30E6\u30FC\u30B6\u540D @@ -74,9 +72,6 @@ top.upgrade = \u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3\u304C\u30EA\u30EA \u3092\u3053\u3053\u304B\u3089\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u3066\u304F\u3060\u3055\u3044\u3002 top.missing = \u97F3\u697D\u30D5\u30A9\u30EB\u30C0\u304C\u3042\u308A\u307E\u305B\u3093\u3002\u8A2D\u5B9A\u3092\u898B\u76F4\u3057\u3066\u304F\u3060\u3055\u3044\u3002 top.logout = {0} \u3092\u30ED\u30B0\u30A2\u30A6\u30C8\u3059\u308B -top.getpremium = Subsonic Premium\u306B\u767B\u9332 -top.gotpremium = Subsonic Premium -top.trialdaysleft = \u8A66\u7528\u671F\u9593\u306F\u6B8B\u308A {0} \u65E5\u3067\u3059 # left.jsp left.scanning = \u97F3\u697D\u30D5\u30A9\u30EB\u30C0\u3092\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u3044\u307E\u3059... @@ -275,10 +270,6 @@ upload.unzipped = zip\u30D5\u30A1\u30A4\u30EB {0} \u3092\u5C55\u958B\u3057\u307E help.title = {0} \u306B\u3064\u3044\u3066 help.upgrade = \u6CE8\u610F! \u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3\u304C\u30EA\u30EA\u30FC\u30B9\u3055\u308C\u3066\u3044\u307E\u3059\u3002
{0} {1} \ \u3092\u3053\u3053\u304B\u3089\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u3066\u304F\u3060\u3055\u3044\u3002 -help.premium.title = \u30E9\u30A4\u30BB\u30F3\u30B9 -help.premium.expires = (\u30E9\u30A4\u30BB\u30F3\u30B9\u306E\u671F\u9650 {0}) -help.premium.upgrade = Subsonic Premium \u306B\u767B\u9332\u3057\u3066 \u5168\u6A5F\u80FD \u3092\u304A\u697D\u3057\u307F\u304F\u3060\u3055\u3044! -help.premium.expired = (\u30E9\u30A4\u30BB\u30F3\u30B9\u306E\u6709\u52B9\u671F\u9650 {0}) help.version.title = \u30D0\u30FC\u30B8\u30E7\u30F3 help.builddate.title = \u30D3\u30EB\u30C9\u65E5 help.server.title = \u30B5\u30FC\u30D0 @@ -313,7 +304,6 @@ settingsheader.podcast = Podcast settingsheader.player = \u30D7\u30EC\u30FC\u30E4 settingsheader.dlna = DLNA settingsheader.sonos = Sonos -settingsheader.premium = Subsonic Premium settingsheader.share = \u5171\u6709\u306E\u8A2D\u5B9A settingsheader.network = \u30CD\u30C3\u30C8\u30EF\u30FC\u30AF settingsheader.transcoding = \u30C8\u30E9\u30F3\u30B9\u30B3\u30FC\u30C7\u30A3\u30F3\u30B0 @@ -608,7 +598,6 @@ main.sharealbum = \u5171\u6709 main.more = \u305D\u306E\u4ED6... main.more.selection = \u66F2\u76EE\u306E\u9078\u629E main.more.share = \u5171\u6709 -main.premium = Subsonic Premium \u306B\u767B\u9332
(\u5E83\u544A\u304C\u9664\u53BB\u3067\u304D\u307E\u3059) main.nowplaying = \u518D\u751F\u4E2D main.lyrics = \u6B4C\u8A5E main.minutesago = \u5206\u524D @@ -683,33 +672,6 @@ share.disabled = \u3042\u306A\u305F\u306E\u66F2\u3092\u8AB0\u304B\u3068\u5171\u6 \u53C2\u7167: \u8A2D\u5B9A > \u30CD\u30C3\u30C8\u30EF\u30FC\u30AF (\u7BA1\u7406\u8005\u6A29\u9650\u304C\u5FC5\u8981\u3067\u3059) share.manage = \u5171\u6709\u30E1\u30C7\u30A3\u30A2\u306E\u7BA1\u7406 -# premium.jsp -premium.title = Subsonic Premium -premium.invalidlicense = \u7121\u52B9\u306A\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u3067\u3059\u3002 -premium.text =

Subsonic Premium \u306B\u767B\u9332\u3059\u308B\u3068\u3001\u4EE5\u4E0B\u306E\u6A5F\u80FD\u304C\u5229\u7528\u3067\u304D\u307E\u3059:

\ -
    \ -
  • Android, iPhone, Blackberry \u3084 Windows Phone* \u7B49\u306E\u30A2\u30D7\u30EA\u3067\u518D\u751F\u3002
  • \ -
  • Mac, Windows, Chrome, Roku, \u305D\u306E\u4ED6* \u7528\u306E\u30A2\u30D7\u30EA\u3067\u518D\u751F\u3002
  • \ -
  • \u30D3\u30C7\u30AA\u30B9\u30C8\u30EA\u30FC\u30DF\u30F3\u30B0\u518D\u751F\u3002
  • \ -
  • Podcast \u306E\u53D7\u4FE1\u3002
  • \ -
  • \u3042\u306A\u305F\u56FA\u6709\u306E\u30B5\u30FC\u30D0\u30A2\u30C9\u30EC\u30B9: yourname.libresonic.org \u306E\u4F7F\u7528(\u53C2\u7167: \u8A2D\u5B9A > \u30CD\u30C3\u30C8\u30EF\u30FC\u30AF)\u3002
  • \ -
  • DLNA/UPnP \u4E92\u63DB\u30C7\u30D0\u30A4\u30B9\u3067\u97F3\u697D\u3092\u518D\u751F\u3002
  • \ -
  • Facebook, Twitter, Google+ \u3067\u97F3\u697D\u3092\u5171\u6709\u3002
  • \ -
  • \u30A6\u30A7\u30D6\u753B\u9762\u3067\u306E\u5E83\u544A\u306E\u975E\u8868\u793A\u3002
  • \ -
  • \u305D\u306E\u4ED6\u306E\u6A5F\u80FD\u3082\u4ECA\u5F8C\u306E\u30EA\u30EA\u30FC\u30B9\u3067\u8FFD\u52A0\u3002
  • \ -
\ -

* \u4E00\u90E8\u306E\u30A2\u30D7\u30EA\u306F\u5225\u9014\u8CFC\u5165\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002

-premium.getpremium = Subsonic Premium \u306B\u767B\u9332 -premium.licensed = \u6709\u52B9\u306A Subsonic Premium \u30E9\u30A4\u30BB\u30F3\u30B9\u3092\u53D6\u5F97\u3057\u307E\u3057\u305F! -premium.licensedexpires = Subsonic Premium \u30E9\u30A4\u30BB\u30F3\u30B9\u304C {0} \u307E\u3067\u6709\u52B9\u3067\u3059 -premium.licensedexpired = Subsonic Premium \u30E9\u30A4\u30BB\u30F3\u30B9\u306E\u6709\u52B9\u671F\u9650\u306F {0} \u307E\u3067\u3067\u3059 -premium.licensedto = \u30E9\u30A4\u30BB\u30F3\u30B9\u306F {0} \u306B\u767B\u9332\u3055\u308C\u307E\u3057\u305F\u3002 -premium.forcechange = \u5225\u306E\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u3092\u767B\u9332\u3059\u308B -premium.register = Subsonic Premium \u306B\u767B\u9332\u3059\u308B\u5834\u5408\u306F\u3001\u30E1\u30FC\u30EB\u3067\u53D7\u3051\u53D6\u3063\u305F\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u3092\u3001\u4E0B\u6B04\u306B\u5165\u529B\u3057 OK \u30DC\u30BF\u30F3\u3092\u30AF\u30EA\u30C3\u30AF\u3057\u307E\u3059\u3002 -premium.resend = \u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u3092\u5931\u304F\u3057\u307E\u3057\u305F\u304B? \u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u3092\u518D\u53D6\u5F97\u3059\u308B\u3002 -premium.register.email = \u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9 -premium.register.license = \u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC - # podcastReceiver.jsp podcastreceiver.title = Podcast\u306E\u53D7\u4FE1 podcastreceiver.empty = \u30DD\u30C3\u30C9\u30AD\u30E3\u30B9\u30C8\u304C\u767B\u9332\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002 diff --git a/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_ko.properties b/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_ko.properties index a8a28c49..4a3ec23e 100644 --- a/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_ko.properties +++ b/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_ko.properties @@ -24,8 +24,6 @@ common.confirm = \uD655\uC778\uD558\uC2DC\uAE30 \uBC14\uB78D\uB2C8\uB2E4 common.unknown = (\uC54C\uC218\uC5C6\uC74C) common.default = (\uAE30\uBCF8\uAC12) common.settingssaved = \uC124\uC815\uC774 \uC800\uC7A5\uB418\uC5C8\uC2B5\uB2C8\uB2E4. -common.trialexpired = {0}\uC77C\uC5D0 \uC2DC\uD5D8\uAE30\uAC04\uC774 \uB9CC\uB8CC\uB429\uB2C8\uB2E4. \uC774 \uAE30\uB2A5\uC744 \uACC4\uC18D \uC0AC\uC6A9\uD558\uAE30 \uC704\uD574 \uC11C\uBE0C\uC18C\uB2C9 \uD504\uB9AC\uBBF8\uC5C4\uC744 \uAD6C\uC785\uD569\uB2C8\uB2E4. -common.trialnotexpired = \uC774 \uAE30\uB2A5\uC740 {0}\uC77C\uAE4C\uC9C0 \uAC00\uB2A5\uD569\uB2C8\uB2E4. \uADF8 \uC774\uD6C4\uC5D0\uB294 \uC11C\uBE0C\uC18C\uB2C9 \uD504\uB9AC\uBBF8\uC5C4\uC744 \uAD6C\uC785\uD558\uC5EC\uC57C \uD569\uB2C8\uB2E4. # login.jsp login.username = \uC0AC\uC6A9\uC790\uC774\uB984 @@ -72,9 +70,6 @@ top.upgrade = \uC54C\uB9BC! \uC0C8\uB85C\uC6B4 \uBC84\uC804\uC744 \uC0AC\ \uC5EC\uAE30. top.missing = \uC9C0\uC815\uB41C \uC74C\uC545 \uC800\uC7A5\uC18C\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4. \uC124\uC815\uC744 \uD655\uC778\uD574\uC8FC\uC138\uC694. top.logout = {0} \uB85C\uADF8\uC544\uC6C3 -top.getpremium = \uC11C\uBE0C\uC18C\uB2C9 \uD504\uB9AC\uBBF8\uC5C4 \uC5BB\uAE30 -top.gotpremium = \uC11C\uBE0C\uC18C\uB2C9 \uD504\uB9AC\uBBF8\uC5C4 -top.trialdaysleft = \uC2DC\uD5D8 \uAE30\uAC04\uC774 {0}\uC77C \uB0A8\uC558\uC2B5\uB2C8\uB2E4. # left.jsp left.scanning = \uBBF8\uB514\uC5B4 \uD3F4\uB354\uB97C \uAC80\uC0C9 \uC911\uC785\uB2C8\uB2E4. @@ -264,10 +259,6 @@ upload.unzipped = \uC555\uCD95\uC744 \uD480\uC5C8\uC2B5\uB2C8\uB2E4. {0} help.title = About {0} help.upgrade = \uC54C\uB9BC! \uC0C8\uB85C\uC6B4 \uBC84\uC804\uC774 \uB098\uC654\uC2B5\uB2C8\uB2E4. \uB2E4\uC6B4\uB85C\uB4DC {0} {1} \ \uC5EC\uAE30. -help.premium.title = \uB77C\uC774\uC13C\uC2A4 -help.premium.expires = ({0} \uB9CC\uB8CC) -help.premium.upgrade = \uC11C\uBE0C\uC18C\uB2C9 \uD504\uB9AC\uBBF8\uC5C4 \uC73C\uB85C \uC5C5\uADF8\uB808\uC774\uB4DC\uD558\uC5EC \uB9CE\uC740 \uD655\uC7A5 \uAE30\uB2A5\uB4E4 \uC744 \uC0AC\uC6A9\uD574\uBCF4\uC138\uC694! -help.premium.expired = (\uB77C\uC774\uC13C\uC2A4 \uB9CC\uB8CC\uB428 {0}) help.version.title = \uBC84\uC804 help.builddate.title = \uBE4C\uB4DC \uB0A0\uC9DC help.server.title = \uC11C\uBC84 @@ -574,7 +565,6 @@ main.sharealbum = Share main.more = More actions... main.more.selection = Selected songs main.more.share = Share -main.premium = Get Subsonic Premium
(and remove this ad) main.nowplaying = \uD604\uC7AC \uC7AC\uC0DD main.lyrics = \uAC00\uC0AC main.minutesago = \uBD84 \uC804 @@ -641,33 +631,6 @@ share.disabled = \uBA3C\uC800 \uC790\uC2E0\uC758 libresonic.org \uC8FC\ \uC124\uC815 > \uB124\uD2B8\uC6CC\uD06C \uB85C \uC774\uB3D9\uD558\uC2ED\uC2DC\uC624 (\uAD00\uB9AC\uC790 \uAD8C\uD55C\uC774 \uD544\uC694\uD569\uB2C8\uB2E4). share.manage = \uB0B4 \uACF5\uC720 \uBBF8\uB514\uC5B4 \uAD00\uB9AC -# premium.jsp -premium.title = \uC11C\uBE0C\uC18C\uB2C9 \uD504\uB9AC\uBBF8\uC5C4 -premium.invalidlicense = \uC798\uBABB\uB41C \uB77C\uC774\uC13C\uC2A4 \uD0A4. -premium.text =

\uC774\uB7EC\uD55C \uCD94\uAC00 \uAE30\uB2A5\uC744 \uC990\uAE38 \uC218 \uC788\uB294 \uC11C\uBE0C\uC18C\uB2C9 \uD504\uB9AC\uBBF8\uC5C4\uC73C\uB85C \uC5C5\uADF8\uB808\uC774\uB4DC:

\ -
    \ -
  • \uC571\uC2A4 \uC548\uB4DC\uB85C\uC774\uB4DC, \uC544\uC774\uD3EC, \uC708\uB3C4\uC6B0 \uBAA8\uBC14\uC77C.
  • \ -
  • \uC571\uC2A4 \uBE14\uB799\uBCA0\uB9AC, \uB85C\uCFE0, \uC708\uB3C4\uC6B0, \uD06C\uB86C \uB4F1.
  • \ -
  • \uBE44\uB514\uC624 \uC2A4\uD2B8\uB9AC\uBC0D.
  • \ -
  • \uD31F\uCE90\uC2A4\uD2B8 \uC218\uC2E0\uAE30.
  • \ -
  • \uAC1C\uC778 \uC11C\uBC84 \uC8FC\uC18C: \uB2F9\uC2E0\uC758\uC774\uB984.libresonic.org (see \uC124\uC815 > \uB124\uD2B8\uC6CC\uD06C).
  • \ -
  • DLNA/UPnP \uD638\uD658 \uC7A5\uCE58\uC5D0\uC11C \uB2F9\uC2E0\uC758 \uBBF8\uB514\uC5B4\uB97C \uC7AC\uC0DD.
  • \ -
  • \uB2F9\uC2E0\uC758 \uBBF8\uB514\uC5B4\uB97C \uD398\uC774\uC2A4\uBD81, \uD2B8\uC704\uD130, \uAD6C\uAE00\uD50C\uB7EC\uC2A4\uC5D0 \uACF5\uC720.
  • \ -
  • \uC6F9 \uC778\uD130\uD398\uC774\uC2A4\uC758 \uAD11\uACE0\uC81C\uAC70.
  • \ -
  • \uCC28\uD6C4 \uCD94\uAC00\uB418\uB294 \uC5EC\uB7EC \uAE30\uB2A5\uB4E4.
  • \ -
\ -

* \uC77C\uBD80 \uC571\uC758 \uACBD\uC6B0 \uCD94\uAC00 \uACB0\uC81C\uB098 \uAD11\uACE0\uAC00 \uD3EC\uD568\uB429\uB2C8\uB2E4.

-premium.getpremium = \uC11C\uBE0C\uC18C\uB2C9 \uD504\uB9AC\uBBF8\uC5C4\uC744 \uC5BB\uC73C\uC138\uC694. -premium.licensed = \uB2F9\uC2E0\uC740 \uC720\uD6A8\uD55C \uC11C\uBE0C\uC18C\uB2C9 \uD504\uB9AC\uBBF8\uC5C4 \uB77C\uC774\uC13C\uC2A4\uB97C \uAC00\uC9C0\uACE0 \uC788\uC2B5\uB2C8\uB2E4.! -premium.licensedexpires = \uB2F9\uC2E0\uC758 \uC11C\uBE0C\uC18C\uB2C9 \uD504\uB9AC\uBBF8\uC5C4 \uB77C\uC774\uC13C\uC2A4\uB294 {0} \uAE4C\uC9C0 \uC720\uD6A8\uD569\uB2C8\uB2E4. -premium.licensedexpired = \uB2F9\uC2E0\uC758 \uC11C\uBE0C\uC18C\uB2C9 \uD504\uB9AC\uBBF8\uC5C4 \uB77C\uC774\uC13C\uC2A4\uB294 {0} \uC5D0 \uB9CC\uB8CC\uB429\uB2C8\uB2E4. -premium.licensedto = \uB77C\uC774\uC13C\uC2A4\uAC00 {0} \uC5D0 \uB4F1\uB85D\uB418\uC5B4 \uC788\uC2B5\uB2C8\uB2E4. -premium.forcechange = \uC774\uAC83\uC744 \uBCC0\uACBD\uD569\uB2C8\uB2E4. -premium.register = \uC11C\uBE0C\uC18C\uB2C9 \uD504\uB9AC\uBBF8\uC5C4\uC73C\uB85C \uC5C5\uADF8\uB808\uC774\uB4DC\uD560 \uB54C \uC774\uBA54\uC77C\uB85C \uB77C\uC774\uC13C\uC2A4\uD0A4\uB97C \uBC1B\uC2B5\uB2C8\uB2E4. \uC544\uB798\uC5D0 \uB4F1\uB85D\uD558\uC138\uC694. -premium.resend = \uB77C\uC774\uC13C\uC2A4\uD0A4\uB97C \uC78A\uC73C\uC168\uB098\uC694? \uB2E4\uC2DC \uBCF4\uB0B4\uAE30. -premium.register.email = \uC774\uBA54\uC77C -premium.register.license = \uB77C\uC774\uC13C\uC2A4 \uD0A4 - # podcastReceiver.jsp podcastreceiver.title = \uD31F\uCE90\uC2A4\uD2B8 \uC218\uC2E0\uAE30 podcastreceiver.expandall = \uC5D0\uD53C\uC18C\uB4DC \uBCF4\uAE30 diff --git a/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_nl.properties b/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_nl.properties index 9d34a9e8..48e57b04 100644 --- a/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_nl.properties +++ b/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_nl.properties @@ -30,8 +30,6 @@ common.confirm = Bevestig common.unknown = (Onbekend) common.default = (Standaard) common.settingssaved = Instellingen zijn opgeslagen. -common.trialexpired = De testperiode is verlopen op {0}. Neem Subsonic Premium om deze functie te gebruiken. -common.trialnotexpired = Deze functie is beschikbaar tot {0}. Daarna heb je Subsonic Premium nodig. # login.jsp login.username = Gebruikersnaam @@ -79,9 +77,6 @@ top.upgrade = Er is een nieuwe versie beschikbaar. Download {0} {1} \ here. top.missing = Geen mediamappen gevonden. Verander de Instellingen. top.logout = Uitloggen {0} -top.getpremium = Schaf Subsonic Premium aan. -top.gotpremium = Subsonic Premium -top.trialdaysleft = resterende testperiode {0} dag(en) # left.jsp left.scanning = Mediamappen worden gescanned. @@ -269,10 +264,6 @@ upload.unzipped = Uitgepakt {0} help.title = Over {0} help.upgrade = Let op! Er is een nieuwe versie beschikbaar. Download {0} {1} \ hier. -help.premium.title = Licentie -help.premium.expires = (vervalt op {0}) -help.premium.upgrade = Upgrade naar Subsonic Premium om extra functies te krijgen! -help.premium.expired = (Licentie vervallen op {0}) help.version.title = Versie help.builddate.title = Compileer datum help.server.title = Server @@ -573,7 +564,6 @@ main.sharealbum = Delen main.more = Meer acties... main.more.selection = Geselecteerde songs... main.more.share = Deel -main.premium = Schaf Subsonic Premium aan
(en verwijder de advertentie) main.nowplaying = Speelt nu main.lyrics = Teksten main.minutesago = minuten geleden @@ -642,32 +632,6 @@ share.disabled = Om jouw muziek te kunnen delen moet je eerst je eigen libre Ga naar Instellingen > Netwerk (Administrator rechten vereist!). share.manage = Beheer gedeelde media. -# premium.jsp -premium.title = Subsonic Premium -premium.invalidlicense = Ongeldige licentie sleutel. -premium.text =

Upgrade naar Subsonic Premium om van deze extra functies te kunnen genieten:

\ -
    \ -
  • Apps voor Android, iPhone and Windows Phone*.
  • \ -
  • Apps voor BlackBerry, Roku, Mac, Windows, Chrome and more*.
  • \ -
  • Video streaming.
  • \ -
  • Podcast ontvanger.
  • \ -
  • Je persoonlijk server adres: Jouwnaam.libresonic.org (Zie Instellingen > Netwerk).
  • \ -
  • Deel jouw media op Facebook, Twitter, Google+.
  • \ -
  • Geen advertenties in de web interface.
  • \ -
  • Meer functies die later uitgebracht worden.
  • \ -
\ -

* Sommige apps moeten separaat aangekocht worden.

-premium.getpremium = Schaf Subsonic Premium aan -premium.licensed = Je hebt een geldige Subsonic Premium licentie! -premium.licensedexpires = Jouw Subsonic Premium licentie is geldig tot {0} -premium.licensedexpired = Jouw Subsonic Premium licentie is vervallen op {0} -premium.licensedto = Deze licentie is geregistreerd voor {0}. -premium.forcechange = Registreer met een andere licentie sleutel -premium.register = Als je upgrade naar Subsonic Premium zul je per email een licentie sleutel ontvangen. Voer de licentiesleutel hier in: -premium.resend = Licentiesleutel verloren? Stuur mij de sleutel opnieuw.. -premium.register.email = Email -premium.register.license = Licentie sleutel - # podcastReceiver.jsp podcastreceiver.title = Podcast ontvanger podcastreceiver.expandall = Toon uitzendingen diff --git a/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_zh_TW.properties b/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_zh_TW.properties index e3ff6b3a..c8bf4493 100644 --- a/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_zh_TW.properties +++ b/libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_zh_TW.properties @@ -27,8 +27,6 @@ common.confirm = \u8ACB\u78BA\u8A8D common.unknown = (\u672A\u77E5) common.default = (\u9810\u8A2D\u503C) common.settingssaved = \u8A2D\u5B9A\u5DF2\u5132\u5B58\u3002 -common.trialexpired = \u8A66\u7528\u7248\u5C07\u65BC {0} \u5230\u671F\u3002\u53D6\u5F97Subsonic Premium\u4F86\u4F7F\u7528\u9019\u500B\u529F\u80FD\u3002 -common.trialnotexpired = \u9019\u500B\u529F\u80FD\u5728 {0} \u4E4B\u524D\u90FD\u53EF\u4F7F\u7528\u3002\u4E4B\u5F8C\u60A8\u5FC5\u9808\u53D6\u5F97Subsonic Premium\u624D\u80FD\u4F7F\u7528\u3002 # login.jsp login.username = \u5E33\u865F @@ -76,9 +74,6 @@ top.upgrade = \u6709\u65B0\u7248\u672C\u63D0\u4F9B. \u4E0B\u8F09 {0} {1} \ \u9019\u88E1\u3002 top.missing = \u627E\u4E0D\u5230\u97F3\u6A02\u8CC7\u6599\u593E\uFF0C\u8ACB\u91CD\u65B0\u8A2D\u5B9A\u3002 top.logout =\u767B\u51FA{0} -top.getpremium = \u53D6\u5F97 Subsonic Premium -top.gotpremium = Subsonic Premium -top.trialdaysleft = \u5269\u4E0B {0} \u5929\u9AD4\u9A57\u6642\u9593 # left.jsp left.scanning = \u6383\u63CF\u97F3\u6A02\u8CC7\u6599\u593E\u4E2D\u2026 @@ -148,7 +143,6 @@ importPlaylist.error = Failed to import playlist. {0} # videoPlayer.jsp videoPlayer.getflash = Please install Flash Player -videoPlayer.getpremium = Get Subsonic Premium to play on Chromecast. # status.jsp status.title = \u72C0\u614B @@ -276,10 +270,6 @@ upload.unzipped = \u89E3\u58D3\u7E2E {0} help.title = \u95DC\u65BC {0} help.upgrade = \u6CE8\u610F\uFF01 \u6709\u65B0\u7248\u672C\u53EF\u7528\u3002\u4E0B\u8F09 {0} {1} \ \u8ACB\u9EDE\u9078\u9019\u88E1\u3002 -help.premium.title = \u6388\u6B0A -help.premium.expires = (\u904E\u671F {0}) -help.premium.upgrade = \u5347\u7D1A\u5230 Subsonic Premium \u4F86\u4F7F\u7528 \u66F4\u591A\u529F\u80FD\uFF01 -help.premium.expired = (\u6388\u6B0A\u904E\u671F\u65BC {0}) help.version.title = \u7248\u672C help.builddate.title = \u65E5\u671F help.server.title = \u4F3A\u670D\u5668 @@ -304,7 +294,6 @@ settingsheader.podcast = \u64AD\u5BA2 settingsheader.player = \u64AD\u653E\u5668 settingsheader.dlna = DLNA/UPnP settingsheader.sonos = Sonos -settingsheader.premium = Subsonic Premium settingsheader.share = \u5206\u4EAB\u5A92\u9AD4 settingsheader.network = \u7DB2\u8DEF settingsheader.transcoding = \u8F49\u6A94 @@ -600,7 +589,6 @@ main.sharealbum = \u5206\u4EAB main.more = \u66F4\u591A\u52D5\u4F5C\u2026 main.more.selection = \u9078\u64C7\u6B4C\u66F2\u2026 main.more.share = \u5206\u4EAB -main.premium = \u53D6\u5F97 Subsonic Premium
(\u4E26\u522A\u9664\u6B64\u5EE3\u544A) main.nowplaying =\u76EE\u524D\u64A5\u653E main.lyrics = \u6B4C\u8A5E main.minutesago = \u5206\u9418\u524D @@ -676,33 +664,6 @@ share.disabled = To share your music with someone you must first register your o Please go to Settings > Network (administrative rights required). share.manage = Manage my shared media -# premium.jsp -premium.title = Subsonic Premium -premium.invalidlicense = Invalid license key. -premium.text =

Upgrade to Subsonic Premium to enjoy these extra features:

\ -
    \ -
  • Apps for Android, iPhone, Windows Phone, Mac, Chrome and more*.
  • \ -
  • Video streaming.
  • \ -
  • Stream to your Chromecast and Sonos devices.
  • \ -
  • Podcast receiver.
  • \ -
  • Your personal server address: yourname.libresonic.org (see Settings > Network).
  • \ -
  • Play your media on compatible DLNA/UPnP devices.
  • \ -
  • Share your media on Facebook, Twitter, Google+.
  • \ -
  • No ads in the web interface.
  • \ -
  • Other features to be released later.
  • \ -
\ -

* Some apps must be purchased separately.

-premium.getpremium = \u53D6\u5F97 Subsonic Premium -premium.licensed = You have a valid Subsonic Premium license! -premium.licensedexpires = Your Subsonic Premium license is valid until {0} -premium.licensedexpired = Your Subsonic Premium license expired {0} -premium.licensedto = The license is registered to {0}. -premium.forcechange = Register a different license key -premium.register = When upgrading to Subsonic Premium you receive a license key by email. Please register it below. -premium.resend = Lost the license key? Send it again. -premium.register.email = Email -premium.register.license = License key - # podcastReceiver.jsp podcastreceiver.title = \u64AD\u5BA2\u63A5\u6536\u5668 podcastreceiver.empty = You haven't subscribed to any podcasts yet. diff --git a/libresonic-main/src/main/webapp/WEB-INF/dwr.xml b/libresonic-main/src/main/webapp/WEB-INF/dwr.xml index 2ac93368..548027f0 100644 --- a/libresonic-main/src/main/webapp/WEB-INF/dwr.xml +++ b/libresonic-main/src/main/webapp/WEB-INF/dwr.xml @@ -53,6 +53,8 @@ + + @@ -63,4 +65,4 @@ - \ No newline at end of file + diff --git a/libresonic-main/src/main/webapp/WEB-INF/jsp/advancedSettings.jsp b/libresonic-main/src/main/webapp/WEB-INF/jsp/advancedSettings.jsp index 69291892..500124c4 100644 --- a/libresonic-main/src/main/webapp/WEB-INF/jsp/advancedSettings.jsp +++ b/libresonic-main/src/main/webapp/WEB-INF/jsp/advancedSettings.jsp @@ -18,7 +18,7 @@ - + @@ -143,7 +143,7 @@ - + - - +

- + +
" size="35" type="text" value="${model.artist}" onclick="select()"/>" size="35" type="text" value="${model.album}" onclick="select()"/> "/>
- @@ -178,32 +117,21 @@ -
- -
-
- -
-
- -
-
- -
-
- -
-
- +
+
+
+
+ "> +
-
-
- -
-
-
+ - \ No newline at end of file + + diff --git a/libresonic-main/src/main/webapp/WEB-INF/jsp/coverArt.jsp b/libresonic-main/src/main/webapp/WEB-INF/jsp/coverArt.jsp index 8d9eee77..0f860ab6 100644 --- a/libresonic-main/src/main/webapp/WEB-INF/jsp/coverArt.jsp +++ b/libresonic-main/src/main/webapp/WEB-INF/jsp/coverArt.jsp @@ -1,144 +1,143 @@ -<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="iso-8859-1" %> -<%@ include file="include.jsp" %> - -<%-- -PARAMETERS - albumId: ID of album. - playlistId: ID of playlist. - podcastChannelId: ID of podcast channel - coverArtSize: Height and width of cover art. - caption1: Caption line 1 - caption2: Caption line 2 - caption3: Caption line 3 - captionCount: Number of caption lines to display (default 0) - showLink: Whether to make the cover art image link to the album page. - showZoom: Whether to display a link for zooming 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. - hideOverflow: Hide cover art overflow when height is greater than width ---%> - - - - - - - - - - - - - - - -
-
overflow:hidden;" title="${param.caption1}" id="${divId}"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- " id="${playId}" - style="position: relative; top: 8px; left: 8px; z-index: 2; display:none" > -
- - - - - - -
- - - - - -
${param.caption2} 
-
- -
${param.caption3} 
-
-
- - -
- - - - - - - - - | - - - - - -
-
- - - +<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="iso-8859-1" %> +<%@ include file="include.jsp" %> + +<%-- +PARAMETERS + albumId: ID of album. + playlistId: ID of playlist. + podcastChannelId: ID of podcast channel + coverArtSize: Height and width of cover art. + caption1: Caption line 1 + caption2: Caption line 2 + caption3: Caption line 3 + captionCount: Number of caption lines to display (default 0) + showLink: Whether to make the cover art image link to the album page. + showZoom: Whether to display a link for zooming 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. +--%> + + + + + + + + + + + + + + + +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ " id="${playId}" + style="position: relative; top: 8px; left: 8px; z-index: 2; display:none" > +
+ + + + + + +
+ + + + + +
${param.caption2} 
+
+ +
${param.caption3} 
+
+
+ + +
+ + + + + + + + + | + + + + + +
+
+ + + diff --git a/libresonic-main/src/main/webapp/WEB-INF/jsp/createShare.jsp b/libresonic-main/src/main/webapp/WEB-INF/jsp/createShare.jsp index 13a7fd80..abe4b83d 100644 --- a/libresonic-main/src/main/webapp/WEB-INF/jsp/createShare.jsp +++ b/libresonic-main/src/main/webapp/WEB-INF/jsp/createShare.jsp @@ -40,9 +40,6 @@ - -<%@ include file="licenseNotice.jsp" %> -
@@ -53,4 +50,4 @@
- \ No newline at end of file + diff --git a/libresonic-main/src/main/webapp/WEB-INF/jsp/dlnaSettings.jsp b/libresonic-main/src/main/webapp/WEB-INF/jsp/dlnaSettings.jsp index 21c49b10..c4c10a47 100644 --- a/libresonic-main/src/main/webapp/WEB-INF/jsp/dlnaSettings.jsp +++ b/libresonic-main/src/main/webapp/WEB-INF/jsp/dlnaSettings.jsp @@ -30,7 +30,7 @@ - + @@ -53,9 +53,6 @@

- - <%@ include file="licenseNotice.jsp" %> -

" style="margin-right:0.3em"> " onclick="location.href='nowPlaying.view'"> @@ -63,4 +60,4 @@ - \ No newline at end of file + diff --git a/libresonic-main/src/main/webapp/WEB-INF/jsp/generalSettings.jsp b/libresonic-main/src/main/webapp/WEB-INF/jsp/generalSettings.jsp index c1dd9244..7b86d1fc 100644 --- a/libresonic-main/src/main/webapp/WEB-INF/jsp/generalSettings.jsp +++ b/libresonic-main/src/main/webapp/WEB-INF/jsp/generalSettings.jsp @@ -13,7 +13,7 @@ - + @@ -165,7 +165,7 @@

">
- + diff --git a/libresonic-main/src/main/webapp/WEB-INF/jsp/musicFolderSettings.jsp b/libresonic-main/src/main/webapp/WEB-INF/jsp/musicFolderSettings.jsp index de6af01d..48c77a7f 100644 --- a/libresonic-main/src/main/webapp/WEB-INF/jsp/musicFolderSettings.jsp +++ b/libresonic-main/src/main/webapp/WEB-INF/jsp/musicFolderSettings.jsp @@ -10,7 +10,7 @@ $("#newMusicFolderName").attr("placeholder", ""); $("#newMusicFolderPath").attr("placeholder", ""); - + parent.frames.upper.location.href="top.view?"; parent.frames.left.location.href="left.view?"; parent.frames.right.location.href="right.view?"; @@ -22,7 +22,7 @@ - + diff --git a/libresonic-main/src/main/webapp/WEB-INF/jsp/networkSettings.jsp b/libresonic-main/src/main/webapp/WEB-INF/jsp/networkSettings.jsp index ba80531a..d34a3fc9 100644 --- a/libresonic-main/src/main/webapp/WEB-INF/jsp/networkSettings.jsp +++ b/libresonic-main/src/main/webapp/WEB-INF/jsp/networkSettings.jsp @@ -43,7 +43,7 @@ - +

@@ -90,9 +90,6 @@

- - <%@ include file="licenseNotice.jsp" %> -

" style="margin-right:0.3em"> " onclick="location.href='nowPlaying.view'"> diff --git a/libresonic-main/src/main/webapp/WEB-INF/jsp/passwordSettings.jsp b/libresonic-main/src/main/webapp/WEB-INF/jsp/passwordSettings.jsp index e05aade5..b7010c03 100644 --- a/libresonic-main/src/main/webapp/WEB-INF/jsp/passwordSettings.jsp +++ b/libresonic-main/src/main/webapp/WEB-INF/jsp/passwordSettings.jsp @@ -9,7 +9,7 @@ - + diff --git a/libresonic-main/src/main/webapp/WEB-INF/jsp/personalSettings.jsp b/libresonic-main/src/main/webapp/WEB-INF/jsp/personalSettings.jsp index f57974d3..68814c86 100644 --- a/libresonic-main/src/main/webapp/WEB-INF/jsp/personalSettings.jsp +++ b/libresonic-main/src/main/webapp/WEB-INF/jsp/personalSettings.jsp @@ -20,7 +20,7 @@ - + ${command.user.username} @@ -254,7 +254,7 @@

- + diff --git a/libresonic-main/src/main/webapp/WEB-INF/jsp/playQueueCast.jsp b/libresonic-main/src/main/webapp/WEB-INF/jsp/playQueueCast.jsp index 52802ead..25c73fdc 100644 --- a/libresonic-main/src/main/webapp/WEB-INF/jsp/playQueueCast.jsp +++ b/libresonic-main/src/main/webapp/WEB-INF/jsp/playQueueCast.jsp @@ -91,15 +91,8 @@ * launch app and request session */ CastPlayer.prototype.launchCastApp = function () { - - this.log("launching app..."); chrome.cast.requestSession(this.onRequestSessionSuccess.bind(this), this.onLaunchError.bind(this)); - - - $().toastmessage('showNoticeToast', ""); - - }; /** @@ -283,4 +276,4 @@ window.CastPlayer = CastPlayer; })(); - \ No newline at end of file + diff --git a/libresonic-main/src/main/webapp/WEB-INF/jsp/playerSettings.jsp b/libresonic-main/src/main/webapp/WEB-INF/jsp/playerSettings.jsp index 4d16c5f4..7b596d54 100644 --- a/libresonic-main/src/main/webapp/WEB-INF/jsp/playerSettings.jsp +++ b/libresonic-main/src/main/webapp/WEB-INF/jsp/playerSettings.jsp @@ -12,7 +12,7 @@ - + @@ -163,7 +163,7 @@ - + diff --git a/libresonic-main/src/main/webapp/WEB-INF/jsp/podcastChannels.jsp b/libresonic-main/src/main/webapp/WEB-INF/jsp/podcastChannels.jsp index 6614afc2..12bf2f18 100644 --- a/libresonic-main/src/main/webapp/WEB-INF/jsp/podcastChannels.jsp +++ b/libresonic-main/src/main/webapp/WEB-INF/jsp/podcastChannels.jsp @@ -110,8 +110,5 @@ - -<%@ include file="licenseNotice.jsp" %> - diff --git a/libresonic-main/src/main/webapp/WEB-INF/jsp/podcastSettings.jsp b/libresonic-main/src/main/webapp/WEB-INF/jsp/podcastSettings.jsp index c3a7ce48..610d3a43 100644 --- a/libresonic-main/src/main/webapp/WEB-INF/jsp/podcastSettings.jsp +++ b/libresonic-main/src/main/webapp/WEB-INF/jsp/podcastSettings.jsp @@ -9,7 +9,7 @@ - + diff --git a/libresonic-main/src/main/webapp/WEB-INF/jsp/premiumSettings.jsp b/libresonic-main/src/main/webapp/WEB-INF/jsp/premiumSettings.jsp deleted file mode 100644 index 4d227e1c..00000000 --- a/libresonic-main/src/main/webapp/WEB-INF/jsp/premiumSettings.jsp +++ /dev/null @@ -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"--%> - - - <%@ include file="head.jsp" %> - <%@ include file="jquery.jsp" %> - - - - - - - - - - - - - - -
-
- -
- - - - - - - -

-
- -

-
-
- -

- -

- -
-
-
-
- - - -

-
-

- - - – - -

- -

-
- - - - - - - - - - - - - - - - - -
- -
- - "/>
-
-
- -

-
- -
- - \ No newline at end of file diff --git a/libresonic-main/src/main/webapp/WEB-INF/jsp/right.jsp b/libresonic-main/src/main/webapp/WEB-INF/jsp/right.jsp index 00e7f6f1..917d122c 100644 --- a/libresonic-main/src/main/webapp/WEB-INF/jsp/right.jsp +++ b/libresonic-main/src/main/webapp/WEB-INF/jsp/right.jsp @@ -153,17 +153,6 @@ - -
- " alt=""> - - -
- -
-
-
-
diff --git a/libresonic-main/src/main/webapp/WEB-INF/jsp/shareSettings.jsp b/libresonic-main/src/main/webapp/WEB-INF/jsp/shareSettings.jsp index c57a4ec0..0431fd67 100644 --- a/libresonic-main/src/main/webapp/WEB-INF/jsp/shareSettings.jsp +++ b/libresonic-main/src/main/webapp/WEB-INF/jsp/shareSettings.jsp @@ -9,7 +9,7 @@ - + @@ -55,9 +55,6 @@ - - <%@ include file="licenseNotice.jsp" %> -

" style="margin-right:0.3em"> " onclick="location.href='nowPlaying.view'" style="margin-right:2.0em"> @@ -67,4 +64,4 @@ - \ No newline at end of file + diff --git a/libresonic-main/src/main/webapp/WEB-INF/jsp/sonosSettings.jsp b/libresonic-main/src/main/webapp/WEB-INF/jsp/sonosSettings.jsp index c0c06c1a..5edef36d 100644 --- a/libresonic-main/src/main/webapp/WEB-INF/jsp/sonosSettings.jsp +++ b/libresonic-main/src/main/webapp/WEB-INF/jsp/sonosSettings.jsp @@ -30,7 +30,7 @@ - +

@@ -53,9 +53,6 @@

- - <%@ include file="licenseNotice.jsp" %> -

" style="margin-right:0.3em"> " onclick="location.href='nowPlaying.view'"> @@ -63,4 +60,4 @@

- \ No newline at end of file + diff --git a/libresonic-main/src/main/webapp/WEB-INF/jsp/transcodingSettings.jsp b/libresonic-main/src/main/webapp/WEB-INF/jsp/transcodingSettings.jsp index 5d1a9c1d..1de70723 100644 --- a/libresonic-main/src/main/webapp/WEB-INF/jsp/transcodingSettings.jsp +++ b/libresonic-main/src/main/webapp/WEB-INF/jsp/transcodingSettings.jsp @@ -10,7 +10,7 @@ - +
@@ -40,11 +40,11 @@ - " value="${model.newTranscoding.name}"/> - " value="${model.newTranscoding.sourceFormats}"/> - " value="${model.newTranscoding.targetFormat}"/> - " value="${model.newTranscoding.step1}"/> - " value="${model.newTranscoding.step2}"/> + " value="${newTranscoding.name}"/> + " value="${newTranscoding.sourceFormats}"/> + " value="${newTranscoding.targetFormat}"/> + " value="${newTranscoding.step1}"/> + " value="${newTranscoding.step2}"/> @@ -87,8 +87,8 @@
- -

+ +

diff --git a/libresonic-main/src/main/webapp/WEB-INF/jsp/userSettings.jsp b/libresonic-main/src/main/webapp/WEB-INF/jsp/userSettings.jsp index 513c7a7f..8cc25e76 100644 --- a/libresonic-main/src/main/webapp/WEB-INF/jsp/userSettings.jsp +++ b/libresonic-main/src/main/webapp/WEB-INF/jsp/userSettings.jsp @@ -8,7 +8,7 @@