Merge pull request #1681 from MediaBrowser/dev

Dev
This commit is contained in:
Luke 2016-04-24 20:40:34 -04:00
commit e02b3f479e
46 changed files with 277 additions and 192 deletions

View File

@ -2222,9 +2222,10 @@ namespace MediaBrowser.Api.Playback
if (state.VideoRequest != null) if (state.VideoRequest != null)
{ {
// Important: If this is ever re-enabled, make sure not to use it with wtv because it breaks seeking
if (string.Equals(state.OutputContainer, "mkv", StringComparison.OrdinalIgnoreCase) && state.VideoRequest.CopyTimestamps) if (string.Equals(state.OutputContainer, "mkv", StringComparison.OrdinalIgnoreCase) && state.VideoRequest.CopyTimestamps)
{ {
inputModifier += " -noaccurate_seek"; //inputModifier += " -noaccurate_seek";
} }
} }

View File

@ -54,8 +54,9 @@
<Reference Include="MoreLinq"> <Reference Include="MoreLinq">
<HintPath>..\packages\morelinq.1.4.0\lib\net35\MoreLinq.dll</HintPath> <HintPath>..\packages\morelinq.1.4.0\lib\net35\MoreLinq.dll</HintPath>
</Reference> </Reference>
<Reference Include="NLog"> <Reference Include="NLog, Version=4.0.0.0, Culture=neutral, PublicKeyToken=5120e14c03d0593c, processorArchitecture=MSIL">
<HintPath>..\packages\NLog.4.2.3\lib\net45\NLog.dll</HintPath> <HintPath>..\packages\NLog.4.3.1\lib\net45\NLog.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="Patterns.Logging"> <Reference Include="Patterns.Logging">
<HintPath>..\packages\Patterns.Logging.1.0.0.2\lib\portable-net45+sl4+wp71+win8+wpa81\Patterns.Logging.dll</HintPath> <HintPath>..\packages\Patterns.Logging.1.0.0.2\lib\portable-net45+sl4+wp71+win8+wpa81\Patterns.Logging.dll</HintPath>
@ -64,8 +65,9 @@
<SpecificVersion>False</SpecificVersion> <SpecificVersion>False</SpecificVersion>
<HintPath>..\ThirdParty\SharpCompress\SharpCompress.dll</HintPath> <HintPath>..\ThirdParty\SharpCompress\SharpCompress.dll</HintPath>
</Reference> </Reference>
<Reference Include="SimpleInjector"> <Reference Include="SimpleInjector, Version=3.1.3.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
<HintPath>..\packages\SimpleInjector.3.1.2\lib\net45\SimpleInjector.dll</HintPath> <HintPath>..\packages\SimpleInjector.3.1.3\lib\net45\SimpleInjector.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Configuration" /> <Reference Include="System.Configuration" />

View File

@ -2,7 +2,7 @@
<packages> <packages>
<package id="CommonIO" version="1.0.0.9" targetFramework="net45" /> <package id="CommonIO" version="1.0.0.9" targetFramework="net45" />
<package id="morelinq" version="1.4.0" targetFramework="net45" /> <package id="morelinq" version="1.4.0" targetFramework="net45" />
<package id="NLog" version="4.2.3" targetFramework="net45" /> <package id="NLog" version="4.3.1" targetFramework="net45" />
<package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" /> <package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" />
<package id="SimpleInjector" version="3.1.2" targetFramework="net45" /> <package id="SimpleInjector" version="3.1.3" targetFramework="net45" />
</packages> </packages>

View File

@ -255,7 +255,7 @@ namespace MediaBrowser.Controller.Entities.TV
// Refresh current item // Refresh current item
await RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false); await RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
// Refresh TV // Refresh seasons
foreach (var item in seasons) foreach (var item in seasons)
{ {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
@ -268,12 +268,30 @@ namespace MediaBrowser.Controller.Entities.TV
progress.Report(percent * 100); progress.Report(percent * 100);
} }
// Refresh all non-songs // Refresh episodes and other children
foreach (var item in otherItems) foreach (var item in otherItems)
{ {
cancellationToken.ThrowIfCancellationRequested(); cancellationToken.ThrowIfCancellationRequested();
await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false); var skipItem = false;
var episode = item as Episode;
if (episode != null
&& refreshOptions.MetadataRefreshMode != MetadataRefreshMode.FullRefresh
&& !refreshOptions.ReplaceAllMetadata
&& episode.IsMissingEpisode
&& episode.LocationType == Model.Entities.LocationType.Virtual
&& episode.PremiereDate.HasValue
&& (DateTime.UtcNow - episode.PremiereDate.Value).TotalDays > 30)
{
skipItem = true;
}
if (!skipItem)
{
await item.RefreshMetadata(refreshOptions, cancellationToken).ConfigureAwait(false);
}
numComplete++; numComplete++;
double percent = numComplete; double percent = numComplete;

View File

@ -86,5 +86,7 @@ namespace MediaBrowser.Controller
/// <param name="ipAddress">The ip address.</param> /// <param name="ipAddress">The ip address.</param>
/// <returns>System.String.</returns> /// <returns>System.String.</returns>
string GetLocalApiUrl(IPAddress ipAddress); string GetLocalApiUrl(IPAddress ipAddress);
void LaunchUrl(string url);
} }
} }

View File

@ -23,7 +23,7 @@ namespace MediaBrowser.Providers.BoxSets
{ {
public class MovieDbBoxSetProvider : IRemoteMetadataProvider<BoxSet, BoxSetInfo> public class MovieDbBoxSetProvider : IRemoteMetadataProvider<BoxSet, BoxSetInfo>
{ {
private const string GetCollectionInfo3 = @"http://api.themoviedb.org/3/collection/{0}?api_key={1}&append_to_response=images"; private const string GetCollectionInfo3 = @"https://api.themoviedb.org/3/collection/{0}?api_key={1}&append_to_response=images";
internal static MovieDbBoxSetProvider Current; internal static MovieDbBoxSetProvider Current;

View File

@ -20,6 +20,7 @@ using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using CommonIO; using CommonIO;
using MediaBrowser.Model.Serialization;
namespace MediaBrowser.Providers.Manager namespace MediaBrowser.Providers.Manager
{ {
@ -60,6 +61,7 @@ namespace MediaBrowser.Providers.Manager
private IEnumerable<IMetadataSaver> _savers; private IEnumerable<IMetadataSaver> _savers;
private IImageSaver[] _imageSavers; private IImageSaver[] _imageSavers;
private readonly IServerApplicationPaths _appPaths; private readonly IServerApplicationPaths _appPaths;
private readonly IJsonSerializer _json;
private IExternalId[] _externalIds; private IExternalId[] _externalIds;
@ -73,7 +75,7 @@ namespace MediaBrowser.Providers.Manager
/// <param name="libraryMonitor">The directory watchers.</param> /// <param name="libraryMonitor">The directory watchers.</param>
/// <param name="logManager">The log manager.</param> /// <param name="logManager">The log manager.</param>
/// <param name="fileSystem">The file system.</param> /// <param name="fileSystem">The file system.</param>
public ProviderManager(IHttpClient httpClient, IServerConfigurationManager configurationManager, ILibraryMonitor libraryMonitor, ILogManager logManager, IFileSystem fileSystem, IServerApplicationPaths appPaths, Func<ILibraryManager> libraryManagerFactory) public ProviderManager(IHttpClient httpClient, IServerConfigurationManager configurationManager, ILibraryMonitor libraryMonitor, ILogManager logManager, IFileSystem fileSystem, IServerApplicationPaths appPaths, Func<ILibraryManager> libraryManagerFactory, IJsonSerializer json)
{ {
_logger = logManager.GetLogger("ProviderManager"); _logger = logManager.GetLogger("ProviderManager");
_httpClient = httpClient; _httpClient = httpClient;
@ -82,6 +84,7 @@ namespace MediaBrowser.Providers.Manager
_fileSystem = fileSystem; _fileSystem = fileSystem;
_appPaths = appPaths; _appPaths = appPaths;
_libraryManagerFactory = libraryManagerFactory; _libraryManagerFactory = libraryManagerFactory;
_json = json;
} }
/// <summary> /// <summary>
@ -730,8 +733,6 @@ namespace MediaBrowser.Providers.Manager
where TItemType : BaseItem, new() where TItemType : BaseItem, new()
where TLookupType : ItemLookupInfo where TLookupType : ItemLookupInfo
{ {
const int maxResults = 10;
// Give it a dummy path just so that it looks like a file system item // Give it a dummy path just so that it looks like a file system item
var dummy = new TItemType var dummy = new TItemType
{ {
@ -761,7 +762,6 @@ namespace MediaBrowser.Providers.Manager
} }
var resultList = new List<RemoteSearchResult>(); var resultList = new List<RemoteSearchResult>();
var foundProviderIds = new Dictionary<Tuple<string, string>, RemoteSearchResult>();
foreach (var provider in providers) foreach (var provider in providers)
{ {
@ -771,32 +771,27 @@ namespace MediaBrowser.Providers.Manager
foreach (var result in results) foreach (var result in results)
{ {
var bFound = false; var existingMatch = resultList.FirstOrDefault(i => i.ProviderIds.Any(p => string.Equals(result.GetProviderId(p.Key), p.Value, StringComparison.OrdinalIgnoreCase)));
// This check prevents duplicate search results by comparing provider ids if (existingMatch == null)
foreach (var providerId in result.ProviderIds)
{
var idTuple = new Tuple<string, string>(providerId.Key.ToLower(), providerId.Value.ToLower());
if (!foundProviderIds.ContainsKey(idTuple))
{
foundProviderIds.Add(idTuple, result);
}
else
{
bFound = true;
var existingResult = foundProviderIds[idTuple];
if (string.IsNullOrEmpty(existingResult.ImageUrl) && !string.IsNullOrEmpty(result.ImageUrl))
{
existingResult.ImageUrl = result.ImageUrl;
}
}
}
if (!bFound && resultList.Count < maxResults)
{ {
resultList.Add(result); resultList.Add(result);
} }
else
{
foreach (var providerId in result.ProviderIds)
{
if (!existingMatch.ProviderIds.ContainsKey(providerId.Key))
{
existingMatch.ProviderIds.Add(providerId.Key, providerId.Value);
}
}
if (string.IsNullOrWhiteSpace(existingMatch.ImageUrl))
{
existingMatch.ImageUrl = result.ImageUrl;
}
}
} }
} }
catch (Exception ex) catch (Exception ex)
@ -805,6 +800,8 @@ namespace MediaBrowser.Providers.Manager
} }
} }
//_logger.Debug("Returning search results {0}", _json.SerializeToString(resultList));
return resultList; return resultList;
} }

View File

@ -20,7 +20,7 @@ namespace MediaBrowser.Providers.Movies
{ {
class FanartMovieUpdatesPostScanTask : ILibraryPostScanTask class FanartMovieUpdatesPostScanTask : ILibraryPostScanTask
{ {
private const string UpdatesUrl = "http://webservice.fanart.tv/v3/movies/latest?api_key={0}&date={1}"; private const string UpdatesUrl = "https://webservice.fanart.tv/v3/movies/latest?api_key={0}&date={1}";
/// <summary> /// <summary>
/// The _HTTP client /// The _HTTP client

View File

@ -31,7 +31,7 @@ namespace MediaBrowser.Providers.Movies
private readonly IFileSystem _fileSystem; private readonly IFileSystem _fileSystem;
private readonly IJsonSerializer _json; private readonly IJsonSerializer _json;
private const string FanArtBaseUrl = "http://webservice.fanart.tv/v3/movies/{1}?api_key={0}"; private const string FanArtBaseUrl = "https://webservice.fanart.tv/v3/movies/{1}?api_key={0}";
// &client_key=52c813aa7b8c8b3bb87f4797532a2f8c // &client_key=52c813aa7b8c8b3bb87f4797532a2f8c
internal static FanartMovieImageProvider Current; internal static FanartMovieImageProvider Current;

View File

@ -329,7 +329,7 @@ namespace MediaBrowser.Providers.Movies
{ {
hasTrailers.RemoteTrailers = movieData.trailers.youtube.Select(i => new MediaUrl hasTrailers.RemoteTrailers = movieData.trailers.youtube.Select(i => new MediaUrl
{ {
Url = string.Format("http://www.youtube.com/watch?v={0}", i.source), Url = string.Format("https://www.youtube.com/watch?v={0}", i.source),
Name = i.name, Name = i.name,
VideoSize = string.Equals("hd", i.size, StringComparison.OrdinalIgnoreCase) ? VideoSize.HighDefinition : VideoSize.StandardDefinition VideoSize = string.Equals("hd", i.size, StringComparison.OrdinalIgnoreCase) ? VideoSize.HighDefinition : VideoSize.StandardDefinition

View File

@ -172,8 +172,8 @@ namespace MediaBrowser.Providers.Movies
} }
} }
private const string TmdbConfigUrl = "http://api.themoviedb.org/3/configuration?api_key={0}"; private const string TmdbConfigUrl = "https://api.themoviedb.org/3/configuration?api_key={0}";
private const string GetMovieInfo3 = @"http://api.themoviedb.org/3/movie/{0}?api_key={1}&append_to_response=casts,releases,images,keywords,trailers"; private const string GetMovieInfo3 = @"https://api.themoviedb.org/3/movie/{0}?api_key={1}&append_to_response=casts,releases,images,keywords,trailers";
internal static string ApiKey = "f6bd687ffa63cd282b6ff2c6877f2669"; internal static string ApiKey = "f6bd687ffa63cd282b6ff2c6877f2669";
internal static string AcceptHeader = "application/json,image/*"; internal static string AcceptHeader = "application/json,image/*";
@ -281,7 +281,7 @@ namespace MediaBrowser.Providers.Movies
public static string NormalizeLanguage(string language) public static string NormalizeLanguage(string language)
{ {
// They require this to be uppercase // They require this to be uppercase
// http://emby.media/community/index.php?/topic/32454-fr-follow-tmdbs-new-language-api-update/?p=311148 // https://emby.media/community/index.php?/topic/32454-fr-follow-tmdbs-new-language-api-update/?p=311148
var parts = language.Split('-'); var parts = language.Split('-');
if (parts.Length == 2) if (parts.Length == 2)

View File

@ -18,7 +18,7 @@ namespace MediaBrowser.Providers.Movies
public class MovieDbSearch public class MovieDbSearch
{ {
private static readonly CultureInfo EnUs = new CultureInfo("en-US"); private static readonly CultureInfo EnUs = new CultureInfo("en-US");
private const string Search3 = @"http://api.themoviedb.org/3/search/{3}?api_key={1}&query={0}&language={2}"; private const string Search3 = @"https://api.themoviedb.org/3/search/{3}?api_key={1}&query={0}&language={2}";
internal static string ApiKey = "f6bd687ffa63cd282b6ff2c6877f2669"; internal static string ApiKey = "f6bd687ffa63cd282b6ff2c6877f2669";
internal static string AcceptHeader = "application/json,image/*"; internal static string AcceptHeader = "application/json,image/*";

View File

@ -21,7 +21,7 @@ namespace MediaBrowser.Providers.Movies
public string UrlFormatString public string UrlFormatString
{ {
get { return "http://www.themoviedb.org/movie/{0}"; } get { return "https://www.themoviedb.org/movie/{0}"; }
} }
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)
@ -51,7 +51,7 @@ namespace MediaBrowser.Providers.Movies
public string UrlFormatString public string UrlFormatString
{ {
get { return "http://www.themoviedb.org/tv/{0}"; } get { return "https://www.themoviedb.org/tv/{0}"; }
} }
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)
@ -74,7 +74,7 @@ namespace MediaBrowser.Providers.Movies
public string UrlFormatString public string UrlFormatString
{ {
get { return "http://www.themoviedb.org/collection/{0}"; } get { return "https://www.themoviedb.org/collection/{0}"; }
} }
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)
@ -97,7 +97,7 @@ namespace MediaBrowser.Providers.Movies
public string UrlFormatString public string UrlFormatString
{ {
get { return "http://www.themoviedb.org/person/{0}"; } get { return "https://www.themoviedb.org/person/{0}"; }
} }
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)
@ -120,7 +120,7 @@ namespace MediaBrowser.Providers.Movies
public string UrlFormatString public string UrlFormatString
{ {
get { return "http://www.themoviedb.org/collection/{0}"; } get { return "https://www.themoviedb.org/collection/{0}"; }
} }
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)

View File

@ -22,7 +22,7 @@ namespace MediaBrowser.Providers.Movies
/// <summary> /// <summary>
/// The updates URL /// The updates URL
/// </summary> /// </summary>
private const string UpdatesUrl = "http://api.themoviedb.org/3/movie/changes?start_date={0}&api_key={1}&page={2}"; private const string UpdatesUrl = "https://api.themoviedb.org/3/movie/changes?start_date={0}&api_key={1}&page={2}";
/// <summary> /// <summary>
/// The _HTTP client /// The _HTTP client

View File

@ -26,7 +26,7 @@ namespace MediaBrowser.Providers.Music
{ {
internal readonly SemaphoreSlim FanArtResourcePool = new SemaphoreSlim(3, 3); internal readonly SemaphoreSlim FanArtResourcePool = new SemaphoreSlim(3, 3);
internal const string ApiKey = "5c6b04c68e904cfed1e6cbc9a9e683d4"; internal const string ApiKey = "5c6b04c68e904cfed1e6cbc9a9e683d4";
private const string FanArtBaseUrl = "http://webservice.fanart.tv/v3.1/music/{1}?api_key={0}"; private const string FanArtBaseUrl = "https://webservice.fanart.tv/v3.1/music/{1}?api_key={0}";
private readonly CultureInfo _usCulture = new CultureInfo("en-US"); private readonly CultureInfo _usCulture = new CultureInfo("en-US");
private readonly IServerConfigurationManager _config; private readonly IServerConfigurationManager _config;

View File

@ -19,7 +19,7 @@ namespace MediaBrowser.Providers.Music
{ {
class FanartUpdatesPostScanTask : ILibraryPostScanTask class FanartUpdatesPostScanTask : ILibraryPostScanTask
{ {
private const string UpdatesUrl = "http://api.fanart.tv/webservice/newmusic/{0}/{1}/"; private const string UpdatesUrl = "https://api.fanart.tv/webservice/newmusic/{0}/{1}/";
/// <summary> /// <summary>
/// The _HTTP client /// The _HTTP client

View File

@ -42,7 +42,7 @@ namespace MediaBrowser.Providers.Music
if (!string.IsNullOrEmpty(releaseId)) if (!string.IsNullOrEmpty(releaseId))
{ {
url = string.Format("http://www.musicbrainz.org/ws/2/release/?query=reid:{0}", releaseId); url = string.Format("https://www.musicbrainz.org/ws/2/release/?query=reid:{0}", releaseId);
} }
else else
{ {
@ -50,7 +50,7 @@ namespace MediaBrowser.Providers.Music
if (!string.IsNullOrWhiteSpace(artistMusicBrainzId)) if (!string.IsNullOrWhiteSpace(artistMusicBrainzId))
{ {
url = string.Format("http://www.musicbrainz.org/ws/2/release/?query=\"{0}\" AND arid:{1}", url = string.Format("https://www.musicbrainz.org/ws/2/release/?query=\"{0}\" AND arid:{1}",
WebUtility.UrlEncode(searchInfo.Name), WebUtility.UrlEncode(searchInfo.Name),
artistMusicBrainzId); artistMusicBrainzId);
} }
@ -58,7 +58,7 @@ namespace MediaBrowser.Providers.Music
{ {
isNameSearch = true; isNameSearch = true;
url = string.Format("http://www.musicbrainz.org/ws/2/release/?query=\"{0}\" AND artist:\"{1}\"", url = string.Format("https://www.musicbrainz.org/ws/2/release/?query=\"{0}\" AND artist:\"{1}\"",
WebUtility.UrlEncode(searchInfo.Name), WebUtility.UrlEncode(searchInfo.Name),
WebUtility.UrlEncode(searchInfo.GetAlbumArtist())); WebUtility.UrlEncode(searchInfo.GetAlbumArtist()));
} }
@ -77,7 +77,7 @@ namespace MediaBrowser.Providers.Music
private IEnumerable<RemoteSearchResult> GetResultsFromResponse(XmlDocument doc) private IEnumerable<RemoteSearchResult> GetResultsFromResponse(XmlDocument doc)
{ {
var ns = new XmlNamespaceManager(doc.NameTable); var ns = new XmlNamespaceManager(doc.NameTable);
ns.AddNamespace("mb", "http://musicbrainz.org/ns/mmd-2.0#"); ns.AddNamespace("mb", "https://musicbrainz.org/ns/mmd-2.0#");
var list = new List<RemoteSearchResult>(); var list = new List<RemoteSearchResult>();
@ -197,7 +197,7 @@ namespace MediaBrowser.Providers.Music
private async Task<ReleaseResult> GetReleaseResult(string albumName, string artistId, CancellationToken cancellationToken) private async Task<ReleaseResult> GetReleaseResult(string albumName, string artistId, CancellationToken cancellationToken)
{ {
var url = string.Format("http://www.musicbrainz.org/ws/2/release/?query=\"{0}\" AND arid:{1}", var url = string.Format("https://www.musicbrainz.org/ws/2/release/?query=\"{0}\" AND arid:{1}",
WebUtility.UrlEncode(albumName), WebUtility.UrlEncode(albumName),
artistId); artistId);
@ -208,7 +208,7 @@ namespace MediaBrowser.Providers.Music
private async Task<ReleaseResult> GetReleaseResultByArtistName(string albumName, string artistName, CancellationToken cancellationToken) private async Task<ReleaseResult> GetReleaseResultByArtistName(string albumName, string artistName, CancellationToken cancellationToken)
{ {
var url = string.Format("http://www.musicbrainz.org/ws/2/release/?query=\"{0}\" AND artist:\"{1}\"", var url = string.Format("https://www.musicbrainz.org/ws/2/release/?query=\"{0}\" AND artist:\"{1}\"",
WebUtility.UrlEncode(albumName), WebUtility.UrlEncode(albumName),
WebUtility.UrlEncode(artistName)); WebUtility.UrlEncode(artistName));
@ -220,7 +220,7 @@ namespace MediaBrowser.Providers.Music
private ReleaseResult GetReleaseResult(XmlDocument doc) private ReleaseResult GetReleaseResult(XmlDocument doc)
{ {
var ns = new XmlNamespaceManager(doc.NameTable); var ns = new XmlNamespaceManager(doc.NameTable);
ns.AddNamespace("mb", "http://musicbrainz.org/ns/mmd-2.0#"); ns.AddNamespace("mb", "https://musicbrainz.org/ns/mmd-2.0#");
var result = new ReleaseResult var result = new ReleaseResult
{ {
@ -258,12 +258,12 @@ namespace MediaBrowser.Providers.Music
/// <returns>Task{System.String}.</returns> /// <returns>Task{System.String}.</returns>
private async Task<string> GetReleaseGroupId(string releaseEntryId, CancellationToken cancellationToken) private async Task<string> GetReleaseGroupId(string releaseEntryId, CancellationToken cancellationToken)
{ {
var url = string.Format("http://www.musicbrainz.org/ws/2/release-group/?query=reid:{0}", releaseEntryId); var url = string.Format("https://www.musicbrainz.org/ws/2/release-group/?query=reid:{0}", releaseEntryId);
var doc = await GetMusicBrainzResponse(url, false, cancellationToken).ConfigureAwait(false); var doc = await GetMusicBrainzResponse(url, false, cancellationToken).ConfigureAwait(false);
var ns = new XmlNamespaceManager(doc.NameTable); var ns = new XmlNamespaceManager(doc.NameTable);
ns.AddNamespace("mb", "http://musicbrainz.org/ns/mmd-2.0#"); ns.AddNamespace("mb", "https://musicbrainz.org/ns/mmd-2.0#");
var node = doc.SelectSingleNode("//mb:release-group-list/mb:release-group/@id", ns); var node = doc.SelectSingleNode("//mb:release-group-list/mb:release-group/@id", ns);
return node != null ? node.Value : null; return node != null ? node.Value : null;

View File

@ -23,7 +23,7 @@ namespace MediaBrowser.Providers.Music
if (!string.IsNullOrWhiteSpace(musicBrainzId)) if (!string.IsNullOrWhiteSpace(musicBrainzId))
{ {
var url = string.Format("http://www.musicbrainz.org/ws/2/artist/?query=arid:{0}", musicBrainzId); var url = string.Format("https://www.musicbrainz.org/ws/2/artist/?query=arid:{0}", musicBrainzId);
var doc = await MusicBrainzAlbumProvider.Current.GetMusicBrainzResponse(url, false, cancellationToken) var doc = await MusicBrainzAlbumProvider.Current.GetMusicBrainzResponse(url, false, cancellationToken)
.ConfigureAwait(false); .ConfigureAwait(false);
@ -35,7 +35,7 @@ namespace MediaBrowser.Providers.Music
// They seem to throw bad request failures on any term with a slash // They seem to throw bad request failures on any term with a slash
var nameToSearch = searchInfo.Name.Replace('/', ' '); var nameToSearch = searchInfo.Name.Replace('/', ' ');
var url = String.Format("http://www.musicbrainz.org/ws/2/artist/?query=artist:\"{0}\"", UrlEncode(nameToSearch)); var url = String.Format("https://www.musicbrainz.org/ws/2/artist/?query=artist:\"{0}\"", UrlEncode(nameToSearch));
var doc = await MusicBrainzAlbumProvider.Current.GetMusicBrainzResponse(url, true, cancellationToken).ConfigureAwait(false); var doc = await MusicBrainzAlbumProvider.Current.GetMusicBrainzResponse(url, true, cancellationToken).ConfigureAwait(false);
@ -49,7 +49,7 @@ namespace MediaBrowser.Providers.Music
if (HasDiacritics(searchInfo.Name)) if (HasDiacritics(searchInfo.Name))
{ {
// Try again using the search with accent characters url // Try again using the search with accent characters url
url = String.Format("http://www.musicbrainz.org/ws/2/artist/?query=artistaccent:\"{0}\"", UrlEncode(nameToSearch)); url = String.Format("https://www.musicbrainz.org/ws/2/artist/?query=artistaccent:\"{0}\"", UrlEncode(nameToSearch));
doc = await MusicBrainzAlbumProvider.Current.GetMusicBrainzResponse(url, true, cancellationToken).ConfigureAwait(false); doc = await MusicBrainzAlbumProvider.Current.GetMusicBrainzResponse(url, true, cancellationToken).ConfigureAwait(false);
@ -63,7 +63,7 @@ namespace MediaBrowser.Providers.Music
private IEnumerable<RemoteSearchResult> GetResultsFromResponse(XmlDocument doc) private IEnumerable<RemoteSearchResult> GetResultsFromResponse(XmlDocument doc)
{ {
var ns = new XmlNamespaceManager(doc.NameTable); var ns = new XmlNamespaceManager(doc.NameTable);
ns.AddNamespace("mb", "http://musicbrainz.org/ns/mmd-2.0#"); ns.AddNamespace("mb", "https://musicbrainz.org/ns/mmd-2.0#");
var list = new List<RemoteSearchResult>(); var list = new List<RemoteSearchResult>();

View File

@ -18,7 +18,7 @@ namespace MediaBrowser.Providers.Music
public string UrlFormatString public string UrlFormatString
{ {
get { return "http://musicbrainz.org/release-group/{0}"; } get { return "https://musicbrainz.org/release-group/{0}"; }
} }
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)
@ -41,7 +41,7 @@ namespace MediaBrowser.Providers.Music
public string UrlFormatString public string UrlFormatString
{ {
get { return "http://musicbrainz.org/artist/{0}"; } get { return "https://musicbrainz.org/artist/{0}"; }
} }
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)
@ -64,7 +64,7 @@ namespace MediaBrowser.Providers.Music
public string UrlFormatString public string UrlFormatString
{ {
get { return "http://musicbrainz.org/release/{0}"; } get { return "https://musicbrainz.org/release/{0}"; }
} }
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)
@ -87,7 +87,7 @@ namespace MediaBrowser.Providers.Music
public string UrlFormatString public string UrlFormatString
{ {
get { return "http://musicbrainz.org/artist/{0}"; } get { return "https://musicbrainz.org/artist/{0}"; }
} }
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)
@ -110,7 +110,7 @@ namespace MediaBrowser.Providers.Music
public string UrlFormatString public string UrlFormatString
{ {
get { return "http://musicbrainz.org/artist/{0}"; } get { return "https://musicbrainz.org/artist/{0}"; }
} }
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)
@ -133,7 +133,7 @@ namespace MediaBrowser.Providers.Music
public string UrlFormatString public string UrlFormatString
{ {
get { return "http://musicbrainz.org/track/{0}"; } get { return "https://musicbrainz.org/track/{0}"; }
} }
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)

View File

@ -40,7 +40,7 @@ namespace MediaBrowser.Providers.Omdb
list.Add(new RemoteImageInfo list.Add(new RemoteImageInfo
{ {
ProviderName = Name, ProviderName = Name,
Url = string.Format("http://img.omdbapi.com/?i={0}&apikey=82e83907", imdbId) Url = string.Format("https://img.omdbapi.com/?i={0}&apikey=82e83907", imdbId)
}); });
} }

View File

@ -64,11 +64,9 @@ namespace MediaBrowser.Providers.Omdb
{ {
var episodeSearchInfo = searchInfo as EpisodeInfo; var episodeSearchInfo = searchInfo as EpisodeInfo;
var list = new List<RemoteSearchResult>();
var imdbId = searchInfo.GetProviderId(MetadataProviders.Imdb); var imdbId = searchInfo.GetProviderId(MetadataProviders.Imdb);
var url = "http://www.omdbapi.com/?plot=full&r=json"; var url = "https://www.omdbapi.com/?plot=full&r=json";
if (type == "episode" && episodeSearchInfo != null) if (type == "episode" && episodeSearchInfo != null)
{ {
episodeSearchInfo.SeriesProviderIds.TryGetValue(MetadataProviders.Imdb.ToString(), out imdbId); episodeSearchInfo.SeriesProviderIds.TryGetValue(MetadataProviders.Imdb.ToString(), out imdbId);
@ -148,14 +146,13 @@ namespace MediaBrowser.Providers.Omdb
} }
} }
foreach (var result in resultList) return resultList.Select(result =>
{ {
var item = new RemoteSearchResult var item = new RemoteSearchResult
{ {
IndexNumber = searchInfo.IndexNumber, IndexNumber = searchInfo.IndexNumber,
Name = result.Title, Name = result.Title,
ParentIndexNumber = searchInfo.ParentIndexNumber, ParentIndexNumber = searchInfo.ParentIndexNumber,
ProviderIds = searchInfo.ProviderIds,
SearchProviderName = Name SearchProviderName = Name
}; };
@ -185,11 +182,9 @@ namespace MediaBrowser.Providers.Omdb
item.ImageUrl = result.Poster; item.ImageUrl = result.Poster;
} }
list.Add(item); return item;
} });
} }
return list;
} }
public Task<MetadataResult<Trailer>> GetMetadata(TrailerInfo info, CancellationToken cancellationToken) public Task<MetadataResult<Trailer>> GetMetadata(TrailerInfo info, CancellationToken cancellationToken)

View File

@ -37,7 +37,7 @@ namespace MediaBrowser.Providers.Omdb
var imdbParam = imdbId.StartsWith("tt", StringComparison.OrdinalIgnoreCase) ? imdbId : "tt" + imdbId; var imdbParam = imdbId.StartsWith("tt", StringComparison.OrdinalIgnoreCase) ? imdbId : "tt" + imdbId;
var url = string.Format("http://www.omdbapi.com/?i={0}&tomatoes=true", imdbParam); var url = string.Format("https://www.omdbapi.com/?i={0}&tomatoes=true", imdbParam);
using (var stream = await _httpClient.Get(new HttpRequestOptions using (var stream = await _httpClient.Get(new HttpRequestOptions
{ {

View File

@ -97,7 +97,7 @@ namespace MediaBrowser.Providers.People
var requestCount = _requestCount; var requestCount = _requestCount;
if (requestCount >= 30) if (requestCount >= 40)
{ {
//_logger.Debug("Throttling Tmdb people"); //_logger.Debug("Throttling Tmdb people");
@ -109,7 +109,7 @@ namespace MediaBrowser.Providers.People
} }
} }
var url = string.Format(@"http://api.themoviedb.org/3/search/person?api_key={1}&query={0}", WebUtility.UrlEncode(searchInfo.Name), MovieDbProvider.ApiKey); var url = string.Format(@"https://api.themoviedb.org/3/search/person?api_key={1}&query={0}", WebUtility.UrlEncode(searchInfo.Name), MovieDbProvider.ApiKey);
using (var json = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions using (var json = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions
{ {
@ -234,7 +234,7 @@ namespace MediaBrowser.Providers.People
return; return;
} }
var url = string.Format(@"http://api.themoviedb.org/3/person/{1}?api_key={0}&append_to_response=credits,images,external_ids", MovieDbProvider.ApiKey, id); var url = string.Format(@"https://api.themoviedb.org/3/person/{1}?api_key={0}&append_to_response=credits,images,external_ids", MovieDbProvider.ApiKey, id);
using (var json = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions using (var json = await MovieDbProvider.Current.GetMovieDbResponse(new HttpRequestOptions
{ {

View File

@ -19,7 +19,7 @@ namespace MediaBrowser.Providers.TV
{ {
class FanArtTvUpdatesPostScanTask : ILibraryPostScanTask class FanArtTvUpdatesPostScanTask : ILibraryPostScanTask
{ {
private const string UpdatesUrl = "http://webservice.fanart.tv/v3/tv/latest?api_key={0}&date={1}"; private const string UpdatesUrl = "https://webservice.fanart.tv/v3/tv/latest?api_key={0}&date={1}";
/// <summary> /// <summary>
/// The _HTTP client /// The _HTTP client

View File

@ -31,7 +31,7 @@ namespace MediaBrowser.Providers.TV
private readonly IFileSystem _fileSystem; private readonly IFileSystem _fileSystem;
private readonly IJsonSerializer _json; private readonly IJsonSerializer _json;
private const string FanArtBaseUrl = "http://webservice.fanart.tv/v3/tv/{1}?api_key={0}"; private const string FanArtBaseUrl = "https://webservice.fanart.tv/v3/tv/{1}?api_key={0}";
// &client_key=52c813aa7b8c8b3bb87f4797532a2f8c // &client_key=52c813aa7b8c8b3bb87f4797532a2f8c
internal static FanartSeriesProvider Current { get; private set; } internal static FanartSeriesProvider Current { get; private set; }

View File

@ -16,7 +16,7 @@ namespace MediaBrowser.Providers.TV
{ {
public abstract class MovieDbProviderBase public abstract class MovieDbProviderBase
{ {
private const string EpisodeUrlPattern = @"http://api.themoviedb.org/3/tv/{0}/season/{1}/episode/{2}?api_key={3}&append_to_response=images,external_ids,credits,videos"; private const string EpisodeUrlPattern = @"https://api.themoviedb.org/3/tv/{0}/season/{1}/episode/{2}?api_key={3}&append_to_response=images,external_ids,credits,videos";
private readonly IHttpClient _httpClient; private readonly IHttpClient _httpClient;
private readonly IServerConfigurationManager _configurationManager; private readonly IServerConfigurationManager _configurationManager;
private readonly IJsonSerializer _jsonSerializer; private readonly IJsonSerializer _jsonSerializer;

View File

@ -22,7 +22,7 @@ namespace MediaBrowser.Providers.TV
{ {
public class MovieDbSeasonProvider : IRemoteMetadataProvider<Season, SeasonInfo> public class MovieDbSeasonProvider : IRemoteMetadataProvider<Season, SeasonInfo>
{ {
private const string GetTvInfo3 = @"http://api.themoviedb.org/3/tv/{0}/season/{1}?api_key={2}&append_to_response=images,keywords,external_ids,credits,videos"; private const string GetTvInfo3 = @"https://api.themoviedb.org/3/tv/{0}/season/{1}?api_key={2}&append_to_response=images,keywords,external_ids,credits,videos";
private readonly IHttpClient _httpClient; private readonly IHttpClient _httpClient;
private readonly IServerConfigurationManager _configurationManager; private readonly IServerConfigurationManager _configurationManager;
private readonly IJsonSerializer _jsonSerializer; private readonly IJsonSerializer _jsonSerializer;

View File

@ -24,7 +24,7 @@ namespace MediaBrowser.Providers.TV
{ {
public class MovieDbSeriesProvider : IRemoteMetadataProvider<Series, SeriesInfo>, IHasOrder public class MovieDbSeriesProvider : IRemoteMetadataProvider<Series, SeriesInfo>, IHasOrder
{ {
private const string GetTvInfo3 = @"http://api.themoviedb.org/3/tv/{0}?api_key={1}&append_to_response=credits,images,keywords,external_ids,videos,content_ratings"; private const string GetTvInfo3 = @"https://api.themoviedb.org/3/tv/{0}?api_key={1}&append_to_response=credits,images,keywords,external_ids,videos,content_ratings";
private readonly CultureInfo _usCulture = new CultureInfo("en-US"); private readonly CultureInfo _usCulture = new CultureInfo("en-US");
internal static MovieDbSeriesProvider Current { get; private set; } internal static MovieDbSeriesProvider Current { get; private set; }
@ -438,7 +438,7 @@ namespace MediaBrowser.Providers.TV
private async Task<RemoteSearchResult> FindByExternalId(string id, string externalSource, CancellationToken cancellationToken) private async Task<RemoteSearchResult> FindByExternalId(string id, string externalSource, CancellationToken cancellationToken)
{ {
var url = string.Format("http://api.themoviedb.org/3/tv/find/{0}?api_key={1}&external_source={2}", var url = string.Format("https://api.themoviedb.org/3/tv/find/{0}?api_key={1}&external_source={2}",
id, id,
MovieDbProvider.ApiKey, MovieDbProvider.ApiKey,
externalSource); externalSource);

View File

@ -26,12 +26,12 @@ namespace MediaBrowser.Providers.TV
/// <summary> /// <summary>
/// The server time URL /// The server time URL
/// </summary> /// </summary>
private const string ServerTimeUrl = "http://thetvdb.com/api/Updates.php?type=none"; private const string ServerTimeUrl = "https://thetvdb.com/api/Updates.php?type=none";
/// <summary> /// <summary>
/// The updates URL /// The updates URL
/// </summary> /// </summary>
private const string UpdatesUrl = "http://thetvdb.com/api/Updates.php?type=all&time={0}"; private const string UpdatesUrl = "https://thetvdb.com/api/Updates.php?type=all&time={0}";
/// <summary> /// <summary>
/// The _HTTP client /// The _HTTP client

View File

@ -53,9 +53,9 @@ namespace MediaBrowser.Providers.TV
Current = this; Current = this;
} }
private const string SeriesSearchUrl = "http://www.thetvdb.com/api/GetSeries.php?seriesname={0}&language={1}"; private const string SeriesSearchUrl = "https://www.thetvdb.com/api/GetSeries.php?seriesname={0}&language={1}";
private const string SeriesGetZip = "http://www.thetvdb.com/api/{0}/series/{1}/all/{2}.zip"; private const string SeriesGetZip = "https://www.thetvdb.com/api/{0}/series/{1}/all/{2}.zip";
private const string GetSeriesByImdbId = "http://www.thetvdb.com/api/GetSeriesByRemoteID.php?imdbid={0}&language={1}"; private const string GetSeriesByImdbId = "https://www.thetvdb.com/api/GetSeriesByRemoteID.php?imdbid={0}&language={1}";
private string NormalizeLanguage(string language) private string NormalizeLanguage(string language)
{ {

View File

@ -42,7 +42,7 @@ namespace MediaBrowser.Providers.TV
public string UrlFormatString public string UrlFormatString
{ {
get { return "http://thetvdb.com/index.php?tab=series&id={0}"; } get { return "https://thetvdb.com/index.php?tab=series&id={0}"; }
} }
public bool Supports(IHasProviderIds item) public bool Supports(IHasProviderIds item)

View File

@ -68,9 +68,13 @@
<Reference Include="ServiceStack.Api.Swagger"> <Reference Include="ServiceStack.Api.Swagger">
<HintPath>..\ThirdParty\ServiceStack\ServiceStack.Api.Swagger.dll</HintPath> <HintPath>..\ThirdParty\ServiceStack\ServiceStack.Api.Swagger.dll</HintPath>
</Reference> </Reference>
<Reference Include="SocketHttpListener, Version=1.0.5908.28560, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="SimpleInjector, Version=3.1.3.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
<SpecificVersion>False</SpecificVersion> <HintPath>..\packages\SimpleInjector.3.1.3\lib\net45\SimpleInjector.dll</HintPath>
<HintPath>..\packages\SocketHttpListener.1.0.0.29\lib\net45\SocketHttpListener.dll</HintPath> <Private>True</Private>
</Reference>
<Reference Include="SocketHttpListener, Version=1.0.5955.1537, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\SocketHttpListener.1.0.0.30\lib\net45\SocketHttpListener.dll</HintPath>
<Private>True</Private>
</Reference> </Reference>
<Reference Include="System" /> <Reference Include="System" />
<Reference Include="System.Core" /> <Reference Include="System.Core" />

View File

@ -8,5 +8,6 @@
<package id="Mono.Nat" version="1.2.24.0" targetFramework="net45" /> <package id="Mono.Nat" version="1.2.24.0" targetFramework="net45" />
<package id="morelinq" version="1.4.0" targetFramework="net45" /> <package id="morelinq" version="1.4.0" targetFramework="net45" />
<package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" /> <package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" />
<package id="SocketHttpListener" version="1.0.0.29" targetFramework="net45" /> <package id="SimpleInjector" version="3.1.3" targetFramework="net45" />
<package id="SocketHttpListener" version="1.0.0.30" targetFramework="net45" />
</packages> </packages>

View File

@ -69,6 +69,11 @@ namespace MediaBrowser.Server.Mono.Native
} }
public void AllowSystemStandby()
{
}
public List<Assembly> GetAssembliesWithParts() public List<Assembly> GetAssembliesWithParts()
{ {
var list = new List<Assembly>(); var list = new List<Assembly>();
@ -217,6 +222,11 @@ namespace MediaBrowser.Server.Mono.Native
return GetInfo(Environment); return GetInfo(Environment);
} }
public void LaunchUrl(string url)
{
throw new NotImplementedException();
}
public static FFMpegInstallInfo GetInfo(NativeEnvironment environment) public static FFMpegInstallInfo GetInfo(NativeEnvironment environment)
{ {
var info = new FFMpegInstallInfo(); var info = new FFMpegInstallInfo();

View File

@ -440,7 +440,7 @@ namespace MediaBrowser.Server.Startup.Common
LibraryMonitor = new LibraryMonitor(LogManager, TaskManager, LibraryManager, ServerConfigurationManager, FileSystemManager, this); LibraryMonitor = new LibraryMonitor(LogManager, TaskManager, LibraryManager, ServerConfigurationManager, FileSystemManager, this);
RegisterSingleInstance(LibraryMonitor); RegisterSingleInstance(LibraryMonitor);
ProviderManager = new ProviderManager(HttpClient, ServerConfigurationManager, LibraryMonitor, LogManager, FileSystemManager, ApplicationPaths, () => LibraryManager); ProviderManager = new ProviderManager(HttpClient, ServerConfigurationManager, LibraryMonitor, LogManager, FileSystemManager, ApplicationPaths, () => LibraryManager, JsonSerializer);
RegisterSingleInstance(ProviderManager); RegisterSingleInstance(ProviderManager);
SeriesOrderManager = new SeriesOrderManager(); SeriesOrderManager = new SeriesOrderManager();
@ -1404,5 +1404,10 @@ namespace MediaBrowser.Server.Startup.Common
return externalDns; return externalDns;
} }
} }
public void LaunchUrl(string url)
{
NativeApp.LaunchUrl(url);
}
} }
} }

View File

@ -15,87 +15,58 @@ namespace MediaBrowser.Server.Startup.Common.Browser
/// </summary> /// </summary>
/// <param name="page">The page.</param> /// <param name="page">The page.</param>
/// <param name="appHost">The app host.</param> /// <param name="appHost">The app host.</param>
/// <param name="logger">The logger.</param> public static void OpenDashboardPage(string page, IServerApplicationHost appHost)
public static void OpenDashboardPage(string page, IServerApplicationHost appHost, ILogger logger)
{ {
var url = appHost.GetLocalApiUrl("localhost") + "/web/" + page; var url = appHost.GetLocalApiUrl("localhost") + "/web/" + page;
OpenUrl(url, logger); OpenUrl(appHost, url);
} }
/// <summary> /// <summary>
/// Opens the community. /// Opens the community.
/// </summary> /// </summary>
/// <param name="logger">The logger.</param> public static void OpenCommunity(IServerApplicationHost appHost)
public static void OpenCommunity(ILogger logger)
{ {
OpenUrl("http://emby.media/community", logger); OpenUrl(appHost, "http://emby.media/community");
} }
/// <summary> /// <summary>
/// Opens the web client. /// Opens the web client.
/// </summary> /// </summary>
/// <param name="appHost">The app host.</param> /// <param name="appHost">The app host.</param>
/// <param name="logger">The logger.</param> public static void OpenWebClient(IServerApplicationHost appHost)
public static void OpenWebClient(IServerApplicationHost appHost, ILogger logger)
{ {
OpenDashboardPage("index.html", appHost, logger); OpenDashboardPage("index.html", appHost);
} }
/// <summary> /// <summary>
/// Opens the dashboard. /// Opens the dashboard.
/// </summary> /// </summary>
/// <param name="appHost">The app host.</param> /// <param name="appHost">The app host.</param>
/// <param name="logger">The logger.</param> public static void OpenDashboard(IServerApplicationHost appHost)
public static void OpenDashboard(IServerApplicationHost appHost, ILogger logger)
{ {
OpenDashboardPage("dashboard.html", appHost, logger); OpenDashboardPage("dashboard.html", appHost);
} }
/// <summary> /// <summary>
/// Opens the URL. /// Opens the URL.
/// </summary> /// </summary>
/// <param name="url">The URL.</param> /// <param name="url">The URL.</param>
/// <param name="logger">The logger.</param> private static void OpenUrl(IServerApplicationHost appHost, string url)
private static void OpenUrl(string url, ILogger logger)
{ {
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = url
},
EnableRaisingEvents = true,
};
process.Exited += ProcessExited;
try try
{ {
process.Start(); appHost.LaunchUrl(url);
}
catch (NotImplementedException)
{
} }
catch (Exception ex) catch (Exception ex)
{ {
logger.ErrorException("Error launching url: {0}", ex, url); Console.WriteLine("Error launching url: " + url);
Console.WriteLine("Error launching url: {0}", ex.Message);
Console.WriteLine(ex.Message); Console.WriteLine(ex.Message);
//#if !__MonoCS__
// System.Windows.Forms.MessageBox.Show("There was an error launching your web browser. Please check your default browser settings.");
//#endif
} }
} }
/// <summary>
/// Processes the exited.
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
private static void ProcessExited(object sender, EventArgs e)
{
((Process)sender).Dispose();
}
} }
} }

View File

@ -27,28 +27,27 @@ namespace MediaBrowser.Server.Startup.Common.EntryPoints
_timer = new PeriodicTimer(obj => _timer = new PeriodicTimer(obj =>
{ {
var now = DateTime.UtcNow; var now = DateTime.UtcNow;
if (_sessionManager.Sessions.Any(i => (now - i.LastActivityDate).TotalMinutes < 15)) var nativeApp = ((ApplicationHost)_appHost).NativeApp;
try
{ {
KeepAlive(); if (_sessionManager.Sessions.Any(i => (now - i.LastActivityDate).TotalMinutes < 15))
{
nativeApp.PreventSystemStandby();
}
else
{
nativeApp.AllowSystemStandby();
}
}
catch (Exception ex)
{
_logger.ErrorException("Error resetting system standby timer", ex);
} }
}, null, TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(5)); }, null, TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(5));
} }
private void KeepAlive()
{
var nativeApp = ((ApplicationHost)_appHost).NativeApp;
try
{
nativeApp.PreventSystemStandby();
}
catch (Exception ex)
{
_logger.ErrorException("Error resetting system standby timer", ex);
}
}
public void Dispose() public void Dispose()
{ {
if (_timer != null) if (_timer != null)

View File

@ -46,7 +46,7 @@ namespace MediaBrowser.Server.Startup.Common.EntryPoints
/// </summary> /// </summary>
private void LaunchStartupWizard() private void LaunchStartupWizard()
{ {
BrowserLauncher.OpenDashboardPage("wizardstart.html", _appHost, _logger); BrowserLauncher.OpenDashboardPage("wizardstart.html", _appHost);
} }
/// <summary> /// <summary>

View File

@ -93,6 +93,8 @@ namespace MediaBrowser.Server.Startup.Common
/// </summary> /// </summary>
void PreventSystemStandby(); void PreventSystemStandby();
void AllowSystemStandby();
/// <summary> /// <summary>
/// Gets the power management. /// Gets the power management.
/// </summary> /// </summary>
@ -100,5 +102,7 @@ namespace MediaBrowser.Server.Startup.Common
IPowerManagement GetPowerManagement(); IPowerManagement GetPowerManagement();
FFMpegInstallInfo GetFfmpegInstallInfo(); FFMpegInstallInfo GetFfmpegInstallInfo();
void LaunchUrl(string url);
} }
} }

View File

@ -317,10 +317,15 @@ namespace MediaBrowser.ServerApplication
{ {
if (e.Reason == SessionSwitchReason.SessionLogon) if (e.Reason == SessionSwitchReason.SessionLogon)
{ {
BrowserLauncher.OpenDashboard(_appHost, _logger); BrowserLauncher.OpenDashboard(_appHost);
} }
} }
public static void Invoke(Action action)
{
_serverNotifyIcon.Invoke(action);
}
/// <summary> /// <summary>
/// Starts the service. /// Starts the service.
/// </summary> /// </summary>

View File

@ -1,4 +1,5 @@
using System.Runtime.InteropServices; using System;
using System.Runtime.InteropServices;
namespace MediaBrowser.ServerApplication.Native namespace MediaBrowser.ServerApplication.Native
{ {
@ -7,11 +8,33 @@ namespace MediaBrowser.ServerApplication.Native
/// </summary> /// </summary>
public static class Standby public static class Standby
{ {
public static void PreventSystemStandby() public static void PreventSleepAndMonitorOff()
{ {
SystemHelper.ResetStandbyTimer(); NativeMethods.SetThreadExecutionState(NativeMethods.ES_CONTINUOUS | NativeMethods.ES_SYSTEM_REQUIRED | NativeMethods.ES_DISPLAY_REQUIRED);
} }
public static void PreventSleep()
{
NativeMethods.SetThreadExecutionState(NativeMethods.ES_CONTINUOUS | NativeMethods.ES_SYSTEM_REQUIRED);
}
// Clear EXECUTION_STATE flags to allow the system to sleep and turn off monitor normally
public static void AllowSleep()
{
NativeMethods.SetThreadExecutionState(NativeMethods.ES_CONTINUOUS);
}
internal static class NativeMethods
{
// Import SetThreadExecutionState Win32 API and necessary flags
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
public static extern uint SetThreadExecutionState(uint esFlags);
public const uint ES_CONTINUOUS = 0x80000000;
public const uint ES_SYSTEM_REQUIRED = 0x00000001;
public const uint ES_DISPLAY_REQUIRED = 0x00000002;
}
[Flags]
internal enum EXECUTION_STATE : uint internal enum EXECUTION_STATE : uint
{ {
ES_NONE = 0, ES_NONE = 0,
@ -21,16 +44,5 @@ namespace MediaBrowser.ServerApplication.Native
ES_AWAYMODE_REQUIRED = 0x00000040, ES_AWAYMODE_REQUIRED = 0x00000040,
ES_CONTINUOUS = 0x80000000 ES_CONTINUOUS = 0x80000000
} }
public class SystemHelper
{
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
static extern EXECUTION_STATE SetThreadExecutionState(EXECUTION_STATE esFlags);
public static void ResetStandbyTimer()
{
EXECUTION_STATE es = SetThreadExecutionState(EXECUTION_STATE.ES_SYSTEM_REQUIRED);
}
}
} }
} }

View File

@ -1,13 +1,17 @@
using MediaBrowser.Common.Net; using System;
using MediaBrowser.Common.Net;
using MediaBrowser.Model.Logging; using MediaBrowser.Model.Logging;
using MediaBrowser.Server.Startup.Common; using MediaBrowser.Server.Startup.Common;
using MediaBrowser.ServerApplication.Networking; using MediaBrowser.ServerApplication.Networking;
using System.Collections.Generic; using System.Collections.Generic;
using System.Diagnostics;
using System.IO; using System.IO;
using System.Reflection; using System.Reflection;
using System.Windows.Forms;
using CommonIO; using CommonIO;
using MediaBrowser.Controller.Power; using MediaBrowser.Controller.Power;
using MediaBrowser.Server.Startup.Common.FFMpeg; using MediaBrowser.Server.Startup.Common.FFMpeg;
using OperatingSystem = MediaBrowser.Server.Startup.Common.OperatingSystem;
namespace MediaBrowser.ServerApplication.Native namespace MediaBrowser.ServerApplication.Native
{ {
@ -134,7 +138,12 @@ namespace MediaBrowser.ServerApplication.Native
public void PreventSystemStandby() public void PreventSystemStandby()
{ {
Standby.PreventSystemStandby(); MainStartup.Invoke(Standby.PreventSleep);
}
public void AllowSystemStandby()
{
MainStartup.Invoke(Standby.AllowSleep);
} }
public IPowerManagement GetPowerManagement() public IPowerManagement GetPowerManagement()
@ -156,6 +165,42 @@ namespace MediaBrowser.ServerApplication.Native
return info; return info;
} }
public void LaunchUrl(string url)
{
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = url
},
EnableRaisingEvents = true,
};
process.Exited += ProcessExited;
try
{
process.Start();
}
catch (Exception ex)
{
_logger.ErrorException("Error launching url: {0}", ex, url);
throw;
}
}
/// <summary>
/// Processes the exited.
/// </summary>
/// <param name="sender">The sender.</param>
/// <param name="e">The <see cref="EventArgs" /> instance containing the event data.</param>
private static void ProcessExited(object sender, EventArgs e)
{
((Process)sender).Dispose();
}
private string[] GetDownloadUrls() private string[] GetDownloadUrls()
{ {
switch (Environment.SystemArchitecture) switch (Environment.SystemArchitecture)

View File

@ -36,10 +36,15 @@ namespace MediaBrowser.ServerApplication
set set
{ {
Action act = () => notifyIcon1.Visible = false; Action act = () => notifyIcon1.Visible = false;
contextMenuStrip1.Invoke(act); Invoke(act);
} }
} }
public void Invoke(Action action)
{
contextMenuStrip1.Invoke(action);
}
public ServerNotifyIcon(ILogManager logManager, public ServerNotifyIcon(ILogManager logManager,
IServerApplicationHost appHost, IServerApplicationHost appHost,
IServerConfigurationManager configurationManager, IServerConfigurationManager configurationManager,
@ -163,7 +168,7 @@ namespace MediaBrowser.ServerApplication
void notifyIcon1_DoubleClick(object sender, EventArgs e) void notifyIcon1_DoubleClick(object sender, EventArgs e)
{ {
BrowserLauncher.OpenDashboard(_appHost, _logger); BrowserLauncher.OpenDashboard(_appHost);
} }
private void LocalizeText() private void LocalizeText()
@ -194,17 +199,17 @@ namespace MediaBrowser.ServerApplication
void cmdBrowse_Click(object sender, EventArgs e) void cmdBrowse_Click(object sender, EventArgs e)
{ {
BrowserLauncher.OpenWebClient(_appHost, _logger); BrowserLauncher.OpenWebClient(_appHost);
} }
void cmdCommunity_Click(object sender, EventArgs e) void cmdCommunity_Click(object sender, EventArgs e)
{ {
BrowserLauncher.OpenCommunity(_logger); BrowserLauncher.OpenCommunity(_appHost);
} }
void cmdConfigure_Click(object sender, EventArgs e) void cmdConfigure_Click(object sender, EventArgs e)
{ {
BrowserLauncher.OpenDashboard(_appHost, _logger); BrowserLauncher.OpenDashboard(_appHost);
} }
void cmdRestart_Click(object sender, EventArgs e) void cmdRestart_Click(object sender, EventArgs e)

View File

@ -128,6 +128,12 @@
<Content Include="dashboard-ui\components\guestinviter\guestinviter.template.html"> <Content Include="dashboard-ui\components\guestinviter\guestinviter.template.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
<Content Include="dashboard-ui\components\ironcardlist\ironcardlist.template.html">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\components\ironcardlist\ironcardlist.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\components\metadataeditor\metadataeditor.js"> <Content Include="dashboard-ui\components\metadataeditor\metadataeditor.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
@ -146,6 +152,9 @@
<Content Include="dashboard-ui\components\remotecontrolautoplay.js"> <Content Include="dashboard-ui\components\remotecontrolautoplay.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
<Content Include="dashboard-ui\components\scrollthreshold.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
<Content Include="dashboard-ui\components\servertestermessage.js"> <Content Include="dashboard-ui\components\servertestermessage.js">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>

View File

@ -13,8 +13,8 @@
<copyright>Copyright © Emby 2013</copyright> <copyright>Copyright © Emby 2013</copyright>
<dependencies> <dependencies>
<dependency id="MediaBrowser.Common" version="3.0.645" /> <dependency id="MediaBrowser.Common" version="3.0.645" />
<dependency id="NLog" version="4.2.3" /> <dependency id="NLog" version="4.3.1" />
<dependency id="SimpleInjector" version="3.1.2" /> <dependency id="SimpleInjector" version="3.1.3" />
</dependencies> </dependencies>
</metadata> </metadata>
<files> <files>

View File

@ -32,7 +32,7 @@ namespace OpenSubtitlesHandler
/// </summary> /// </summary>
public sealed class Utilities public sealed class Utilities
{ {
private const string XML_RPC_SERVER = "http://api.opensubtitles.org/xml-rpc"; private const string XML_RPC_SERVER = "https://api.opensubtitles.org/xml-rpc";
/// <summary> /// <summary>
/// Compute movie hash /// Compute movie hash
@ -195,7 +195,7 @@ namespace OpenSubtitlesHandler
RequestContentBytes = request, RequestContentBytes = request,
RequestContentType = "text/xml", RequestContentType = "text/xml",
UserAgent = userAgent, UserAgent = userAgent,
Host = "api.opensubtitles.org:80", Host = "api.opensubtitles.org:443",
Url = XML_RPC_SERVER, Url = XML_RPC_SERVER,
// Response parsing will fail with this enabled // Response parsing will fail with this enabled