Merge pull request #178 from plastikman/nolicense

Remove all premium/license calls.
master
Tom Powell 8 years ago committed by GitHub
commit c9afbac242
  1. 1
      libresonic-installer-windows/pom.xml
  2. 11
      libresonic-main/src/main/java/org/libresonic/player/command/NetworkSettingsCommand.java
  3. 9
      libresonic-main/src/main/java/org/libresonic/player/controller/DLNASettingsController.java
  4. 1
      libresonic-main/src/main/java/org/libresonic/player/controller/HelpController.java
  5. 1
      libresonic-main/src/main/java/org/libresonic/player/controller/MainController.java
  6. 1
      libresonic-main/src/main/java/org/libresonic/player/controller/NetworkSettingsController.java
  7. 1
      libresonic-main/src/main/java/org/libresonic/player/controller/PlayQueueController.java
  8. 1
      libresonic-main/src/main/java/org/libresonic/player/controller/PodcastChannelsController.java
  9. 20
      libresonic-main/src/main/java/org/libresonic/player/controller/RESTController.java
  10. 1
      libresonic-main/src/main/java/org/libresonic/player/controller/RightController.java
  11. 1
      libresonic-main/src/main/java/org/libresonic/player/controller/ShareManagementController.java
  12. 1
      libresonic-main/src/main/java/org/libresonic/player/controller/ShareSettingsController.java
  13. 9
      libresonic-main/src/main/java/org/libresonic/player/controller/SonosSettingsController.java
  14. 1
      libresonic-main/src/main/java/org/libresonic/player/controller/VideoPlayerController.java
  15. 89
      libresonic-main/src/main/java/org/libresonic/player/domain/LicenseInfo.java
  16. 14
      libresonic-main/src/main/java/org/libresonic/player/security/RESTRequestParameterProcessingFilter.java
  17. 8
      libresonic-main/src/main/java/org/libresonic/player/service/NetworkService.java
  18. 4
      libresonic-main/src/main/java/org/libresonic/player/service/PodcastService.java
  19. 106
      libresonic-main/src/main/java/org/libresonic/player/service/SettingsService.java
  20. 4
      libresonic-main/src/main/java/org/libresonic/player/service/SonosService.java
  21. 4
      libresonic-main/src/main/java/org/libresonic/player/service/UPnPService.java
  22. 5
      libresonic-main/src/main/java/org/libresonic/player/service/upnp/FolderBasedContentDirectory.java
  23. 37
      libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_cs.properties
  24. 27
      libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_de.properties
  25. 39
      libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_en.properties
  26. 3
      libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_en_GB.properties
  27. 38
      libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_et.properties
  28. 38
      libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_ja_JP.properties
  29. 37
      libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_ko.properties
  30. 36
      libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_nl.properties
  31. 39
      libresonic-main/src/main/resources/org/libresonic/player/i18n/ResourceBundle_zh_TW.properties
  32. 1
      libresonic-main/src/main/webapp/WEB-INF/jsp/albumMain.jsp
  33. 3
      libresonic-main/src/main/webapp/WEB-INF/jsp/createShare.jsp
  34. 3
      libresonic-main/src/main/webapp/WEB-INF/jsp/dlnaSettings.jsp
  35. 3
      libresonic-main/src/main/webapp/WEB-INF/jsp/networkSettings.jsp
  36. 7
      libresonic-main/src/main/webapp/WEB-INF/jsp/playQueueCast.jsp
  37. 3
      libresonic-main/src/main/webapp/WEB-INF/jsp/podcastChannels.jsp
  38. 93
      libresonic-main/src/main/webapp/WEB-INF/jsp/premiumSettings.jsp
  39. 11
      libresonic-main/src/main/webapp/WEB-INF/jsp/right.jsp
  40. 3
      libresonic-main/src/main/webapp/WEB-INF/jsp/shareSettings.jsp
  41. 3
      libresonic-main/src/main/webapp/WEB-INF/jsp/sonosSettings.jsp
  42. 4
      libresonic-main/src/main/webapp/WEB-INF/jsp/videoPlayer.jsp
  43. 9
      libresonic-main/src/test/java/org/libresonic/player/service/SettingsServiceTestCase.java
  44. 8
      libresonic-rest-api/src/main/resources/libresonic-rest-api.xsd

@ -59,7 +59,6 @@
<copy file="${basedir}/src/main/exe4j/libresonic-agent-elevated.exe.vmoptions" todir="${project.build.directory}"/> <copy file="${basedir}/src/main/exe4j/libresonic-agent-elevated.exe.vmoptions" todir="${project.build.directory}"/>
<copy file="${basedir}/src/main/exe4j/libresonic-service.exe.vmoptions" todir="${project.build.directory}"/> <copy file="${basedir}/src/main/exe4j/libresonic-service.exe.vmoptions" todir="${project.build.directory}"/>
<exec executable="${exe4j.home}/bin/exe4jc"> <exec executable="${exe4j.home}/bin/exe4jc">
<arg value="--license=L-SINDRE_MEHUS#14926715500010001-1ty7dbe11l10ll#140"/>
</exec> </exec>
<exec executable="${exe4j.home}/bin/exe4jc"> <exec executable="${exe4j.home}/bin/exe4jc">
<arg value="${basedir}/src/main/exe4j/libresonic-agent.exe4j"/> <arg value="${basedir}/src/main/exe4j/libresonic-agent.exe4j"/>

@ -19,7 +19,6 @@
*/ */
package org.libresonic.player.command; package org.libresonic.player.command;
import org.libresonic.player.domain.LicenseInfo;
/** /**
* @author Sindre Mehus * @author Sindre Mehus
@ -33,7 +32,7 @@ public class NetworkSettingsCommand {
private String urlRedirectCustomUrl; private String urlRedirectCustomUrl;
private String urlRedirectType; private String urlRedirectType;
private int port; private int port;
private LicenseInfo licenseInfo; private boolean toast;
public void setPortForwardingEnabled(boolean portForwardingEnabled) { public void setPortForwardingEnabled(boolean portForwardingEnabled) {
this.portForwardingEnabled = portForwardingEnabled; this.portForwardingEnabled = portForwardingEnabled;
@ -74,12 +73,12 @@ public class NetworkSettingsCommand {
this.port = port; this.port = port;
} }
public void setLicenseInfo(LicenseInfo licenseInfo) { public boolean isToast() {
this.licenseInfo = licenseInfo; return toast;
} }
public LicenseInfo getLicenseInfo() { public void setToast(boolean toast) {
return licenseInfo; this.toast = toast;
} }
public String getUrlRedirectType() { public String getUrlRedirectType() {

@ -57,7 +57,6 @@ public class DLNASettingsController {
map.put("dlnaEnabled", settingsService.isDlnaEnabled()); map.put("dlnaEnabled", settingsService.isDlnaEnabled());
map.put("dlnaServerName", settingsService.getDlnaServerName()); map.put("dlnaServerName", settingsService.getDlnaServerName());
map.put("licenseInfo", settingsService.getLicenseInfo());
model.addAttribute("model", map); model.addAttribute("model", map);
return "dlnaSettings"; return "dlnaSettings";
@ -83,4 +82,12 @@ public class DLNASettingsController {
settingsService.save(); settingsService.save();
upnpService.setMediaServerEnabled(dlnaEnabled); upnpService.setMediaServerEnabled(dlnaEnabled);
} }
public void setSettingsService(SettingsService settingsService) {
this.settingsService = settingsService;
}
public void setUpnpService(UPnPService upnpService) {
this.upnpService = upnpService;
}
} }

@ -63,7 +63,6 @@ public class HelpController extends ParameterizableViewController {
", java " + System.getProperty("java.version") + ", java " + System.getProperty("java.version") +
", " + System.getProperty("os.name"); ", " + System.getProperty("os.name");
map.put("licenseInfo", settingsService.getLicenseInfo());
map.put("user", securityService.getCurrentUser(request)); map.put("user", securityService.getCurrentUser(request));
map.put("brand", settingsService.getBrand()); map.put("brand", settingsService.getBrand());
map.put("localVersion", versionService.getLocalVersion()); map.put("localVersion", versionService.getLocalVersion());

@ -119,7 +119,6 @@ public class MainController extends AbstractController {
map.put("showArtistInfo", userSettings.isShowArtistInfoEnabled()); map.put("showArtistInfo", userSettings.isShowArtistInfoEnabled());
map.put("partyMode", userSettings.isPartyModeEnabled()); map.put("partyMode", userSettings.isPartyModeEnabled());
map.put("brand", settingsService.getBrand()); map.put("brand", settingsService.getBrand());
map.put("showAd", !settingsService.isLicenseValid() && adService.showAd());
map.put("viewAsList", isViewAsList(request, userSettings)); map.put("viewAsList", isViewAsList(request, userSettings));
if (dir.isAlbum()) { if (dir.isAlbum()) {
map.put("sieblingAlbums", getSieblingAlbums(dir)); map.put("sieblingAlbums", getSieblingAlbums(dir));

@ -57,7 +57,6 @@ public class NetworkSettingsController {
command.setUrlRedirectFrom(settingsService.getUrlRedirectFrom()); command.setUrlRedirectFrom(settingsService.getUrlRedirectFrom());
command.setUrlRedirectCustomUrl(settingsService.getUrlRedirectCustomUrl()); command.setUrlRedirectCustomUrl(settingsService.getUrlRedirectCustomUrl());
command.setPort(settingsService.getPort()); command.setPort(settingsService.getPort());
command.setLicenseInfo(settingsService.getLicenseInfo());
model.addAttribute("command",command); model.addAttribute("command",command);
} }

@ -61,7 +61,6 @@ public class PlayQueueController extends ParameterizableViewController {
map.put("partyMode", userSettings.isPartyModeEnabled()); map.put("partyMode", userSettings.isPartyModeEnabled());
map.put("notify", userSettings.isSongNotificationEnabled()); map.put("notify", userSettings.isSongNotificationEnabled());
map.put("autoHide", userSettings.isAutoHidePlayQueue()); map.put("autoHide", userSettings.isAutoHidePlayQueue());
map.put("licenseInfo", settingsService.getLicenseInfo());
ModelAndView result = super.handleRequestInternal(request, response); ModelAndView result = super.handleRequestInternal(request, response);
result.addObject("model", map); result.addObject("model", map);
return result; return result;

@ -64,7 +64,6 @@ public class PodcastChannelsController extends ParameterizableViewController {
map.put("channels", channels); map.put("channels", channels);
map.put("channelMap", channelMap); map.put("channelMap", channelMap);
map.put("newestEpisodes", podcastService.getNewestEpisodes(10)); map.put("newestEpisodes", podcastService.getNewestEpisodes(10));
map.put("licenseInfo", settingsService.getLicenseInfo());
return result; return result;
} }

@ -60,7 +60,6 @@ import org.libresonic.restapi.InternetRadioStation;
import org.libresonic.restapi.InternetRadioStations; import org.libresonic.restapi.InternetRadioStations;
import org.libresonic.restapi.JukeboxPlaylist; import org.libresonic.restapi.JukeboxPlaylist;
import org.libresonic.restapi.JukeboxStatus; import org.libresonic.restapi.JukeboxStatus;
import org.libresonic.restapi.License;
import org.libresonic.restapi.Lyrics; import org.libresonic.restapi.Lyrics;
import org.libresonic.restapi.MediaType; import org.libresonic.restapi.MediaType;
import org.libresonic.restapi.MusicFolders; 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.Bookmark;
import org.libresonic.player.domain.Genre; import org.libresonic.player.domain.Genre;
import org.libresonic.player.domain.InternetRadio; import org.libresonic.player.domain.InternetRadio;
import org.libresonic.player.domain.LicenseInfo;
import org.libresonic.player.domain.MediaFile; import org.libresonic.player.domain.MediaFile;
import org.libresonic.player.domain.MusicFolder; import org.libresonic.player.domain.MusicFolder;
import org.libresonic.player.domain.MusicFolderContent; import org.libresonic.player.domain.MusicFolderContent;
@ -207,23 +205,6 @@ public class RESTController extends MultiActionController {
jaxbWriter.writeResponse(request, response, res); 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") @SuppressWarnings("UnusedDeclaration")
public void getMusicFolders(HttpServletRequest request, HttpServletResponse response) throws Exception { public void getMusicFolders(HttpServletRequest request, HttpServletResponse response) throws Exception {
request = wrapRequest(request); 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."), PROTOCOL_MISMATCH_SERVER_TOO_OLD(30, "Incompatible Libresonic REST protocol version. Server must upgrade."),
NOT_AUTHENTICATED(40, "Wrong username or password."), NOT_AUTHENTICATED(40, "Wrong username or password."),
NOT_AUTHORIZED(50, "User is not authorized for the given operation."), 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."); NOT_FOUND(70, "Requested data was not found.");
private final int code; private final int code;

@ -63,7 +63,6 @@ public class RightController extends ParameterizableViewController {
map.put("showNowPlaying", userSettings.isShowNowPlayingEnabled()); map.put("showNowPlaying", userSettings.isShowNowPlayingEnabled());
map.put("showChat", userSettings.isShowChatEnabled()); map.put("showChat", userSettings.isShowChatEnabled());
map.put("user", securityService.getCurrentUser(request)); map.put("user", securityService.getCurrentUser(request));
map.put("licenseInfo", settingsService.getLicenseInfo());
result.addObject("model", map); result.addObject("model", map);
return result; return result;

@ -80,7 +80,6 @@ public class ShareManagementController extends MultiActionController {
} }
map.put("playUrl", shareService.getShareUrl(share)); map.put("playUrl", shareService.getShareUrl(share));
map.put("licenseInfo", settingsService.getLicenseInfo());
return new ModelAndView("createShare", "model", map); return new ModelAndView("createShare", "model", map);
} }

@ -70,7 +70,6 @@ public class ShareSettingsController {
map.put("shareBaseUrl", shareService.getShareBaseUrl()); map.put("shareBaseUrl", shareService.getShareBaseUrl());
map.put("shareInfos", getShareInfos(request)); map.put("shareInfos", getShareInfos(request));
map.put("user", securityService.getCurrentUser(request)); map.put("user", securityService.getCurrentUser(request));
map.put("licenseInfo", settingsService.getLicenseInfo());
model.addAttribute("model", map); model.addAttribute("model", map);
return "shareSettings"; return "shareSettings";

@ -54,7 +54,6 @@ public class SonosSettingsController {
map.put("sonosEnabled", settingsService.isSonosEnabled()); map.put("sonosEnabled", settingsService.isSonosEnabled());
map.put("sonosServiceName", settingsService.getSonosServiceName()); map.put("sonosServiceName", settingsService.getSonosServiceName());
map.put("licenseInfo", settingsService.getLicenseInfo());
model.addAttribute("model", map); model.addAttribute("model", map);
return "sonosSettings"; return "sonosSettings";
@ -83,4 +82,12 @@ public class SonosSettingsController {
sonosService.setMusicServiceEnabled(false); sonosService.setMusicServiceEnabled(false);
sonosService.setMusicServiceEnabled(sonosEnabled); sonosService.setMusicServiceEnabled(sonosEnabled);
} }
public void setSettingsService(SettingsService settingsService) {
this.settingsService = settingsService;
}
public void setSonosService(SonosService sonosService) {
this.sonosService = sonosService;
}
} }

@ -85,7 +85,6 @@ public class VideoPlayerController extends ParameterizableViewController {
map.put("duration", duration); map.put("duration", duration);
map.put("bitRates", BIT_RATES); map.put("bitRates", BIT_RATES);
map.put("defaultBitRate", DEFAULT_BIT_RATE); map.put("defaultBitRate", DEFAULT_BIT_RATE);
map.put("licenseInfo", settingsService.getLicenseInfo());
map.put("user", user); map.put("user", user);
ModelAndView result = super.handleRequestInternal(request, response); ModelAndView result = super.handleRequestInternal(request, response);

@ -1,89 +0,0 @@
/*
This file is part of Libresonic.
Libresonic is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
Libresonic is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with Libresonic. If not, see <http://www.gnu.org/licenses/>.
Copyright 2016 (C) Libresonic Authors
Based upon Subsonic, Copyright 2009 (C) Sindre Mehus
*/
package org.libresonic.player.domain;
import java.util.Date;
import org.apache.commons.lang.StringUtils;
import org.libresonic.player.service.SettingsService;
/**
* Controller for the "Podcast receiver" page.
*
* @author Sindre Mehus
*/
public class LicenseInfo {
private String licenseEmail;
private boolean licenseValid;
private final Date trialExpires;
private long trialDaysLeft;
private final Date licenseExpires;
public LicenseInfo(String licenseEmail, boolean licenseValid, Date trialExpires,
long trialDaysLeft, Date licenseExpires) {
this.licenseEmail = licenseEmail;
this.licenseValid = licenseValid;
this.trialExpires = trialExpires;
this.trialDaysLeft = trialDaysLeft;
this.licenseExpires = licenseExpires;
}
public String getLicenseEmail() {
return licenseEmail;
}
public void setLicenseEmail(String licenseEmail) {
this.licenseEmail = StringUtils.trimToNull(licenseEmail);
}
public boolean isLicenseValid() {
return licenseValid;
}
public void setLicenseValid(boolean licenseValid) {
this.licenseValid = licenseValid;
}
public boolean isTrial() {
return trialExpires != null && !licenseValid;
}
public boolean isTrialExpired() {
return trialExpires != null && (trialExpires.before(new Date()) || trialDaysLeft > SettingsService.TRIAL_DAYS + 1);
}
public boolean isLicenseOrTrialValid() {
return isLicenseValid() || !isTrialExpired();
}
public Date getTrialExpires() {
return trialExpires;
}
public long getTrialDaysLeft() {
return trialDaysLeft;
}
public Date getLicenseExpires() {
return licenseExpires;
}
}

@ -24,7 +24,6 @@ import org.apache.commons.lang.StringUtils;
import org.libresonic.player.Logger; import org.libresonic.player.Logger;
import org.libresonic.player.controller.JAXBWriter; import org.libresonic.player.controller.JAXBWriter;
import org.libresonic.player.controller.RESTController; import org.libresonic.player.controller.RESTController;
import org.libresonic.player.domain.LicenseInfo;
import org.libresonic.player.domain.User; import org.libresonic.player.domain.User;
import org.libresonic.player.domain.Version; import org.libresonic.player.domain.Version;
import org.libresonic.player.service.SecurityService; import org.libresonic.player.service.SecurityService;
@ -99,10 +98,6 @@ public class RESTRequestParameterProcessingFilter implements Filter {
errorCode = authenticate(username, password, salt, token, previousAuth); errorCode = authenticate(username, password, salt, token, previousAuth);
} }
if (errorCode == null) {
errorCode = checkLicense(client);
}
if (errorCode == null) { if (errorCode == null) {
chain.doFilter(request, response); chain.doFilter(request, response);
} else { } else {
@ -162,15 +157,6 @@ public class RESTRequestParameterProcessingFilter implements Filter {
return RESTController.ErrorCode.MISSING_PARAMETER; 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) { public static String decrypt(String s) {
if (s == null) { if (s == null) {
return null; return null;

@ -232,8 +232,6 @@ public class NetworkService {
HttpPost request = new HttpPost(enable ? URL_REDIRECTION_REGISTER_URL : URL_REDIRECTION_UNREGISTER_URL); HttpPost request = new HttpPost(enable ? URL_REDIRECTION_REGISTER_URL : URL_REDIRECTION_UNREGISTER_URL);
int port = settingsService.getPort(); int port = settingsService.getPort();
boolean trial = !settingsService.isLicenseValid();
Date trialExpires = settingsService.getTrialExpires();
List<NameValuePair> params = new ArrayList<NameValuePair>(); List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("serverId", settingsService.getServerId())); 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("localIp", settingsService.getLocalIpAddress()));
params.add(new BasicNameValuePair("localPort", String.valueOf(port))); params.add(new BasicNameValuePair("localPort", String.valueOf(port)));
params.add(new BasicNameValuePair("contextPath", settingsService.getUrlRedirectContextPath())); 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()));
}

@ -535,10 +535,6 @@ public class PodcastService {
try (CloseableHttpClient client = HttpClients.createDefault()) { try (CloseableHttpClient client = HttpClients.createDefault()) {
if (!settingsService.getLicenseInfo().isLicenseOrTrialValid()) {
throw new Exception("Sorry, the trial period is expired.");
}
PodcastChannel channel = getChannel(episode.getChannelId()); PodcastChannel channel = getChannel(episode.getChannelId());
RequestConfig requestConfig = RequestConfig.custom() RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(2 * 60 * 1000) // 2 minutes .setConnectTimeout(2 * 60 * 1000) // 2 minutes

@ -52,7 +52,6 @@ import org.libresonic.player.dao.UserDao;
import org.libresonic.player.domain.AlbumListType; import org.libresonic.player.domain.AlbumListType;
import org.libresonic.player.domain.Avatar; import org.libresonic.player.domain.Avatar;
import org.libresonic.player.domain.InternetRadio; import org.libresonic.player.domain.InternetRadio;
import org.libresonic.player.domain.LicenseInfo;
import org.libresonic.player.domain.MediaLibraryStatistics; import org.libresonic.player.domain.MediaLibraryStatistics;
import org.libresonic.player.domain.MusicFolder; import org.libresonic.player.domain.MusicFolder;
import org.libresonic.player.domain.Theme; 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_WINDOWS = new File("c:/libresonic");
private static final File LIBRESONIC_HOME_OTHER = new File("/var/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. // Global settings.
private static final String KEY_INDEX_STRING = "IndexString"; private static final String KEY_INDEX_STRING = "IndexString";
private static final String KEY_IGNORED_ARTICLES = "IgnoredArticles"; 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_PODCAST_EPISODE_DOWNLOAD_COUNT = "PodcastEpisodeDownloadCount";
private static final String KEY_DOWNLOAD_BITRATE_LIMIT = "DownloadBitrateLimit"; private static final String KEY_DOWNLOAD_BITRATE_LIMIT = "DownloadBitrateLimit";
private static final String KEY_UPLOAD_BITRATE_LIMIT = "UploadBitrateLimit"; 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_DOWNSAMPLING_COMMAND = "DownsamplingCommand4";
private static final String KEY_HLS_COMMAND = "HlsCommand3"; private static final String KEY_HLS_COMMAND = "HlsCommand3";
private static final String KEY_JUKEBOX_COMMAND = "JukeboxCommand2"; 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_ORGANIZE_BY_FOLDER_STRUCTURE = "OrganizeByFolderStructure";
private static final String KEY_SORT_ALBUMS_BY_YEAR = "SortAlbumsByYear"; private static final String KEY_SORT_ALBUMS_BY_YEAR = "SortAlbumsByYear";
private static final String KEY_MEDIA_LIBRARY_STATISTICS = "MediaLibraryStatistics"; 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_ENABLED = "DlnaEnabled";
private static final String KEY_DLNA_SERVER_NAME = "DlnaServerName"; private static final String KEY_DLNA_SERVER_NAME = "DlnaServerName";
private static final String KEY_SONOS_ENABLED = "SonosEnabled"; 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 int DEFAULT_PODCAST_EPISODE_DOWNLOAD_COUNT = 1;
private static final long DEFAULT_DOWNLOAD_BITRATE_LIMIT = 0; private static final long DEFAULT_DOWNLOAD_BITRATE_LIMIT = 0;
private static final long DEFAULT_UPLOAD_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_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_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 -"; 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_ORGANIZE_BY_FOLDER_STRUCTURE = true;
private static final boolean DEFAULT_SORT_ALBUMS_BY_YEAR = 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_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 boolean DEFAULT_DLNA_ENABLED = false;
private static final String DEFAULT_DLNA_SERVER_NAME = "Libresonic"; private static final String DEFAULT_DLNA_SERVER_NAME = "Libresonic";
private static final boolean DEFAULT_SONOS_ENABLED = false; private static final boolean DEFAULT_SONOS_ENABLED = false;
@ -223,7 +211,7 @@ public class SettingsService {
// Array of obsolete keys. Used to clean property file. // Array of obsolete keys. Used to clean property file.
private static final List<String> OBSOLETE_KEYS = Arrays.asList("PortForwardingPublicPort", "PortForwardingLocalPort", private static final List<String> OBSOLETE_KEYS = Arrays.asList("PortForwardingPublicPort", "PortForwardingLocalPort",
"DownsamplingCommand", "DownsamplingCommand2", "DownsamplingCommand3", "AutoCoverBatch", "MusicMask", "DownsamplingCommand", "DownsamplingCommand2", "DownsamplingCommand3", "AutoCoverBatch", "MusicMask",
"VideoMask", "CoverArtMask, HlsCommand", "HlsCommand2", "JukeboxCommand", "UrlRedirectTrialExpires", "VideoTrialExpires", "VideoMask", "CoverArtMask, HlsCommand", "HlsCommand2", "JukeboxCommand",
"CoverArtFileTypes", "UrlRedirectCustomHost", "CoverArtLimit", "StreamPort"); "CoverArtFileTypes", "UrlRedirectCustomHost", "CoverArtLimit", "StreamPort");
private static final String LOCALES_FILE = "/org/libresonic/player/i18n/locales.txt"; private static final String LOCALES_FILE = "/org/libresonic/player/i18n/locales.txt";
@ -248,12 +236,6 @@ public class SettingsService {
private static File libresonicHome; 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 static final long LOCAL_IP_LOOKUP_DELAY_SECONDS = 60;
private String localIpAddress; 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. * Register in service locator so that non-Spring objects can access me.
* This method is invoked automatically by Spring. * This method is invoked automatically by Spring.
@ -298,7 +273,6 @@ public class SettingsService {
logServerInfo(); logServerInfo();
ServiceLocator.setSettingsService(this); ServiceLocator.setSettingsService(this);
scheduleLocalIpAddressLookup(); scheduleLocalIpAddressLookup();
scheduleLicenseValidation();
} }
private void logServerInfo() { private void logServerInfo() {
@ -650,49 +624,6 @@ public class SettingsService {
setLong(KEY_UPLOAD_BITRATE_LIMIT, limit); 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() { public String getDownsamplingCommand() {
return properties.getProperty(KEY_DOWNSAMPLING_COMMAND, DEFAULT_DOWNSAMPLING_COMMAND); return properties.getProperty(KEY_DOWNSAMPLING_COMMAND, DEFAULT_DOWNSAMPLING_COMMAND);
} }
@ -846,16 +777,6 @@ public class SettingsService {
properties.setProperty(KEY_URL_REDIRECT_TYPE, urlRedirectType.name()); 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() { public String getUrlRedirectContextPath() {
return properties.getProperty(KEY_URL_REDIRECT_CONTEXT_PATH, DEFAULT_URL_REDIRECT_CONTEXT_PATH); 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()]); 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() { private void scheduleLocalIpAddressLookup() {
Runnable task = new Runnable() { Runnable task = new Runnable() {
public void run() { public void run() {
localIpAddress = Util.getLocalIpAddress(); localIpAddress = Util.getLocalIpAddress();
} }
}; };
executor.scheduleWithFixedDelay(task, 0L, LOCAL_IP_LOOKUP_DELAY_SECONDS, TimeUnit.SECONDS);
} }
public void setInternetRadioDao(InternetRadioDao internetRadioDao) { public void setInternetRadioDao(InternetRadioDao internetRadioDao) {

@ -347,10 +347,6 @@ public class SonosService implements SonosSoap {
throw new SonosSoapFault.LoginInvalid(); throw new SonosSoapFault.LoginInvalid();
} }
if (!settingsService.getLicenseInfo().isLicenseOrTrialValid()) {
throw new SonosSoapFault.LoginUnauthorized();
}
// Use username as session ID for easy access to it later. // Use username as session ID for easy access to it later.
GetSessionIdResponse result = new GetSessionIdResponse(); GetSessionIdResponse result = new GetSessionIdResponse();
result.setGetSessionIdResult(user.getUsername()); result.setGetSessionIdResult(user.getUsername());

@ -125,11 +125,9 @@ public class UPnPService {
// TODO: DLNACaps // TODO: DLNACaps
Version version = versionService.getLocalVersion(); Version version = versionService.getLocalVersion();
String versionString = version == null ? null : version.toString(); 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), 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); new DLNADoc[]{new DLNADoc("DMS", DLNADoc.Version.V1_5)}, null);
Icon icon = new Icon("image/png", 512, 512, 32, getClass().getResource("logo-512.png")); Icon icon = new Icon("image/png", 512, 512, 32, getClass().getResource("logo-512.png"));

@ -67,11 +67,6 @@ public class FolderBasedContentDirectory extends LibresonicContentDirectory {
public BrowseResult browse(String objectId, BrowseFlag browseFlag, String filter, long firstResult, public BrowseResult browse(String objectId, BrowseFlag browseFlag, String filter, long firstResult,
long maxResults, SortCriterion[] orderby) throws ContentDirectoryException { 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 + LOG.info("UPnP request - objectId: " + objectId + ", browseFlag: " + browseFlag + ", filter: " + filter +
", firstResult: " + firstResult + ", maxResults: " + maxResults); ", firstResult: " + firstResult + ", maxResults: " + maxResults);

@ -25,8 +25,6 @@ common.confirm = Potvr\u010Fte
common.unknown = (Nezn\u00E1m\u00FD) common.unknown = (Nezn\u00E1m\u00FD)
common.default = (V\u00FDchoz\u00ED) common.default = (V\u00FDchoz\u00ED)
common.settingssaved = Nastaven\u00ED byla ulo\u017Eena. common.settingssaved = Nastaven\u00ED byla ulo\u017Eena.
common.trialexpired = Zku\u0161ebn\u00ED doba vypr\u0161ela {0}. Z\u00EDskejte <b><a href="premiumSettings.view?">Subsonic Premium</a></b> pro pou\u017Eit\u00ED t\u00E9to funkce.
common.trialnotexpired = Tato funkce je dostupn\u00E1 do {0}. Pot\u00E9 mus\u00EDte z\u00EDskat <b><a href="premiumSettings.view?">Subsonic Premium</a></b>.
# login.jsp # login.jsp
login.username = U\u017Eivatelsk\u00E9 jm\u00E9no login.username = U\u017Eivatelsk\u00E9 jm\u00E9no
@ -73,9 +71,6 @@ top.upgrade = Je dostupn\u00E1 nov\u00E1 verze. St\u00E1hnout {0} {1} \
<a href="#" onclick="window.open(''http://libresonic.org/'')">zde</a>. <a href="#" onclick="window.open(''http://libresonic.org/'')">zde</a>.
top.missing = Nebyly nalezeny \u017E\u00E1dn\u00E9 slo\u017Eky m\u00E9di\u00ED. Zm\u011B\u0148te nastaven\u00ED. 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.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.jsp
left.scanning = Prohled\u00E1v\u00E1n\u00ED slo\u017Eek m\u00E9di\u00ED... 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.title = O aplikaci {0}
help.upgrade = <b>Pozor!</b> Je dostupn\u00E1 nov\u00E1 verze. St\u00E1hnout {0} {1} \ help.upgrade = <b>Pozor!</b> Je dostupn\u00E1 nov\u00E1 verze. St\u00E1hnout {0} {1} \
<a href="#" onclick="window.open(''http://libresonic.org/'')">zde</a>. <a href="#" onclick="window.open(''http://libresonic.org/'')">zde</a>.
help.premium.title = Licence
help.premium.expires = (vypr\u0161\u00ED {0})
help.premium.upgrade = Upgradujte na <a href="premiumSettings.view">Subsonic Premium</a>, abyste si u\u017Eili spoustu <a href="premiumSettings.view">funkc\u00ED nav\u00EDc</a>!
help.premium.expired = (Licence vypr\u0161ela {0})
help.version.title = Verze help.version.title = Verze
help.builddate.title = Datum sestaven\u00ED help.builddate.title = Datum sestaven\u00ED
help.server.title = Server help.server.title = Server
@ -568,7 +559,6 @@ main.sharealbum = Sd\u00EDlet
main.more = V\u00EDce akc\u00ED... main.more = V\u00EDce akc\u00ED...
main.more.selection = Vybran\u00E9 skladby... main.more.selection = Vybran\u00E9 skladby...
main.more.share = Sd\u00EDlet main.more.share = Sd\u00EDlet
main.premium = <a href="{0}" style="text-decoration:underline">Z\u00EDskat Subsonic Premium</a><br>(a odebrat tuto reklamu)
main.nowplaying = P\u0159ehr\u00E1v\u00E1n\u00ED main.nowplaying = P\u0159ehr\u00E1v\u00E1n\u00ED
main.lyrics = Texty main.lyrics = Texty
main.minutesago = minut zp\u011Bt 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 <a href="networkSettings.view"><b>Nastaven\u00ED &gt; S\u00ED\u0165</b></a> (jsou vy\u017Eadov\u00E1na opr\u00E1vn\u011Bn\u00ED administr\u00E1tora). P\u0159ejd\u011Bte na <a href="networkSettings.view"><b>Nastaven\u00ED &gt; S\u00ED\u0165</b></a> (jsou vy\u017Eadov\u00E1na opr\u00E1vn\u011Bn\u00ED administr\u00E1tora).
share.manage = Spravovat m\u00E1 sd\u00EDlen\u00E1 m\u00E9dia 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 = <p>Upgradujte na Subsonic Premium, abyste si u\u017Eili tyto dal\u0161\u00ED funkce:</p> \
<ul> \
<li><a href="http://libresonic.org/pages/apps.jsp" target="blank">Aplikace</a> pro Android, iPhone, Blackberry a Windows Phone*.</li> \
<li><a href="http://libresonic.org/pages/apps.jsp" target="blank">Aplikace</a> pro Mac, Windows, Chrome, Roku a spoustu dal\u0161\u00EDch*.</li> \
<li>Streamov\u00E1n\u00ED videa.</li> \
<li>P\u0159ij\u00EDma\u010D Podcast\u016F.</li> \
<li>Va\u0161e osobn\u00ED serverov\u00E1 adresa: <em>vasejmeno</em>.libresonic.org (viz <a href="networkSettings.view">Nastaven\u00ED &gt; S\u00ED\u0165</a>).</li> \
<li>P\u0159ehr\u00E1v\u00E1n\u00ED sv\u00FDch m\u00E9di\u00ED na kompatibiln\u00EDch za\u0159\u00EDzen\u00EDch DLNA a UPnP.</li> \
<li>Sd\u00EDlen\u00ED sv\u00FDch m\u00E9di\u00ED na Facebooku, Twitteru, Google+.</li> \
<li>\u017D\u00E1dn\u00E9 reklamy ve webov\u00E9m rozhran\u00ED.</li> \
<li>Ostatn\u00ED funkce, kter\u00E9 budou spu\u0161t\u011Bny pozd\u011Bji.</li> \
</ul> \
<p style="font-size:9px;">* N\u011Bkter\u00E9 aplikace mus\u00ED b\u00FDt zakoupeny samostatn\u011B.</p>
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? <a href="http://libresonic.org/backend/requestLicense.view" target="_blank">Poslat ho znovu</a>.
premium.register.email = E-mail
premium.register.license = Licen\u010Dn\u00ED&nbsp;kl\u00ED\u010D
# podcastReceiver.jsp # podcastReceiver.jsp
podcastreceiver.title = P\u0159ij\u00EDma\u010D Podcast\u016F podcastreceiver.title = P\u0159ij\u00EDma\u010D Podcast\u016F
podcastreceiver.expandall = Zobrazit epizody podcastreceiver.expandall = Zobrazit epizody

@ -530,33 +530,6 @@ share.disabled = Um Musik mit jemanden teilen zu k\u00F6nnen musst du erst deine
Bitte wechsle zu <a href="networkSettings.view"><b>Settings &gt; Network</b></a> (Administratorrechte werden ben\u00F6tigt). Bitte wechsle zu <a href="networkSettings.view"><b>Settings &gt; Network</b></a> (Administratorrechte werden ben\u00F6tigt).
share.manage = Meine geteilten Medien verwalten share.manage = Meine geteilten Medien verwalten
# premium.jsp
premium.title = Subsonic Premium
premium.invalidlicense = Ung\u00FCltiger Lizenzschl\u00FCssel.
premium.text = <p>Upgrade zu <a href="http://premium.libresonic.org/" target="_blank">Subsonic Premium</a> um diese Funktionen zu geniessen:</p> \
<ul> \
<li><a href="http://libresonic.org/pages/apps.jsp" target="_blank">Apps</a> f\u00FCr Android, iPhone, Windows Phone, Mac, Chrome und mehr*.</li> \
<li>Videostreaming.</li> \
<li>Streame zu deinen Chromecast und Sonos Ger\u00E4ten.</li> \
<li>Podcast Empf\u00E4nger.</li> \
<li>Deine pers\u00F6nliche Serveradresse: <em>deinname</em>.libresonic.org (siehe <a href="networkSettings.view">Einstellungen &gt; Netzwerk</a>).</li> \
<li>Spiele deine Medien auf kompatiblen DLNA/UPnP Ger\u00E4ten.</li> \
<li>Teile deine Medien auf Facebook, Twitter, Google+.</li> \
<li>Keine Werbung im Webinterface.</li> \
<li>Weitere Funktionen die sp\u00E4ter ver\u00F6ffentlicht werden.</li> \
</ul> \
<p style="font-size:10px;">* Einige Apps m\u00FCssen seperat gekauft werden.</p>
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? <a href="http://libresonic.org/backend/requestLicense.view" target="_blank">Erneut zusenden</a>.
premium.register.email = Email
premium.register.license = License&nbsp;key
# userSettings.jsp # userSettings.jsp
usersettings.title = Benutzer ausw\u00E4hlen usersettings.title = Benutzer ausw\u00E4hlen
usersettings.newuser = Neuer Benutzer usersettings.newuser = Neuer Benutzer

@ -24,8 +24,6 @@ common.confirm = Please confirm
common.unknown = (Unknown) common.unknown = (Unknown)
common.default = (Default) common.default = (Default)
common.settingssaved = Settings were saved. common.settingssaved = Settings were saved.
common.trialexpired = The trial period expired on {0}. Get <b><a href="premiumSettings.view?">Subsonic Premium</a></b> to use this feature.
common.trialnotexpired = This feature is available until {0}. After that you must get <b><a href="premiumSettings.view?">Subsonic Premium</a></b>.
# login.jsp # login.jsp
login.username = Username login.username = Username
@ -73,9 +71,6 @@ top.upgrade = A new version is available. Download {0} {1} \
<a href="#" onclick="window.open(''http://libresonic.org/'')">here</a>. <a href="#" onclick="window.open(''http://libresonic.org/'')">here</a>.
top.missing = No media folders found. Please change the settings. top.missing = No media folders found. Please change the settings.
top.logout = Log out {0} 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.jsp
left.scanning = Scanning media folders... left.scanning = Scanning media folders...
@ -146,7 +141,6 @@ importPlaylist.error = Failed to import playlist. {0}
# videoPlayer.jsp # videoPlayer.jsp
videoPlayer.getflash = Please install Flash Player videoPlayer.getflash = Please install Flash Player
videoPlayer.getpremium = Get <b><a href='premiumSettings.view?' target='main'>Subsonic Premium</a></b> to play on Chromecast.
# status.jsp # status.jsp
status.title = Status status.title = Status
@ -316,10 +310,6 @@ upload.unzipped = Unzipped {0}
help.title = About {0} help.title = About {0}
help.upgrade = <b>Note!</b> A new version is available. Download {0} {1} \ help.upgrade = <b>Note!</b> A new version is available. Download {0} {1} \
<a href="#" onclick="window.open(''http://libresonic.org/'')">here</a>. <a href="#" onclick="window.open(''http://libresonic.org/'')">here</a>.
help.premium.title = License
help.premium.expires = (expires {0})
help.premium.upgrade = Upgrade to <a href="premiumSettings.view">Subsonic Premium</a> to enjoy lots of <a href="premiumSettings.view">extra features</a>!
help.premium.expired = (License expired {0})
help.version.title = Version help.version.title = Version
help.builddate.title = Build date help.builddate.title = Build date
help.server.title = Server help.server.title = Server
@ -344,7 +334,6 @@ settingsheader.podcast = Podcast
settingsheader.player = Players settingsheader.player = Players
settingsheader.dlna = DLNA/UPnP settingsheader.dlna = DLNA/UPnP
settingsheader.sonos = Sonos settingsheader.sonos = Sonos
settingsheader.premium = Subsonic Premium
settingsheader.share = Shared media settingsheader.share = Shared media
settingsheader.network = Network settingsheader.network = Network
settingsheader.transcoding = Transcoding settingsheader.transcoding = Transcoding
@ -642,7 +631,6 @@ main.sharealbum = Share
main.more = More actions... main.more = More actions...
main.more.selection = Selected songs... main.more.selection = Selected songs...
main.more.share = Share main.more.share = Share
main.premium = <a href="{0}" style="text-decoration:underline">Get Subsonic Premium</a><br>(and remove this ad)
main.nowplaying = Now playing main.nowplaying = Now playing
main.lyrics = Lyrics main.lyrics = Lyrics
main.minutesago = minutes ago main.minutesago = minutes ago
@ -718,33 +706,6 @@ share.disabled = To share your music with someone you must first register your o
Please go to <a href="networkSettings.view"><b>Settings &gt; Network</b></a> (administrative rights required). Please go to <a href="networkSettings.view"><b>Settings &gt; Network</b></a> (administrative rights required).
share.manage = Manage my shared media share.manage = Manage my shared media
# premium.jsp
premium.title = Subsonic Premium
premium.invalidlicense = Invalid license key.
premium.text = <p>Upgrade to <a href="http://premium.libresonic.org/" target="_blank">Subsonic Premium</a> to enjoy these extra features:</p> \
<ul> \
<li><a href="http://libresonic.org/pages/apps.jsp" target="_blank">Apps</a> for Android, iPhone, Windows Phone, Mac, Chrome and more*.</li> \
<li>Video streaming.</li> \
<li>Stream to your Chromecast and Sonos devices.</li> \
<li>Podcast receiver.</li> \
<li>Your personal server address: <em>yourname</em>.libresonic.org (see <a href="networkSettings.view">Settings &gt; Network</a>).</li> \
<li>Play your media on compatible DLNA/UPnP devices.</li> \
<li>Share your media on Facebook, Twitter, Google+.</li> \
<li>No ads in the web interface.</li> \
<li>Other features to be released later.</li> \
</ul> \
<p style="font-size:10px;">* Some apps must be purchased separately.</p>
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? <a href="http://libresonic.org/backend/requestLicense.view" target="_blank">Send it again</a>.
premium.register.email = Email
premium.register.license = License&nbsp;key
# podcastReceiver.jsp # podcastReceiver.jsp
podcastreceiver.title = Podcasts podcastreceiver.title = Podcasts
podcastreceiver.empty = You haven't subscribed to any podcasts yet. podcastreceiver.empty = You haven't subscribed to any podcasts yet.

@ -15,9 +15,6 @@ help.license.text = {0} is free software distributed under the <a href="http://w
# playerSettings.jsp # playerSettings.jsp
playersettings.technology.jukebox.text = Play music directly on the audio device of the Libresonic server. (Authorised users only). playersettings.technology.jukebox.text = Play music directly on the audio device of the Libresonic server. (Authorised users only).
# main.jsp
main.premium = <a href="{0}" style="text-decoration:underline">Get Subsonic Premium</a><br>(and remove this advert)
# helpPopup.jsp # helpPopup.jsp
helppopup.musicmask.text = <p>Allows you to specify the type of files that should be recognised as music.</p> helppopup.musicmask.text = <p>Allows you to specify the type of files that should be recognised as music.</p>
helppopup.videomask.text = <p>Allows you to specify the type of files that should be recognised as video.</p> helppopup.videomask.text = <p>Allows you to specify the type of files that should be recognised as video.</p>

@ -24,8 +24,6 @@ common.confirm = Palun kinnita
common.unknown = (Tundmatu) common.unknown = (Tundmatu)
common.default = (Tavaline) common.default = (Tavaline)
common.settingssaved = Seaded on salvestatud. common.settingssaved = Seaded on salvestatud.
common.trialexpired = {0} aegus Teie prooviversioon. Selle kasutamiseks hankige <b><a href="premiumSettings.view?">Subsonic Premium</a></b>.
common.trialnotexpired = Seda saab kasutada kuni{0}. Pärast tähtaja lõppu peate hankima <b><a href="premiumSettings.view?">Subsonic Premiumi</a></b>.
# login.jsp # login.jsp
login.username = Kasutajanimi login.username = Kasutajanimi
@ -73,9 +71,6 @@ top.upgrade = Uuem versioon on saadaval. Lae alla {0} {1} \
<a href\="\#" onclick\="window.open(''http\://libresonic.org/'')">siit</a>. <a href\="\#" onclick\="window.open(''http\://libresonic.org/'')">siit</a>.
top.missing = Meediakauste ei leitud. Palun muuda seadeid. top.missing = Meediakauste ei leitud. Palun muuda seadeid.
top.logout = Logi välja {0} 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.jsp
left.scanning = Meediakaustade skänneerimine... left.scanning = Meediakaustade skänneerimine...
@ -140,7 +135,6 @@ importPlaylist.error = Esitusloendi importimine ebaõnnestus. {0}
# videoPlayer.jsp # videoPlayer.jsp
videoPlayer.getflash = Palun paigalda Flash meediaesitaja videoPlayer.getflash = Palun paigalda Flash meediaesitaja
videoPlayer.getpremium = Chromecastil esitamiseks ostke <b><a href='premiumSettings.view?' target='main'>Subsonic Premium</a></b>.
# status.jsp # status.jsp
status.title = Olek status.title = Olek
@ -266,10 +260,6 @@ upload.unzipped = {0} on lahti pakitud
help.title = Info {0}´i kohta help.title = Info {0}´i kohta
help.upgrade = <b>Note!</b> Saadaval on uuem versioon. Lae alla {0} {1} \ help.upgrade = <b>Note!</b> Saadaval on uuem versioon. Lae alla {0} {1} \
<a href="#" onclick="window.open(''http://libresonic.org/'')">siit</a>. <a href="#" onclick="window.open(''http://libresonic.org/'')">siit</a>.
help.premium.title = Litsents
help.premium.expires = (aegub {0})
help.premium.upgrade = Paljude <a href="premiumSettings.view">lisavõimaluste</a> nautimiseks hankige<a href="premiumSettings.view">Subsonic Premium</a>!
help.premium.expired = (Litsents aegus {0})
help.version.title = Versioon help.version.title = Versioon
help.builddate.title = Valmistamiskuupäev help.builddate.title = Valmistamiskuupäev
help.server.title = Server help.server.title = Server
@ -569,7 +559,6 @@ main.sharealbum = Jaga
main.more = Rohkem tegevusi... main.more = Rohkem tegevusi...
main.more.selection = Valitud lood main.more.selection = Valitud lood
main.more.share = Jaga main.more.share = Jaga
main.premium = <a href="{0}" style="text-decoration:underline">Hankige Subsonic Premium</a><br>(ja sellega eemaldate siinse reklaami)
main.nowplaying = Hetkel esitamisel main.nowplaying = Hetkel esitamisel
main.lyrics = Laulusõnad main.lyrics = Laulusõnad
main.minutesago = minutit tagasi main.minutesago = minutit tagasi
@ -638,33 +627,6 @@ share.disabled = Esmalt, et saaksite muusikat jagada kellegagi, peate te registr
Palun mine <a href="networkSettings.view"><b>Seaded &gt; Võrk</b></a> (administraatori õigus on vajalik). Palun mine <a href="networkSettings.view"><b>Seaded &gt; Võrk</b></a> (administraatori õigus on vajalik).
share.manage = Halda minu jagatud meediat share.manage = Halda minu jagatud meediat
# premium.jsp
premium.title = Subsonic Premium
premium.invalidlicense = Vigage litsentsivõti.
premium.text = <p>Nende lisavõimaluste nautimiseks peate hankima Subsonic Premiumi:</p> \
<ul> \
<li><a href="http://libresonic.org/pages/apps.jsp" target="blank">Rakendused</a> Androidile, iPhoneile ja Windows Phoneile*.</li> \
<li><a href="http://libresonic.org/pages/apps.jsp" target="blank">Rakendused</a> BlackBerryiel, Rokule, Macile, Windowsile, Chrome´le ja paljudele teistele*.</li> \
<li>Video edastus.</li> \
<li>Taskupleieri kasutusvõimalus (Podcast).</li> \
<li>Teie personaalse nimega serveriaadress: <em>teienimi</em>.libresonic.org (asub <a href="networkSettings.view">Seaded &gt; Võrk</a>).</li> \
<li>Esitage oma meediattoetatud DLNA/UPnP seadmetes.</li> \
<li>Jagage oma meediat Facebookis, Twitteris, Google+´is.</li> \
<li>Reklaamivaba interneti kasutajaliides.</li> \
<li>Teised võimalused avaldatakse hiljem.</li> \
</ul> \
<p style="font-size:9px;">* Mõned rakendused tuleb eraldi osta või sisaldavad reklaame.</p>
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? <a href="http://libresonic.org/backend/requestLicense.view" target="_blank">Saatke see uuesti</a>.
premium.register.email = E-spost
premium.register.license = Litsentsi&nbsp;võti
# podcastReceiver.jsp # podcastReceiver.jsp
podcastreceiver.title = Taskupleierite hankija podcastreceiver.title = Taskupleierite hankija
podcastreceiver.expandall = Kuva osad podcastreceiver.expandall = Kuva osad

@ -25,8 +25,6 @@ common.confirm = \u3088\u308D\u3057\u3044\u3067\u3059\u304B\uFF1F
common.unknown = (\u4E0D\u660E) common.unknown = (\u4E0D\u660E)
common.default = (\u30C7\u30D5\u30A9\u30EB\u30C8) common.default = (\u30C7\u30D5\u30A9\u30EB\u30C8)
common.settingssaved = \u8A2D\u5B9A\u3092\u4FDD\u5B58\u3057\u307E\u3057\u305F\u3002 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 <b><a href="premiumSettings.view?">Subsonic Premium</a></b> \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\u306F<b><a href="premiumSettings.view?">Subsonic Premium</a></b>\u306B\u767B\u9332\u3057\u3066\u304F\u3060\u3055\u3044\u3002
# login.jsp # login.jsp
login.username = \u30E6\u30FC\u30B6\u540D login.username = \u30E6\u30FC\u30B6\u540D
@ -74,9 +72,6 @@ top.upgrade = \u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3\u304C\u30EA\u30EA
\u3092<a href\="\#" onclick\="window.open(''http\://libresonic.org/'')">\u3053\u3053</a>\u304B\u3089\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u3066\u304F\u3060\u3055\u3044\u3002 \u3092<a href\="\#" onclick\="window.open(''http\://libresonic.org/'')">\u3053\u3053</a>\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.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.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.jsp
left.scanning = \u97F3\u697D\u30D5\u30A9\u30EB\u30C0\u3092\u30B9\u30AD\u30E3\u30F3\u3057\u3066\u3044\u307E\u3059... 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.title = {0} \u306B\u3064\u3044\u3066
help.upgrade = <b>\u6CE8\u610F!</b> \u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3\u304C\u30EA\u30EA\u30FC\u30B9\u3055\u308C\u3066\u3044\u307E\u3059\u3002<br>{0} {1} \ help.upgrade = <b>\u6CE8\u610F!</b> \u65B0\u3057\u3044\u30D0\u30FC\u30B8\u30E7\u30F3\u304C\u30EA\u30EA\u30FC\u30B9\u3055\u308C\u3066\u3044\u307E\u3059\u3002<br>{0} {1} \
\u3092<a href="#" onclick="window.open(''http://libresonic.org/'')">\u3053\u3053</a>\u304B\u3089\u30C0\u30A6\u30F3\u30ED\u30FC\u30C9\u3057\u3066\u304F\u3060\u3055\u3044\u3002 \u3092<a href="#" onclick="window.open(''http://libresonic.org/'')">\u3053\u3053</a>\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 = <a href="premiumSettings.view">Subsonic Premium</a> \u306B\u767B\u9332\u3057\u3066 <a href="premiumSettings.view">\u5168\u6A5F\u80FD</a> \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.version.title = \u30D0\u30FC\u30B8\u30E7\u30F3
help.builddate.title = \u30D3\u30EB\u30C9\u65E5 help.builddate.title = \u30D3\u30EB\u30C9\u65E5
help.server.title = \u30B5\u30FC\u30D0 help.server.title = \u30B5\u30FC\u30D0
@ -313,7 +304,6 @@ settingsheader.podcast = Podcast
settingsheader.player = \u30D7\u30EC\u30FC\u30E4 settingsheader.player = \u30D7\u30EC\u30FC\u30E4
settingsheader.dlna = DLNA settingsheader.dlna = DLNA
settingsheader.sonos = Sonos settingsheader.sonos = Sonos
settingsheader.premium = Subsonic Premium
settingsheader.share = \u5171\u6709\u306E\u8A2D\u5B9A settingsheader.share = \u5171\u6709\u306E\u8A2D\u5B9A
settingsheader.network = \u30CD\u30C3\u30C8\u30EF\u30FC\u30AF settingsheader.network = \u30CD\u30C3\u30C8\u30EF\u30FC\u30AF
settingsheader.transcoding = \u30C8\u30E9\u30F3\u30B9\u30B3\u30FC\u30C7\u30A3\u30F3\u30B0 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 = \u305D\u306E\u4ED6...
main.more.selection = \u66F2\u76EE\u306E\u9078\u629E main.more.selection = \u66F2\u76EE\u306E\u9078\u629E
main.more.share = \u5171\u6709 main.more.share = \u5171\u6709
main.premium = <a href="{0}" style="text-decoration:underline">Subsonic Premium \u306B\u767B\u9332</a><br>(\u5E83\u544A\u304C\u9664\u53BB\u3067\u304D\u307E\u3059)
main.nowplaying = \u518D\u751F\u4E2D main.nowplaying = \u518D\u751F\u4E2D
main.lyrics = \u6B4C\u8A5E main.lyrics = \u6B4C\u8A5E
main.minutesago = \u5206\u524D main.minutesago = \u5206\u524D
@ -683,33 +672,6 @@ share.disabled = \u3042\u306A\u305F\u306E\u66F2\u3092\u8AB0\u304B\u3068\u5171\u6
\u53C2\u7167: <a href="networkSettings.view"><b>\u8A2D\u5B9A &gt; \u30CD\u30C3\u30C8\u30EF\u30FC\u30AF</b></a> (\u7BA1\u7406\u8005\u6A29\u9650\u304C\u5FC5\u8981\u3067\u3059) \u53C2\u7167: <a href="networkSettings.view"><b>\u8A2D\u5B9A &gt; \u30CD\u30C3\u30C8\u30EF\u30FC\u30AF</b></a> (\u7BA1\u7406\u8005\u6A29\u9650\u304C\u5FC5\u8981\u3067\u3059)
share.manage = \u5171\u6709\u30E1\u30C7\u30A3\u30A2\u306E\u7BA1\u7406 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 = <p>Subsonic Premium \u306B\u767B\u9332\u3059\u308B\u3068\u3001\u4EE5\u4E0B\u306E\u6A5F\u80FD\u304C\u5229\u7528\u3067\u304D\u307E\u3059:</p> \
<ul> \
<li>Android, iPhone, Blackberry \u3084 Windows Phone* \u7B49\u306E<a href="http://libresonic.org/pages/apps.jsp" target="blank">\u30A2\u30D7\u30EA</a>\u3067\u518D\u751F\u3002</li> \
<li>Mac, Windows, Chrome, Roku, \u305D\u306E\u4ED6* \u7528\u306E<a href="http://libresonic.org/pages/apps.jsp" target="blank">\u30A2\u30D7\u30EA</a>\u3067\u518D\u751F\u3002</li> \
<li>\u30D3\u30C7\u30AA\u30B9\u30C8\u30EA\u30FC\u30DF\u30F3\u30B0\u518D\u751F\u3002</li> \
<li>Podcast \u306E\u53D7\u4FE1\u3002</li> \
<li>\u3042\u306A\u305F\u56FA\u6709\u306E\u30B5\u30FC\u30D0\u30A2\u30C9\u30EC\u30B9: <em>yourname</em>.libresonic.org \u306E\u4F7F\u7528(\u53C2\u7167: <a href="networkSettings.view">\u8A2D\u5B9A &gt; \u30CD\u30C3\u30C8\u30EF\u30FC\u30AF</a>)\u3002</li> \
<li>DLNA/UPnP \u4E92\u63DB\u30C7\u30D0\u30A4\u30B9\u3067\u97F3\u697D\u3092\u518D\u751F\u3002</li> \
<li>Facebook, Twitter, Google+ \u3067\u97F3\u697D\u3092\u5171\u6709\u3002</li> \
<li>\u30A6\u30A7\u30D6\u753B\u9762\u3067\u306E\u5E83\u544A\u306E\u975E\u8868\u793A\u3002</li> \
<li>\u305D\u306E\u4ED6\u306E\u6A5F\u80FD\u3082\u4ECA\u5F8C\u306E\u30EA\u30EA\u30FC\u30B9\u3067\u8FFD\u52A0\u3002</li> \
</ul> \
<p style="font-size:9px;">* \u4E00\u90E8\u306E\u30A2\u30D7\u30EA\u306F\u5225\u9014\u8CFC\u5165\u3059\u308B\u5FC5\u8981\u304C\u3042\u308A\u307E\u3059\u3002</p>
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? <a href="http://libresonic.org/backend/requestLicense.view" target="_blank">\u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC\u3092\u518D\u53D6\u5F97\u3059\u308B</a>\u3002
premium.register.email = \u30E1\u30FC\u30EB\u30A2\u30C9\u30EC\u30B9
premium.register.license = \u30E9\u30A4\u30BB\u30F3\u30B9\u30AD\u30FC
# podcastReceiver.jsp # podcastReceiver.jsp
podcastreceiver.title = Podcast\u306E\u53D7\u4FE1 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 podcastreceiver.empty = \u30DD\u30C3\u30C9\u30AD\u30E3\u30B9\u30C8\u304C\u767B\u9332\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002

@ -24,8 +24,6 @@ common.confirm = \uD655\uC778\uD558\uC2DC\uAE30 \uBC14\uB78D\uB2C8\uB2E4
common.unknown = (\uC54C\uC218\uC5C6\uC74C) common.unknown = (\uC54C\uC218\uC5C6\uC74C)
common.default = (\uAE30\uBCF8\uAC12) common.default = (\uAE30\uBCF8\uAC12)
common.settingssaved = \uC124\uC815\uC774 \uC800\uC7A5\uB418\uC5C8\uC2B5\uB2C8\uB2E4. 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 <b><a href="premiumSettings.view?">\uC11C\uBE0C\uC18C\uB2C9 \uD504\uB9AC\uBBF8\uC5C4</a></b>\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 <b><a href="premiumSettings.view?">\uC11C\uBE0C\uC18C\uB2C9 \uD504\uB9AC\uBBF8\uC5C4</a></b>\uC744 \uAD6C\uC785\uD558\uC5EC\uC57C \uD569\uB2C8\uB2E4.
# login.jsp # login.jsp
login.username = \uC0AC\uC6A9\uC790\uC774\uB984 login.username = \uC0AC\uC6A9\uC790\uC774\uB984
@ -72,9 +70,6 @@ top.upgrade = <b>\uC54C\uB9BC!</b> \uC0C8\uB85C\uC6B4 \uBC84\uC804\uC744 \uC0AC\
<a href="#" onclick="window.open(''http://libresonic.org/'')">\uC5EC\uAE30</a>. <a href="#" onclick="window.open(''http://libresonic.org/'')">\uC5EC\uAE30</a>.
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.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.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.jsp
left.scanning = \uBBF8\uB514\uC5B4 \uD3F4\uB354\uB97C \uAC80\uC0C9 \uC911\uC785\uB2C8\uB2E4. 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.title = About {0}
help.upgrade = <b>\uC54C\uB9BC!</b> \uC0C8\uB85C\uC6B4 \uBC84\uC804\uC774 \uB098\uC654\uC2B5\uB2C8\uB2E4. \uB2E4\uC6B4\uB85C\uB4DC {0} {1} \ help.upgrade = <b>\uC54C\uB9BC!</b> \uC0C8\uB85C\uC6B4 \uBC84\uC804\uC774 \uB098\uC654\uC2B5\uB2C8\uB2E4. \uB2E4\uC6B4\uB85C\uB4DC {0} {1} \
<a href="#" onclick="window.open(''http://libresonic.org/'')">\uC5EC\uAE30</a>. <a href="#" onclick="window.open(''http://libresonic.org/'')">\uC5EC\uAE30</a>.
help.premium.title = \uB77C\uC774\uC13C\uC2A4
help.premium.expires = ({0} \uB9CC\uB8CC)
help.premium.upgrade = <a href="premiumSettings.view">\uC11C\uBE0C\uC18C\uB2C9 \uD504\uB9AC\uBBF8\uC5C4</a> \uC73C\uB85C \uC5C5\uADF8\uB808\uC774\uB4DC\uD558\uC5EC \uB9CE\uC740 <a href="premiumSettings.view">\uD655\uC7A5 \uAE30\uB2A5\uB4E4</a> \uC744 \uC0AC\uC6A9\uD574\uBCF4\uC138\uC694!
help.premium.expired = (\uB77C\uC774\uC13C\uC2A4 \uB9CC\uB8CC\uB428 {0})
help.version.title = \uBC84\uC804 help.version.title = \uBC84\uC804
help.builddate.title = \uBE4C\uB4DC \uB0A0\uC9DC help.builddate.title = \uBE4C\uB4DC \uB0A0\uC9DC
help.server.title = \uC11C\uBC84 help.server.title = \uC11C\uBC84
@ -574,7 +565,6 @@ main.sharealbum = Share
main.more = More actions... main.more = More actions...
main.more.selection = Selected songs main.more.selection = Selected songs
main.more.share = Share main.more.share = Share
main.premium = <a href="{0}" style="text-decoration:underline">Get Subsonic Premium</a><br>(and remove this ad)
main.nowplaying = \uD604\uC7AC \uC7AC\uC0DD main.nowplaying = \uD604\uC7AC \uC7AC\uC0DD
main.lyrics = \uAC00\uC0AC main.lyrics = \uAC00\uC0AC
main.minutesago = \uBD84 \uC804 main.minutesago = \uBD84 \uC804
@ -641,33 +631,6 @@ share.disabled = \uBA3C\uC800 \uC790\uC2E0\uC758 <em>libresonic.org</em> \uC8FC\
<a href="networkSettings.view"><b>\uC124\uC815 &gt; \uB124\uD2B8\uC6CC\uD06C</b></a> \uB85C \uC774\uB3D9\uD558\uC2ED\uC2DC\uC624 (\uAD00\uB9AC\uC790 \uAD8C\uD55C\uC774 \uD544\uC694\uD569\uB2C8\uB2E4). <a href="networkSettings.view"><b>\uC124\uC815 &gt; \uB124\uD2B8\uC6CC\uD06C</b></a> \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 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 = <p>\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:</p> \
<ul> \
<li><a href="http://libresonic.org/pages/apps.jsp" target="blank">\uC571\uC2A4</a> \uC548\uB4DC\uB85C\uC774\uB4DC, \uC544\uC774\uD3EC, \uC708\uB3C4\uC6B0 \uBAA8\uBC14\uC77C.</li> \
<li><a href="http://libresonic.org/pages/apps.jsp" target="blank">\uC571\uC2A4</a> \uBE14\uB799\uBCA0\uB9AC, \uB85C\uCFE0, \uC708\uB3C4\uC6B0, \uD06C\uB86C \uB4F1.</li> \
<li>\uBE44\uB514\uC624 \uC2A4\uD2B8\uB9AC\uBC0D.</li> \
<li>\uD31F\uCE90\uC2A4\uD2B8 \uC218\uC2E0\uAE30.</li> \
<li>\uAC1C\uC778 \uC11C\uBC84 \uC8FC\uC18C: <em>\uB2F9\uC2E0\uC758\uC774\uB984</em>.libresonic.org (see <a href="networkSettings.view">\uC124\uC815 &gt; \uB124\uD2B8\uC6CC\uD06C</a>).</li> \
<li>DLNA/UPnP \uD638\uD658 \uC7A5\uCE58\uC5D0\uC11C \uB2F9\uC2E0\uC758 \uBBF8\uB514\uC5B4\uB97C \uC7AC\uC0DD.</li> \
<li>\uB2F9\uC2E0\uC758 \uBBF8\uB514\uC5B4\uB97C \uD398\uC774\uC2A4\uBD81, \uD2B8\uC704\uD130, \uAD6C\uAE00\uD50C\uB7EC\uC2A4\uC5D0 \uACF5\uC720.</li> \
<li>\uC6F9 \uC778\uD130\uD398\uC774\uC2A4\uC758 \uAD11\uACE0\uC81C\uAC70.</li> \
<li>\uCC28\uD6C4 \uCD94\uAC00\uB418\uB294 \uC5EC\uB7EC \uAE30\uB2A5\uB4E4.</li> \
</ul> \
<p style="font-size:9px;">* \uC77C\uBD80 \uC571\uC758 \uACBD\uC6B0 \uCD94\uAC00 \uACB0\uC81C\uB098 \uAD11\uACE0\uAC00 \uD3EC\uD568\uB429\uB2C8\uB2E4.</p>
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? <a href="http://libresonic.org/backend/requestLicense.view" target="_blank">\uB2E4\uC2DC \uBCF4\uB0B4\uAE30</a>.
premium.register.email = \uC774\uBA54\uC77C
premium.register.license = \uB77C\uC774\uC13C\uC2A4&nbsp;\uD0A4
# podcastReceiver.jsp # podcastReceiver.jsp
podcastreceiver.title = \uD31F\uCE90\uC2A4\uD2B8 \uC218\uC2E0\uAE30 podcastreceiver.title = \uD31F\uCE90\uC2A4\uD2B8 \uC218\uC2E0\uAE30
podcastreceiver.expandall = \uC5D0\uD53C\uC18C\uB4DC \uBCF4\uAE30 podcastreceiver.expandall = \uC5D0\uD53C\uC18C\uB4DC \uBCF4\uAE30

@ -30,8 +30,6 @@ common.confirm = Bevestig
common.unknown = (Onbekend) common.unknown = (Onbekend)
common.default = (Standaard) common.default = (Standaard)
common.settingssaved = Instellingen zijn opgeslagen. common.settingssaved = Instellingen zijn opgeslagen.
common.trialexpired = De testperiode is verlopen op {0}. Neem <b><a href="premiumSettings.view?">Subsonic Premium</a></b> om deze functie te gebruiken.
common.trialnotexpired = Deze functie is beschikbaar tot {0}. Daarna heb je <b><a href="premiumSettings.view?">Subsonic Premium</a></b> nodig.
# login.jsp # login.jsp
login.username = Gebruikersnaam login.username = Gebruikersnaam
@ -79,9 +77,6 @@ top.upgrade = Er is een nieuwe versie beschikbaar. Download {0} {1} \
<a href\="\#" onclick\="window.open(''http\://libresonic.org/'')">here</a>. <a href\="\#" onclick\="window.open(''http\://libresonic.org/'')">here</a>.
top.missing = Geen mediamappen gevonden. Verander de Instellingen. top.missing = Geen mediamappen gevonden. Verander de Instellingen.
top.logout = Uitloggen {0} top.logout = Uitloggen {0}
top.getpremium = Schaf Subsonic Premium aan.
top.gotpremium = Subsonic Premium
top.trialdaysleft = resterende testperiode {0} dag(en)
# left.jsp # left.jsp
left.scanning = Mediamappen worden gescanned. left.scanning = Mediamappen worden gescanned.
@ -269,10 +264,6 @@ upload.unzipped = Uitgepakt {0}
help.title = Over {0} help.title = Over {0}
help.upgrade = <b>Let op!</b> Er is een nieuwe versie beschikbaar. Download {0} {1} \ help.upgrade = <b>Let op!</b> Er is een nieuwe versie beschikbaar. Download {0} {1} \
<a href="#" onclick="window.open(''http://libresonic.org/'')">hier</a>. <a href="#" onclick="window.open(''http://libresonic.org/'')">hier</a>.
help.premium.title = Licentie
help.premium.expires = (vervalt op {0})
help.premium.upgrade = Upgrade naar <a href="premiumSettings.view">Subsonic Premium</a> om <a href="premiumSettings.view">extra functies te krijgen</a>!
help.premium.expired = (Licentie vervallen op {0})
help.version.title = Versie help.version.title = Versie
help.builddate.title = Compileer datum help.builddate.title = Compileer datum
help.server.title = Server help.server.title = Server
@ -573,7 +564,6 @@ main.sharealbum = Delen
main.more = Meer acties... main.more = Meer acties...
main.more.selection = Geselecteerde songs... main.more.selection = Geselecteerde songs...
main.more.share = Deel main.more.share = Deel
main.premium = <a href="{0}" style="text-decoration:underline">Schaf Subsonic Premium aan</a><br>(en verwijder de advertentie)
main.nowplaying = Speelt nu main.nowplaying = Speelt nu
main.lyrics = Teksten main.lyrics = Teksten
main.minutesago = minuten geleden main.minutesago = minuten geleden
@ -642,32 +632,6 @@ share.disabled = Om jouw muziek te kunnen delen moet je eerst je eigen <em>libre
Ga naar <a href="networksettings.view"><b>Instellingen &gt; Netwerk</b></a> (Administrator rechten vereist!). Ga naar <a href="networksettings.view"><b>Instellingen &gt; Netwerk</b></a> (Administrator rechten vereist!).
share.manage = Beheer gedeelde media. share.manage = Beheer gedeelde media.
# premium.jsp
premium.title = Subsonic Premium
premium.invalidlicense = Ongeldige licentie sleutel.
premium.text = <p>Upgrade naar Subsonic Premium om van deze extra functies te kunnen genieten:</p> \
<ul> \
<li><a href="http://libresonic.org/pages/apps.jsp" target="blank">Apps</a> voor Android, iPhone and Windows Phone*.</li> \
<li><a href="http://libresonic.org/pages/apps.jsp" target="blank">Apps</a> voor BlackBerry, Roku, Mac, Windows, Chrome and more*.</li> \
<li>Video streaming.</li> \
<li>Podcast ontvanger.</li> \
<li>Je persoonlijk server adres: <em>Jouwnaam</em>.libresonic.org (Zie <a href="networkSettings.view">Instellingen &gt; Netwerk</a>).</li> \
<li>Deel jouw media op Facebook, Twitter, Google+.</li> \
<li>Geen advertenties in de web interface.</li> \
<li>Meer functies die later uitgebracht worden.</li> \
</ul> \
<p style="font-size:9px;">* Sommige apps moeten separaat aangekocht worden.</p>
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? <a href="http://libresonic.org/backend/requestLicense.view" target="_blank">Stuur mij de sleutel opnieuw.</a>.
premium.register.email = Email
premium.register.license = Licentie&nbsp;sleutel
# podcastReceiver.jsp # podcastReceiver.jsp
podcastreceiver.title = Podcast ontvanger podcastreceiver.title = Podcast ontvanger
podcastreceiver.expandall = Toon uitzendingen podcastreceiver.expandall = Toon uitzendingen

@ -27,8 +27,6 @@ common.confirm = \u8ACB\u78BA\u8A8D
common.unknown = (\u672A\u77E5) common.unknown = (\u672A\u77E5)
common.default = (\u9810\u8A2D\u503C) common.default = (\u9810\u8A2D\u503C)
common.settingssaved = \u8A2D\u5B9A\u5DF2\u5132\u5B58\u3002 common.settingssaved = \u8A2D\u5B9A\u5DF2\u5132\u5B58\u3002
common.trialexpired = \u8A66\u7528\u7248\u5C07\u65BC {0} \u5230\u671F\u3002\u53D6\u5F97<b><a href="premiumSettings.view?">Subsonic Premium</a></b>\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\u5F97<b><a href="premiumSettings.view?">Subsonic Premium</a></b>\u624D\u80FD\u4F7F\u7528\u3002
# login.jsp # login.jsp
login.username = \u5E33\u865F login.username = \u5E33\u865F
@ -76,9 +74,6 @@ top.upgrade = \u6709\u65B0\u7248\u672C\u63D0\u4F9B. \u4E0B\u8F09 {0} {1} \
<a href\="\#" onclick\="window.open(''http\://libresonic.org/'')">\u9019\u88E1</a>\u3002 <a href\="\#" onclick\="window.open(''http\://libresonic.org/'')">\u9019\u88E1</a>\u3002
top.missing = \u627E\u4E0D\u5230\u97F3\u6A02\u8CC7\u6599\u593E\uFF0C\u8ACB\u91CD\u65B0\u8A2D\u5B9A\u3002 top.missing = \u627E\u4E0D\u5230\u97F3\u6A02\u8CC7\u6599\u593E\uFF0C\u8ACB\u91CD\u65B0\u8A2D\u5B9A\u3002
top.logout =\u767B\u51FA{0} 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.jsp
left.scanning = \u6383\u63CF\u97F3\u6A02\u8CC7\u6599\u593E\u4E2D\u2026 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.jsp
videoPlayer.getflash = Please install Flash Player videoPlayer.getflash = Please install Flash Player
videoPlayer.getpremium = Get <b><a href='premiumSettings.view?' target='main'>Subsonic Premium</a></b> to play on Chromecast.
# status.jsp # status.jsp
status.title = \u72C0\u614B status.title = \u72C0\u614B
@ -276,10 +270,6 @@ upload.unzipped = \u89E3\u58D3\u7E2E {0}
help.title = \u95DC\u65BC {0} help.title = \u95DC\u65BC {0}
help.upgrade = <b>\u6CE8\u610F\uFF01</b> \u6709\u65B0\u7248\u672C\u53EF\u7528\u3002\u4E0B\u8F09 {0} {1} \ help.upgrade = <b>\u6CE8\u610F\uFF01</b> \u6709\u65B0\u7248\u672C\u53EF\u7528\u3002\u4E0B\u8F09 {0} {1} \
<a href="#" onclick="window.open(''http://libresonic.org/'')">\u8ACB\u9EDE\u9078\u9019\u88E1</a>\u3002 <a href="#" onclick="window.open(''http://libresonic.org/'')">\u8ACB\u9EDE\u9078\u9019\u88E1</a>\u3002
help.premium.title = \u6388\u6B0A
help.premium.expires = (\u904E\u671F {0})
help.premium.upgrade = \u5347\u7D1A\u5230 <a href="premiumSettings.view">Subsonic Premium</a> \u4F86\u4F7F\u7528 <a href="premiumSettings.view">\u66F4\u591A\u529F\u80FD</a>\uFF01
help.premium.expired = (\u6388\u6B0A\u904E\u671F\u65BC {0})
help.version.title = \u7248\u672C help.version.title = \u7248\u672C
help.builddate.title = \u65E5\u671F help.builddate.title = \u65E5\u671F
help.server.title = \u4F3A\u670D\u5668 help.server.title = \u4F3A\u670D\u5668
@ -304,7 +294,6 @@ settingsheader.podcast = \u64AD\u5BA2
settingsheader.player = \u64AD\u653E\u5668 settingsheader.player = \u64AD\u653E\u5668
settingsheader.dlna = DLNA/UPnP settingsheader.dlna = DLNA/UPnP
settingsheader.sonos = Sonos settingsheader.sonos = Sonos
settingsheader.premium = Subsonic Premium
settingsheader.share = \u5206\u4EAB\u5A92\u9AD4 settingsheader.share = \u5206\u4EAB\u5A92\u9AD4
settingsheader.network = \u7DB2\u8DEF settingsheader.network = \u7DB2\u8DEF
settingsheader.transcoding = \u8F49\u6A94 settingsheader.transcoding = \u8F49\u6A94
@ -600,7 +589,6 @@ main.sharealbum = \u5206\u4EAB
main.more = \u66F4\u591A\u52D5\u4F5C\u2026 main.more = \u66F4\u591A\u52D5\u4F5C\u2026
main.more.selection = \u9078\u64C7\u6B4C\u66F2\u2026 main.more.selection = \u9078\u64C7\u6B4C\u66F2\u2026
main.more.share = \u5206\u4EAB main.more.share = \u5206\u4EAB
main.premium = <a href="{0}" style="text-decoration:underline">\u53D6\u5F97 Subsonic Premium</a><br>(\u4E26\u522A\u9664\u6B64\u5EE3\u544A)
main.nowplaying =\u76EE\u524D\u64A5\u653E main.nowplaying =\u76EE\u524D\u64A5\u653E
main.lyrics = \u6B4C\u8A5E main.lyrics = \u6B4C\u8A5E
main.minutesago = \u5206\u9418\u524D 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 <a href="networkSettings.view"><b>Settings &gt; Network</b></a> (administrative rights required). Please go to <a href="networkSettings.view"><b>Settings &gt; Network</b></a> (administrative rights required).
share.manage = Manage my shared media share.manage = Manage my shared media
# premium.jsp
premium.title = Subsonic Premium
premium.invalidlicense = Invalid license key.
premium.text = <p>Upgrade to <a href="http://premium.libresonic.org/" target="_blank">Subsonic Premium</a> to enjoy these extra features:</p> \
<ul> \
<li><a href="http://libresonic.org/pages/apps.jsp" target="_blank">Apps</a> for Android, iPhone, Windows Phone, Mac, Chrome and more*.</li> \
<li>Video streaming.</li> \
<li>Stream to your Chromecast and Sonos devices.</li> \
<li>Podcast receiver.</li> \
<li>Your personal server address: <em>yourname</em>.libresonic.org (see <a href="networkSettings.view">Settings &gt; Network</a>).</li> \
<li>Play your media on compatible DLNA/UPnP devices.</li> \
<li>Share your media on Facebook, Twitter, Google+.</li> \
<li>No ads in the web interface.</li> \
<li>Other features to be released later.</li> \
</ul> \
<p style="font-size:10px;">* Some apps must be purchased separately.</p>
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? <a href="http://libresonic.org/backend/requestLicense.view" target="_blank">Send it again</a>.
premium.register.email = Email
premium.register.license = License&nbsp;key
# podcastReceiver.jsp # podcastReceiver.jsp
podcastreceiver.title = \u64AD\u5BA2\u63A5\u6536\u5668 podcastreceiver.title = \u64AD\u5BA2\u63A5\u6536\u5668
podcastreceiver.empty = You haven't subscribed to any podcasts yet. podcastreceiver.empty = You haven't subscribed to any podcasts yet.

@ -409,7 +409,6 @@
<p>Your personal server address: <em>you</em>.libresonic.org</p> <p>Your personal server address: <em>you</em>.libresonic.org</p>
<p>Podcast receiver.</p> <p>Podcast receiver.</p>
</div> </div>
<p class="forward" style="white-space: nowrap"><a href="http://libresonic.org/pages/premium.jsp" target="_blank">Get Subsonic Premium</a></p>
</td> </td>
</c:if> </c:if>
</tr> </tr>

@ -40,9 +40,6 @@
</c:otherwise> </c:otherwise>
</c:choose> </c:choose>
<c:set var="licenseInfo" value="${model.licenseInfo}"/>
<%@ include file="licenseNotice.jsp" %>
<div style="padding-top:1em"> <div style="padding-top:1em">
<c:if test="${not empty model.dir}"> <c:if test="${not empty model.dir}">
<sub:url value="main.view" var="backUrl"><sub:param name="path" value="${model.dir.path}"/></sub:url> <sub:url value="main.view" var="backUrl"><sub:param name="path" value="${model.dir.path}"/></sub:url>

@ -53,9 +53,6 @@
<fmt:message key="dlnasettings.servername.description"/> <fmt:message key="dlnasettings.servername.description"/>
</p> </p>
<c:set var="licenseInfo" value="${model.licenseInfo}"/>
<%@ include file="licenseNotice.jsp" %>
<p> <p>
<input type="submit" value="<fmt:message key="common.save"/>" style="margin-right:0.3em"> <input type="submit" value="<fmt:message key="common.save"/>" style="margin-right:0.3em">
<input type="button" value="<fmt:message key="common.cancel"/>" onclick="location.href='nowPlaying.view'"> <input type="button" value="<fmt:message key="common.cancel"/>" onclick="location.href='nowPlaying.view'">

@ -90,9 +90,6 @@
</p> </p>
</div> </div>
<c:set var="licenseInfo" value="${command.licenseInfo}"/>
<%@ include file="licenseNotice.jsp" %>
<p style="padding-top:1em"> <p style="padding-top:1em">
<input type="submit" value="<fmt:message key="common.save"/>" style="margin-right:0.3em"> <input type="submit" value="<fmt:message key="common.save"/>" style="margin-right:0.3em">
<input type="button" value="<fmt:message key="common.cancel"/>" onclick="location.href='nowPlaying.view'"> <input type="button" value="<fmt:message key="common.cancel"/>" onclick="location.href='nowPlaying.view'">

@ -91,15 +91,8 @@
* launch app and request session * launch app and request session
*/ */
CastPlayer.prototype.launchCastApp = function () { CastPlayer.prototype.launchCastApp = function () {
<c:choose>
<c:when test="${model.licenseInfo.licenseOrTrialValid}">
this.log("launching app..."); this.log("launching app...");
chrome.cast.requestSession(this.onRequestSessionSuccess.bind(this), this.onLaunchError.bind(this)); chrome.cast.requestSession(this.onRequestSessionSuccess.bind(this), this.onLaunchError.bind(this));
</c:when>
<c:otherwise>
$().toastmessage('showNoticeToast', "<fmt:message key="videoPlayer.getpremium"/>");
</c:otherwise>
</c:choose>
}; };
/** /**

@ -110,8 +110,5 @@
</form> </form>
</c:if> </c:if>
<c:set var="licenseInfo" value="${model.licenseInfo}"/>
<%@ include file="licenseNotice.jsp" %>
</body> </body>
</html> </html>

@ -1,93 +0,0 @@
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="iso-8859-1" %>
<%--@elvariable id="command" type="org.libresonic.player.command.PremiumSettingsCommand"--%>
<html>
<head>
<%@ include file="head.jsp" %>
<%@ include file="jquery.jsp" %>
</head>
<body class="mainframe bgcolor1">
<c:import url="settingsHeader.jsp">
<c:param name="cat" value="premium"/>
<c:param name="restricted" value="${not command.user.adminRole}"/>
<c:param name="toast" value="${settings_toast}"/>
</c:import>
<c:if test="${not empty command.path}">
<sub:url value="main.view" var="backUrl">
<sub:param name="path" value="${command.path}"/>
</sub:url>
<div class="back"><a href="${backUrl}">
<fmt:message key="common.back"/>
</a></div>
<br/>
</c:if>
<div style="width:50em; max-width:50em">
<fmt:message key="premium.text"/>
<fmt:formatDate value="${command.licenseInfo.licenseExpires}" dateStyle="long" var="expirationDate"/>
<c:if test="${command.licenseInfo.licenseValid}">
<c:choose>
<c:when test="${empty command.licenseInfo.licenseExpires}">
<p><b><fmt:message key="premium.licensed"/></b></p>
</c:when>
<c:otherwise>
<p><b><fmt:message key="premium.licensedexpires"><fmt:param value="${expirationDate}"/></fmt:message></b></p>
</c:otherwise>
</c:choose>
<c:if test="${not command.forceChange and not command.submissionError}">
<p>
<fmt:message key="premium.licensedto"><fmt:param value="${command.licenseInfo.licenseEmail}"/></fmt:message>
</p>
<c:if test="${command.user.adminRole}">
<div class="forward"><a href="premiumSettings.view?change"><fmt:message key="premium.forcechange"/></a></div>
</c:if>
</c:if>
</c:if>
<c:if test="${not command.licenseInfo.licenseValid}">
<c:if test="${not empty command.licenseInfo.licenseExpires}">
<p><b><fmt:message key="premium.licensedexpired"><fmt:param value="${expirationDate}"/></fmt:message></b></p>
</c:if>
<p class="forward" style="font-size:1.2em;margin-left: 1em"><b><a href="http://libresonic.org/pages/premium.jsp" target="_blank">
<fmt:message key="premium.getpremium"/>
<c:if test="${command.licenseInfo.trialDaysLeft gt 0}">
&ndash; <fmt:message key="top.trialdaysleft"><fmt:param value="${command.licenseInfo.trialDaysLeft}"/></fmt:message>
</c:if>
</a></b></p>
<p><fmt:message key="premium.register"/></p>
</c:if>
<c:if test="${not command.licenseInfo.licenseValid or command.forceChange or command.submissionError}">
<form:form commandName="command" method="post" action="premiumSettings.view">
<form:hidden path="path"/>
<table>
<tr>
<td><fmt:message key="premium.register.email"/></td>
<td>
<form:input path="licenseInfo.licenseEmail" size="60"/>
</td>
</tr>
<tr>
<td><fmt:message key="premium.register.license"/></td>
<td>
<form:input path="licenseCode" size="60"/>
</td>
<td><input type="submit" value="<fmt:message key="common.ok"/>"/></td>
</tr>
<tr>
<td/>
<td class="warning"><form:errors path="licenseCode"/></td>
</tr>
</table>
</form:form>
<p><fmt:message key="premium.resend"/></p>
</c:if>
</div>
</body>
</html>

@ -153,17 +153,6 @@
</head> </head>
<body class="bgcolor1 rightframe" style="padding-top:2em" onload="init()"> <body class="bgcolor1 rightframe" style="padding-top:2em" onload="init()">
<c:if test="${not model.licenseInfo.licenseValid}">
<div class="detail" style="text-align: center;padding-bottom: 1em">
<a href="premiumSettings.view" target="main"><img src="<spring:theme code="donateSmallImage"/>" alt="">
<fmt:message key="top.getpremium"/></a>
<c:if test="${model.licenseInfo.trialDaysLeft gt 0}">
<br>
<a href="premiumSettings.view" target="main"><fmt:message key="top.trialdaysleft"><fmt:param value="${model.licenseInfo.trialDaysLeft}"/></fmt:message></a>
</c:if>
</div>
</c:if>
<c:if test="${model.newVersionAvailable}"> <c:if test="${model.newVersionAvailable}">
<div class="warning" style="padding-bottom: 1em"> <div class="warning" style="padding-bottom: 1em">
<fmt:message key="top.upgrade"><fmt:param value="${model.brand}"/><fmt:param value="${model.latestVersion}"/></fmt:message> <fmt:message key="top.upgrade"><fmt:param value="${model.brand}"/><fmt:param value="${model.latestVersion}"/></fmt:message>

@ -55,9 +55,6 @@
</table> </table>
<c:set var="licenseInfo" value="${model.licenseInfo}"/>
<%@ include file="licenseNotice.jsp" %>
<p style="padding-top:1em"> <p style="padding-top:1em">
<input type="submit" value="<fmt:message key="common.save"/>" style="margin-right:0.3em"> <input type="submit" value="<fmt:message key="common.save"/>" style="margin-right:0.3em">
<input type="button" value="<fmt:message key="common.cancel"/>" onclick="location.href='nowPlaying.view'" style="margin-right:2.0em"> <input type="button" value="<fmt:message key="common.cancel"/>" onclick="location.href='nowPlaying.view'" style="margin-right:2.0em">

@ -53,9 +53,6 @@
<fmt:message key="sonossettings.servicename.description"/> <fmt:message key="sonossettings.servicename.description"/>
</p> </p>
<c:set var="licenseInfo" value="${model.licenseInfo}"/>
<%@ include file="licenseNotice.jsp" %>
<p> <p>
<input type="submit" value="<fmt:message key="common.save"/>" style="margin-right:0.3em"> <input type="submit" value="<fmt:message key="common.save"/>" style="margin-right:0.3em">
<input type="button" value="<fmt:message key="common.cancel"/>" onclick="location.href='nowPlaying.view'"> <input type="button" value="<fmt:message key="common.cancel"/>" onclick="location.href='nowPlaying.view'">

@ -27,10 +27,6 @@
<body class="mainframe bgcolor1" style="padding-bottom:0.5em"> <body class="mainframe bgcolor1" style="padding-bottom:0.5em">
<c:set var="licenseInfo" value="${model.licenseInfo}"/>
<%@ include file="licenseNotice.jsp" %>
<c:if test="${licenseInfo.licenseOrTrialValid}">
<div> <div>
<div id="overlay"> <div id="overlay">
<div id="overlay_text">Playing on Chromecast</div> <div id="overlay_text">Playing on Chromecast</div>

@ -54,9 +54,6 @@ public class SettingsServiceTestCase extends TestCase {
assertEquals("Wrong default index creation hour.", 3, settingsService.getIndexCreationHour()); assertEquals("Wrong default index creation hour.", 3, settingsService.getIndexCreationHour());
assertTrue("Wrong default playlist folder.", settingsService.getPlaylistFolder().endsWith("playlists")); assertTrue("Wrong default playlist folder.", settingsService.getPlaylistFolder().endsWith("playlists"));
assertEquals("Wrong default theme.", "default", settingsService.getThemeId()); assertEquals("Wrong default theme.", "default", settingsService.getThemeId());
assertNull("Wrong default license email.", settingsService.getLicenseEmail());
assertNull("Wrong default license code.", settingsService.getLicenseCode());
assertNull("Wrong default license date.", settingsService.getLicenseDate());
assertEquals("Wrong default Podcast episode retention count.", 10, settingsService.getPodcastEpisodeRetentionCount()); assertEquals("Wrong default Podcast episode retention count.", 10, settingsService.getPodcastEpisodeRetentionCount());
assertEquals("Wrong default Podcast episode download count.", 1, settingsService.getPodcastEpisodeDownloadCount()); assertEquals("Wrong default Podcast episode download count.", 1, settingsService.getPodcastEpisodeDownloadCount());
assertTrue("Wrong default Podcast folder.", settingsService.getPodcastFolder().endsWith("Podcast")); assertTrue("Wrong default Podcast folder.", settingsService.getPodcastFolder().endsWith("Podcast"));
@ -83,9 +80,6 @@ public class SettingsServiceTestCase extends TestCase {
settingsService.setThemeId("dark"); settingsService.setThemeId("dark");
settingsService.setIndexCreationInterval(4); settingsService.setIndexCreationInterval(4);
settingsService.setIndexCreationHour(9); settingsService.setIndexCreationHour(9);
settingsService.setLicenseEmail("sindre@foo.bar.no");
settingsService.setLicenseCode(null);
settingsService.setLicenseDate(new Date(223423412351253L));
settingsService.setPodcastEpisodeRetentionCount(5); settingsService.setPodcastEpisodeRetentionCount(5);
settingsService.setPodcastEpisodeDownloadCount(-1); settingsService.setPodcastEpisodeDownloadCount(-1);
settingsService.setPodcastFolder("d:/podcasts"); settingsService.setPodcastFolder("d:/podcasts");
@ -123,9 +117,6 @@ public class SettingsServiceTestCase extends TestCase {
assertEquals("Wrong theme.", "dark", ss.getThemeId()); assertEquals("Wrong theme.", "dark", ss.getThemeId());
assertEquals("Wrong index creation interval.", 4, ss.getIndexCreationInterval()); assertEquals("Wrong index creation interval.", 4, ss.getIndexCreationInterval());
assertEquals("Wrong index creation hour.", 9, ss.getIndexCreationHour()); assertEquals("Wrong index creation hour.", 9, ss.getIndexCreationHour());
assertEquals("Wrong license email.", "sindre@foo.bar.no", ss.getLicenseEmail());
assertEquals("Wrong license code.", null, ss.getLicenseCode());
assertEquals("Wrong license date.", new Date(223423412351253L), ss.getLicenseDate());
assertEquals("Wrong Podcast episode retention count.", 5, settingsService.getPodcastEpisodeRetentionCount()); assertEquals("Wrong Podcast episode retention count.", 5, settingsService.getPodcastEpisodeRetentionCount());
assertEquals("Wrong Podcast episode download count.", -1, settingsService.getPodcastEpisodeDownloadCount()); assertEquals("Wrong Podcast episode download count.", -1, settingsService.getPodcastEpisodeDownloadCount());
assertEquals("Wrong Podcast folder.", "d:/podcasts", settingsService.getPodcastFolder()); assertEquals("Wrong Podcast folder.", "d:/podcasts", settingsService.getPodcastFolder());

@ -27,7 +27,6 @@
<xs:element name="playlist" type="sub:PlaylistWithSongs" minOccurs="1" maxOccurs="1"/> <xs:element name="playlist" type="sub:PlaylistWithSongs" minOccurs="1" maxOccurs="1"/>
<xs:element name="jukeboxStatus" type="sub:JukeboxStatus" minOccurs="1" maxOccurs="1"/> <xs:element name="jukeboxStatus" type="sub:JukeboxStatus" minOccurs="1" maxOccurs="1"/>
<xs:element name="jukeboxPlaylist" type="sub:JukeboxPlaylist" minOccurs="1" maxOccurs="1"/> <xs:element name="jukeboxPlaylist" type="sub:JukeboxPlaylist" minOccurs="1" maxOccurs="1"/>
<xs:element name="license" type="sub:License" minOccurs="1" maxOccurs="1"/>
<xs:element name="users" type="sub:Users" minOccurs="1" maxOccurs="1"/> <xs:element name="users" type="sub:Users" minOccurs="1" maxOccurs="1"/>
<xs:element name="user" type="sub:User" minOccurs="1" maxOccurs="1"/> <xs:element name="user" type="sub:User" minOccurs="1" maxOccurs="1"/>
<xs:element name="chatMessages" type="sub:ChatMessages" minOccurs="1" maxOccurs="1"/> <xs:element name="chatMessages" type="sub:ChatMessages" minOccurs="1" maxOccurs="1"/>
@ -546,13 +545,6 @@
</xs:sequence> </xs:sequence>
</xs:complexType> </xs:complexType>
<xs:complexType name="License">
<xs:attribute name="valid" type="xs:boolean" use="required"/>
<xs:attribute name="email" type="xs:string" use="optional"/>
<xs:attribute name="licenseExpires" type="xs:dateTime" use="optional"/>
<xs:attribute name="trialExpires" type="xs:dateTime" use="optional"/>
</xs:complexType>
<xs:complexType name="Users"> <xs:complexType name="Users">
<xs:sequence> <xs:sequence>
<xs:element name="user" type="sub:User" minOccurs="0" maxOccurs="unbounded"/> <xs:element name="user" type="sub:User" minOccurs="0" maxOccurs="unbounded"/>

Loading…
Cancel
Save