aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Emby.Dlna/ContentDirectory/ControlHandler.cs2
-rw-r--r--Emby.Dlna/Didl/DidlBuilder.cs149
-rw-r--r--Emby.Dlna/PlayTo/Device.cs169
-rw-r--r--Emby.Dlna/PlayTo/PlayToController.cs32
-rw-r--r--Emby.Drawing/ImageProcessor.cs10
-rw-r--r--Emby.Photos/PhotoProvider.cs2
-rw-r--r--Emby.Server.Implementations/Dto/DtoService.cs2
-rw-r--r--MediaBrowser.Api/Images/ImageService.cs2
-rw-r--r--MediaBrowser.Controller/Drawing/IImageProcessor.cs23
-rw-r--r--MediaBrowser.Model/Drawing/ImageDimensions.cs (renamed from MediaBrowser.Model/Drawing/ImageSize.cs)2
-rw-r--r--README.md3
11 files changed, 196 insertions, 200 deletions
diff --git a/Emby.Dlna/ContentDirectory/ControlHandler.cs b/Emby.Dlna/ContentDirectory/ControlHandler.cs
index bed4d885c..1150afdba 100644
--- a/Emby.Dlna/ContentDirectory/ControlHandler.cs
+++ b/Emby.Dlna/ContentDirectory/ControlHandler.cs
@@ -63,7 +63,7 @@ namespace Emby.Dlna.ContentDirectory
_profile = profile;
_config = config;
- _didlBuilder = new DidlBuilder(profile, user, imageProcessor, serverAddress, accessToken, userDataManager, localization, mediaSourceManager, _logger, libraryManager, mediaEncoder);
+ _didlBuilder = new DidlBuilder(profile, user, imageProcessor, serverAddress, accessToken, userDataManager, localization, mediaSourceManager, _logger, mediaEncoder);
}
protected override IEnumerable<KeyValuePair<string, string>> GetResult(string methodName, IDictionary<string, string> methodParams)
diff --git a/Emby.Dlna/Didl/DidlBuilder.cs b/Emby.Dlna/Didl/DidlBuilder.cs
index f6d923a1f..605f4f37b 100644
--- a/Emby.Dlna/Didl/DidlBuilder.cs
+++ b/Emby.Dlna/Didl/DidlBuilder.cs
@@ -43,22 +43,30 @@ namespace Emby.Dlna.Didl
private readonly ILocalizationManager _localization;
private readonly IMediaSourceManager _mediaSourceManager;
private readonly ILogger _logger;
- private readonly ILibraryManager _libraryManager;
private readonly IMediaEncoder _mediaEncoder;
- public DidlBuilder(DeviceProfile profile, User user, IImageProcessor imageProcessor, string serverAddress, string accessToken, IUserDataManager userDataManager, ILocalizationManager localization, IMediaSourceManager mediaSourceManager, ILogger logger, ILibraryManager libraryManager, IMediaEncoder mediaEncoder)
+ public DidlBuilder(
+ DeviceProfile profile,
+ User user,
+ IImageProcessor imageProcessor,
+ string serverAddress,
+ string accessToken,
+ IUserDataManager userDataManager,
+ ILocalizationManager localization,
+ IMediaSourceManager mediaSourceManager,
+ ILogger logger,
+ IMediaEncoder mediaEncoder)
{
_profile = profile;
+ _user = user;
_imageProcessor = imageProcessor;
_serverAddress = serverAddress;
+ _accessToken = accessToken;
_userDataManager = userDataManager;
_localization = localization;
_mediaSourceManager = mediaSourceManager;
_logger = logger;
- _libraryManager = libraryManager;
_mediaEncoder = mediaEncoder;
- _accessToken = accessToken;
- _user = user;
}
public static string NormalizeDlnaMediaUrl(string url)
@@ -117,7 +125,8 @@ namespace Emby.Dlna.Didl
}
}
- public void WriteItemElement(DlnaOptions options,
+ public void WriteItemElement(
+ DlnaOptions options,
XmlWriter writer,
BaseItem item,
User user,
@@ -232,12 +241,15 @@ namespace Emby.Dlna.Didl
AddVideoResource(writer, video, deviceId, filter, contentFeature, streamInfo);
}
- var subtitleProfiles = streamInfo.GetSubtitleProfiles(_mediaEncoder, false, _serverAddress, _accessToken)
- .Where(subtitle => subtitle.DeliveryMethod == SubtitleDeliveryMethod.External)
- .ToList();
+ var subtitleProfiles = streamInfo.GetSubtitleProfiles(_mediaEncoder, false, _serverAddress, _accessToken);
foreach (var subtitle in subtitleProfiles)
{
+ if (subtitle.DeliveryMethod != SubtitleDeliveryMethod.External)
+ {
+ continue;
+ }
+
var subtitleAdded = AddSubtitleElement(writer, subtitle);
if (subtitleAdded && _profile.EnableSingleSubtitleLimit)
@@ -250,7 +262,8 @@ namespace Emby.Dlna.Didl
private bool AddSubtitleElement(XmlWriter writer, SubtitleStreamInfo info)
{
var subtitleProfile = _profile.SubtitleProfiles
- .FirstOrDefault(i => string.Equals(info.Format, i.Format, StringComparison.OrdinalIgnoreCase) && i.Method == SubtitleDeliveryMethod.External);
+ .FirstOrDefault(i => string.Equals(info.Format, i.Format, StringComparison.OrdinalIgnoreCase)
+ && i.Method == SubtitleDeliveryMethod.External);
if (subtitleProfile == null)
{
@@ -387,91 +400,39 @@ namespace Emby.Dlna.Didl
private string GetDisplayName(BaseItem item, StubType? itemStubType, BaseItem context)
{
- if (itemStubType.HasValue && itemStubType.Value == StubType.Latest)
- {
- return _localization.GetLocalizedString("Latest");
- }
- if (itemStubType.HasValue && itemStubType.Value == StubType.Playlists)
+ if (itemStubType.HasValue)
{
- return _localization.GetLocalizedString("Playlists");
- }
- if (itemStubType.HasValue && itemStubType.Value == StubType.AlbumArtists)
- {
- return _localization.GetLocalizedString("HeaderAlbumArtists");
- }
- if (itemStubType.HasValue && itemStubType.Value == StubType.Albums)
- {
- return _localization.GetLocalizedString("Albums");
- }
- if (itemStubType.HasValue && itemStubType.Value == StubType.Artists)
- {
- return _localization.GetLocalizedString("Artists");
- }
- if (itemStubType.HasValue && itemStubType.Value == StubType.Songs)
- {
- return _localization.GetLocalizedString("Songs");
- }
- if (itemStubType.HasValue && itemStubType.Value == StubType.Genres)
- {
- return _localization.GetLocalizedString("Genres");
- }
- if (itemStubType.HasValue && itemStubType.Value == StubType.FavoriteAlbums)
- {
- return _localization.GetLocalizedString("HeaderFavoriteAlbums");
- }
- if (itemStubType.HasValue && itemStubType.Value == StubType.FavoriteArtists)
- {
- return _localization.GetLocalizedString("HeaderFavoriteArtists");
- }
- if (itemStubType.HasValue && itemStubType.Value == StubType.FavoriteSongs)
- {
- return _localization.GetLocalizedString("HeaderFavoriteSongs");
- }
- if (itemStubType.HasValue && itemStubType.Value == StubType.ContinueWatching)
- {
- return _localization.GetLocalizedString("HeaderContinueWatching");
- }
- if (itemStubType.HasValue && itemStubType.Value == StubType.Movies)
- {
- return _localization.GetLocalizedString("Movies");
- }
- if (itemStubType.HasValue && itemStubType.Value == StubType.Collections)
- {
- return _localization.GetLocalizedString("Collections");
- }
- if (itemStubType.HasValue && itemStubType.Value == StubType.Favorites)
- {
- return _localization.GetLocalizedString("Favorites");
- }
- if (itemStubType.HasValue && itemStubType.Value == StubType.NextUp)
- {
- return _localization.GetLocalizedString("HeaderNextUp");
- }
- if (itemStubType.HasValue && itemStubType.Value == StubType.FavoriteSeries)
- {
- return _localization.GetLocalizedString("HeaderFavoriteShows");
- }
- if (itemStubType.HasValue && itemStubType.Value == StubType.FavoriteEpisodes)
- {
- return _localization.GetLocalizedString("HeaderFavoriteEpisodes");
- }
- if (itemStubType.HasValue && itemStubType.Value == StubType.Series)
- {
- return _localization.GetLocalizedString("Shows");
+ switch (itemStubType.Value)
+ {
+ case StubType.Latest: return _localization.GetLocalizedString("Latest");
+ case StubType.Playlists: return _localization.GetLocalizedString("Playlists");
+ case StubType.AlbumArtists: return _localization.GetLocalizedString("HeaderAlbumArtists");
+ case StubType.Albums: return _localization.GetLocalizedString("Albums");
+ case StubType.Artists: return _localization.GetLocalizedString("Artists");
+ case StubType.Songs: return _localization.GetLocalizedString("Songs");
+ case StubType.Genres: return _localization.GetLocalizedString("Genres");
+ case StubType.FavoriteAlbums: return _localization.GetLocalizedString("HeaderFavoriteAlbums");
+ case StubType.FavoriteArtists: return _localization.GetLocalizedString("HeaderFavoriteArtists");
+ case StubType.FavoriteSongs: return _localization.GetLocalizedString("HeaderFavoriteSongs");
+ case StubType.ContinueWatching: return _localization.GetLocalizedString("HeaderContinueWatching");
+ case StubType.Movies: return _localization.GetLocalizedString("Movies");
+ case StubType.Collections: return _localization.GetLocalizedString("Collections");
+ case StubType.Favorites: return _localization.GetLocalizedString("Favorites");
+ case StubType.NextUp: return _localization.GetLocalizedString("HeaderNextUp");
+ case StubType.FavoriteSeries: return _localization.GetLocalizedString("HeaderFavoriteShows");
+ case StubType.FavoriteEpisodes: return _localization.GetLocalizedString("HeaderFavoriteEpisodes");
+ case StubType.Series: return _localization.GetLocalizedString("Shows");
+ default: break;
+ }
}
- var episode = item as Episode;
- var season = context as Season;
-
- if (episode != null && season != null)
+ if (item is Episode episode && context is Season season)
{
// This is a special embedded within a season
- if (item.ParentIndexNumber.HasValue && item.ParentIndexNumber.Value == 0)
+ if (item.ParentIndexNumber.HasValue && item.ParentIndexNumber.Value == 0
+ && season.IndexNumber.HasValue && season.IndexNumber.Value != 0)
{
- if (season.IndexNumber.HasValue && season.IndexNumber.Value != 0)
- {
- return string.Format(_localization.GetLocalizedString("ValueSpecialEpisodeName"), item.Name);
- }
+ return string.Format(_localization.GetLocalizedString("ValueSpecialEpisodeName"), item.Name);
}
if (item.IndexNumber.HasValue)
@@ -585,10 +546,8 @@ namespace Emby.Dlna.Didl
public static bool IsIdRoot(string id)
{
- if (string.IsNullOrWhiteSpace(id) ||
-
- string.Equals(id, "0", StringComparison.OrdinalIgnoreCase)
-
+ if (string.IsNullOrWhiteSpace(id)
+ || string.Equals(id, "0", StringComparison.OrdinalIgnoreCase)
// Samsung sometimes uses 1 as root
|| string.Equals(id, "1", StringComparison.OrdinalIgnoreCase))
{
@@ -1112,7 +1071,7 @@ namespace Emby.Dlna.Didl
};
}
- class ImageDownloadInfo
+ private class ImageDownloadInfo
{
internal Guid ItemId;
internal string ImageTag;
@@ -1128,7 +1087,7 @@ namespace Emby.Dlna.Didl
internal ItemImageInfo ItemImageInfo;
}
- class ImageUrlInfo
+ private class ImageUrlInfo
{
internal string Url;
diff --git a/Emby.Dlna/PlayTo/Device.cs b/Emby.Dlna/PlayTo/Device.cs
index e49168d34..037cdd8aa 100644
--- a/Emby.Dlna/PlayTo/Device.cs
+++ b/Emby.Dlna/PlayTo/Device.cs
@@ -39,12 +39,7 @@ namespace Emby.Dlna.PlayTo
public TimeSpan? Duration { get; set; }
- private TimeSpan _position = TimeSpan.FromSeconds(0);
- public TimeSpan Position
- {
- get => _position;
- set => _position = value;
- }
+ public TimeSpan Position { get; set; } = TimeSpan.FromSeconds(0);
public TRANSPORTSTATE TransportState { get; private set; }
@@ -60,7 +55,6 @@ namespace Emby.Dlna.PlayTo
private readonly ILogger _logger;
private readonly IServerConfigurationManager _config;
- public DateTime DateLastActivity { get; private set; }
public Action OnDeviceUnavailable { get; set; }
public Device(DeviceInfo deviceProperties, IHttpClient httpClient, ILogger logger, IServerConfigurationManager config)
@@ -115,7 +109,9 @@ namespace Emby.Dlna.PlayTo
lock (_timerLock)
{
if (_disposed)
+ {
return;
+ }
_volumeRefreshActive = true;
@@ -132,7 +128,9 @@ namespace Emby.Dlna.PlayTo
lock (_timerLock)
{
if (_disposed)
+ {
return;
+ }
_volumeRefreshActive = false;
@@ -140,11 +138,6 @@ namespace Emby.Dlna.PlayTo
}
}
- public void OnPlaybackStartedExternally()
- {
- RestartTimer(true);
- }
-
#region Commanding
public Task VolumeDown(CancellationToken cancellationToken)
@@ -329,7 +322,9 @@ namespace Emby.Dlna.PlayTo
private string CreateDidlMeta(string value)
{
if (string.IsNullOrEmpty(value))
+ {
return string.Empty;
+ }
return DescriptionXmlBuilder.Escape(value);
}
@@ -338,10 +333,11 @@ namespace Emby.Dlna.PlayTo
{
var command = avCommands.ServiceActions.FirstOrDefault(c => c.Name == "Play");
if (command == null)
+ {
return Task.CompletedTask;
+ }
var service = GetAvTransportService();
-
if (service == null)
{
throw new InvalidOperationException("Unable to find service");
@@ -365,7 +361,9 @@ namespace Emby.Dlna.PlayTo
var command = avCommands.ServiceActions.FirstOrDefault(c => c.Name == "Stop");
if (command == null)
+ {
return;
+ }
var service = GetAvTransportService();
@@ -381,7 +379,9 @@ namespace Emby.Dlna.PlayTo
var command = avCommands.ServiceActions.FirstOrDefault(c => c.Name == "Pause");
if (command == null)
+ {
return;
+ }
var service = GetAvTransportService();
@@ -401,7 +401,9 @@ namespace Emby.Dlna.PlayTo
private async void TimerCallback(object sender)
{
if (_disposed)
+ {
return;
+ }
try
{
@@ -421,8 +423,6 @@ namespace Emby.Dlna.PlayTo
return;
}
- DateLastActivity = DateTime.UtcNow;
-
if (transportState.HasValue)
{
// If we're not playing anything no need to get additional data
@@ -501,7 +501,9 @@ namespace Emby.Dlna.PlayTo
var command = rendererCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetVolume");
if (command == null)
+ {
return;
+ }
var service = GetServiceRenderingControl();
@@ -514,13 +516,17 @@ namespace Emby.Dlna.PlayTo
.ConfigureAwait(false);
if (result == null || result.Document == null)
+ {
return;
+ }
var volume = result.Document.Descendants(uPnpNamespaces.RenderingControl + "GetVolumeResponse").Select(i => i.Element("CurrentVolume")).FirstOrDefault(i => i != null);
- var volumeValue = volume == null ? null : volume.Value;
+ var volumeValue = volume?.Value;
if (string.IsNullOrWhiteSpace(volumeValue))
+ {
return;
+ }
Volume = int.Parse(volumeValue, UsCulture);
@@ -541,7 +547,9 @@ namespace Emby.Dlna.PlayTo
var command = rendererCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetMute");
if (command == null)
+ {
return;
+ }
var service = GetServiceRenderingControl();
@@ -556,39 +564,44 @@ namespace Emby.Dlna.PlayTo
if (result == null || result.Document == null)
return;
- var valueNode = result.Document.Descendants(uPnpNamespaces.RenderingControl + "GetMuteResponse").Select(i => i.Element("CurrentMute")).FirstOrDefault(i => i != null);
- var value = valueNode == null ? null : valueNode.Value;
+ var valueNode = result.Document.Descendants(uPnpNamespaces.RenderingControl + "GetMuteResponse")
+ .Select(i => i.Element("CurrentMute"))
+ .FirstOrDefault(i => i != null);
- IsMuted = string.Equals(value, "1", StringComparison.OrdinalIgnoreCase);
+ IsMuted = string.Equals(valueNode?.Value, "1", StringComparison.OrdinalIgnoreCase);
}
private async Task<TRANSPORTSTATE?> GetTransportInfo(TransportCommands avCommands, CancellationToken cancellationToken)
{
var command = avCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetTransportInfo");
if (command == null)
+ {
return null;
+ }
var service = GetAvTransportService();
if (service == null)
+ {
return null;
+ }
var result = await new SsdpHttpClient(_httpClient, _config).SendCommandAsync(Properties.BaseUrl, service, command.Name, avCommands.BuildPost(command, service.ServiceType), false)
.ConfigureAwait(false);
if (result == null || result.Document == null)
+ {
return null;
+ }
var transportState =
result.Document.Descendants(uPnpNamespaces.AvTransport + "GetTransportInfoResponse").Select(i => i.Element("CurrentTransportState")).FirstOrDefault(i => i != null);
var transportStateValue = transportState == null ? null : transportState.Value;
- if (transportStateValue != null)
+ if (transportStateValue != null
+ && Enum.TryParse(transportStateValue, true, out TRANSPORTSTATE state))
{
- if (Enum.TryParse(transportStateValue, true, out TRANSPORTSTATE state))
- {
- return state;
- }
+ return state;
}
return null;
@@ -598,10 +611,11 @@ namespace Emby.Dlna.PlayTo
{
var command = avCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetMediaInfo");
if (command == null)
+ {
return null;
+ }
var service = GetAvTransportService();
-
if (service == null)
{
throw new InvalidOperationException("Unable to find service");
@@ -613,7 +627,9 @@ namespace Emby.Dlna.PlayTo
.ConfigureAwait(false);
if (result == null || result.Document == null)
+ {
return null;
+ }
var track = result.Document.Descendants("CurrentURIMetaData").FirstOrDefault();
@@ -653,11 +669,13 @@ namespace Emby.Dlna.PlayTo
return null;
}
- private async Task<Tuple<bool, uBaseObject>> GetPositionInfo(TransportCommands avCommands, CancellationToken cancellationToken)
+ private async Task<(bool, uBaseObject)> GetPositionInfo(TransportCommands avCommands, CancellationToken cancellationToken)
{
var command = avCommands.ServiceActions.FirstOrDefault(c => c.Name == "GetPositionInfo");
if (command == null)
- return new Tuple<bool, uBaseObject>(false, null);
+ {
+ return (false, null);
+ }
var service = GetAvTransportService();
@@ -672,7 +690,9 @@ namespace Emby.Dlna.PlayTo
.ConfigureAwait(false);
if (result == null || result.Document == null)
- return new Tuple<bool, uBaseObject>(false, null);
+ {
+ return (false, null);
+ }
var trackUriElem = result.Document.Descendants(uPnpNamespaces.AvTransport + "GetPositionInfoResponse").Select(i => i.Element("TrackURI")).FirstOrDefault(i => i != null);
var trackUri = trackUriElem == null ? null : trackUriElem.Value;
@@ -680,8 +700,8 @@ namespace Emby.Dlna.PlayTo
var durationElem = result.Document.Descendants(uPnpNamespaces.AvTransport + "GetPositionInfoResponse").Select(i => i.Element("TrackDuration")).FirstOrDefault(i => i != null);
var duration = durationElem == null ? null : durationElem.Value;
- if (!string.IsNullOrWhiteSpace(duration) &&
- !string.Equals(duration, "NOT_IMPLEMENTED", StringComparison.OrdinalIgnoreCase))
+ if (!string.IsNullOrWhiteSpace(duration)
+ && !string.Equals(duration, "NOT_IMPLEMENTED", StringComparison.OrdinalIgnoreCase))
{
Duration = TimeSpan.Parse(duration, UsCulture);
}
@@ -703,14 +723,14 @@ namespace Emby.Dlna.PlayTo
if (track == null)
{
//If track is null, some vendors do this, use GetMediaInfo instead
- return new Tuple<bool, uBaseObject>(true, null);
+ return (true, null);
}
var trackString = (string)track;
if (string.IsNullOrWhiteSpace(trackString) || string.Equals(trackString, "NOT_IMPLEMENTED", StringComparison.OrdinalIgnoreCase))
{
- return new Tuple<bool, uBaseObject>(true, null);
+ return (true, null);
}
XElement uPnpResponse;
@@ -731,7 +751,7 @@ namespace Emby.Dlna.PlayTo
catch (Exception ex)
{
_logger.LogError(ex, "Unable to parse xml {0}", trackString);
- return new Tuple<bool, uBaseObject>(true, null);
+ return (true, null);
}
}
@@ -739,7 +759,7 @@ namespace Emby.Dlna.PlayTo
var uTrack = CreateUBaseObject(e, trackUri);
- return new Tuple<bool, uBaseObject>(true, uTrack);
+ return (true, uTrack);
}
private static uBaseObject CreateUBaseObject(XElement container, string trackUri)
@@ -797,11 +817,9 @@ namespace Emby.Dlna.PlayTo
private async Task<TransportCommands> GetAVProtocolAsync(CancellationToken cancellationToken)
{
- var avCommands = AvCommands;
-
- if (avCommands != null)
+ if (AvCommands != null)
{
- return avCommands;
+ return AvCommands;
}
if (_disposed)
@@ -821,18 +839,15 @@ namespace Emby.Dlna.PlayTo
var document = await httpClient.GetDataAsync(url, cancellationToken).ConfigureAwait(false);
- avCommands = TransportCommands.Create(document);
- AvCommands = avCommands;
- return avCommands;
+ AvCommands = TransportCommands.Create(document);
+ return AvCommands;
}
private async Task<TransportCommands> GetRenderingProtocolAsync(CancellationToken cancellationToken)
{
- var rendererCommands = RendererCommands;
-
- if (rendererCommands != null)
+ if (RendererCommands != null)
{
- return rendererCommands;
+ return RendererCommands;
}
if (_disposed)
@@ -841,7 +856,6 @@ namespace Emby.Dlna.PlayTo
}
var avService = GetServiceRenderingControl();
-
if (avService == null)
{
throw new ArgumentException("Device AvService is null");
@@ -853,9 +867,8 @@ namespace Emby.Dlna.PlayTo
_logger.LogDebug("Dlna Device.GetRenderingProtocolAsync");
var document = await httpClient.GetDataAsync(url, cancellationToken).ConfigureAwait(false);
- rendererCommands = TransportCommands.Create(document);
- RendererCommands = rendererCommands;
- return rendererCommands;
+ RendererCommands = TransportCommands.Create(document);
+ return RendererCommands;
}
private string NormalizeUrl(string baseUrl, string url)
@@ -867,24 +880,21 @@ namespace Emby.Dlna.PlayTo
}
if (!url.Contains("/"))
+ {
url = "/dmr/" + url;
+ }
+
if (!url.StartsWith("/"))
+ {
url = "/" + url;
+ }
return baseUrl + url;
}
- private TransportCommands AvCommands
- {
- get;
- set;
- }
+ private TransportCommands AvCommands { get; set; }
- private TransportCommands RendererCommands
- {
- get;
- set;
- }
+ private TransportCommands RendererCommands { get; set; }
public static async Task<Device> CreateuPnpDeviceAsync(Uri url, IHttpClient httpClient, IServerConfigurationManager config, ILogger logger, CancellationToken cancellationToken)
{
@@ -892,8 +902,6 @@ namespace Emby.Dlna.PlayTo
var document = await ssdpHttpClient.GetDataAsync(url.ToString(), cancellationToken).ConfigureAwait(false);
- var deviceProperties = new DeviceInfo();
-
var friendlyNames = new List<string>();
var name = document.Descendants(uPnpNamespaces.ud.GetName("friendlyName")).FirstOrDefault();
@@ -908,7 +916,11 @@ namespace Emby.Dlna.PlayTo
friendlyNames.Add(room.Value);
}
- deviceProperties.Name = string.Join(" ", friendlyNames);
+ var deviceProperties = new DeviceInfo()
+ {
+ Name = string.Join(" ", friendlyNames),
+ BaseUrl = string.Format("http://{0}:{1}", url.Host, url.Port)
+ };
var model = document.Descendants(uPnpNamespaces.ud.GetName("modelName")).FirstOrDefault();
if (model != null)
@@ -964,8 +976,6 @@ namespace Emby.Dlna.PlayTo
deviceProperties.ModelDescription = modelDescription.Value;
}
- deviceProperties.BaseUrl = string.Format("http://{0}:{1}", url.Host, url.Port);
-
var icon = document.Descendants(uPnpNamespaces.ud.GetName("icon")).FirstOrDefault();
if (icon != null)
{
@@ -980,7 +990,6 @@ namespace Emby.Dlna.PlayTo
}
var servicesList = services.Descendants(uPnpNamespaces.ud.GetName("service"));
-
if (servicesList == null)
{
continue;
@@ -997,9 +1006,7 @@ namespace Emby.Dlna.PlayTo
}
}
- var device = new Device(deviceProperties, httpClient, logger, config);
-
- return device;
+ return new Device(deviceProperties, httpClient, logger, config);
}
#endregion
@@ -1127,23 +1134,29 @@ namespace Emby.Dlna.PlayTo
#region IDisposable
bool _disposed;
+
public void Dispose()
{
- if (!_disposed)
- {
- _disposed = true;
-
- DisposeTimer();
- }
+ Dispose(true);
+ GC.SuppressFinalize(this);
}
- private void DisposeTimer()
+ protected virtual void Dispose(bool disposing)
{
- if (_timer != null)
+ if (_disposed)
{
- _timer.Dispose();
- _timer = null;
+ return;
}
+
+ if (disposing)
+ {
+ _timer?.Dispose();
+ }
+
+ _timer = null;
+ Properties = null;
+
+ _disposed = true;
}
#endregion
diff --git a/Emby.Dlna/PlayTo/PlayToController.cs b/Emby.Dlna/PlayTo/PlayToController.cs
index 409b8442c..be86dde16 100644
--- a/Emby.Dlna/PlayTo/PlayToController.cs
+++ b/Emby.Dlna/PlayTo/PlayToController.cs
@@ -42,30 +42,43 @@ namespace Emby.Dlna.PlayTo
private readonly IDeviceDiscovery _deviceDiscovery;
private readonly string _serverAddress;
private readonly string _accessToken;
- private readonly DateTime _creationTime;
public bool IsSessionActive => !_disposed && _device != null;
public bool SupportsMediaControl => IsSessionActive;
- public PlayToController(SessionInfo session, ISessionManager sessionManager, ILibraryManager libraryManager, ILogger logger, IDlnaManager dlnaManager, IUserManager userManager, IImageProcessor imageProcessor, string serverAddress, string accessToken, IDeviceDiscovery deviceDiscovery, IUserDataManager userDataManager, ILocalizationManager localization, IMediaSourceManager mediaSourceManager, IConfigurationManager config, IMediaEncoder mediaEncoder)
+ public PlayToController(
+ SessionInfo session,
+ ISessionManager sessionManager,
+ ILibraryManager libraryManager,
+ ILogger logger,
+ IDlnaManager dlnaManager,
+ IUserManager userManager,
+ IImageProcessor imageProcessor,
+ string serverAddress,
+ string accessToken,
+ IDeviceDiscovery deviceDiscovery,
+ IUserDataManager userDataManager,
+ ILocalizationManager localization,
+ IMediaSourceManager mediaSourceManager,
+ IConfigurationManager config,
+ IMediaEncoder mediaEncoder)
{
_session = session;
_sessionManager = sessionManager;
_libraryManager = libraryManager;
+ _logger = logger;
_dlnaManager = dlnaManager;
_userManager = userManager;
_imageProcessor = imageProcessor;
_serverAddress = serverAddress;
+ _accessToken = accessToken;
_deviceDiscovery = deviceDiscovery;
_userDataManager = userDataManager;
_localization = localization;
_mediaSourceManager = mediaSourceManager;
_config = config;
_mediaEncoder = mediaEncoder;
- _accessToken = accessToken;
- _logger = logger;
- _creationTime = DateTime.UtcNow;
}
public void Init(Device device)
@@ -374,9 +387,7 @@ namespace Emby.Dlna.PlayTo
return _device.IsPaused ? _device.SetPlay(CancellationToken.None) : _device.SetPause(CancellationToken.None);
case PlaystateCommand.Seek:
- {
- return Seek(command.SeekPositionTicks ?? 0);
- }
+ return Seek(command.SeekPositionTicks ?? 0);
case PlaystateCommand.NextTrack:
return SetPlaylistIndex(_currentPlaylistIndex + 1);
@@ -442,8 +453,7 @@ namespace Emby.Dlna.PlayTo
var profile = _dlnaManager.GetProfile(deviceInfo.ToDeviceIdentification()) ??
_dlnaManager.GetDefaultProfile();
- var hasMediaSources = item as IHasMediaSources;
- var mediaSources = hasMediaSources != null
+ var mediaSources = item is IHasMediaSources
? (_mediaSourceManager.GetStaticMediaSources(item, true, user))
: new List<MediaSourceInfo>();
@@ -452,7 +462,7 @@ namespace Emby.Dlna.PlayTo
playlistItem.StreamUrl = DidlBuilder.NormalizeDlnaMediaUrl(playlistItem.StreamInfo.ToUrl(_serverAddress, _accessToken));
- var itemXml = new DidlBuilder(profile, user, _imageProcessor, _serverAddress, _accessToken, _userDataManager, _localization, _mediaSourceManager, _logger, _libraryManager, _mediaEncoder)
+ var itemXml = new DidlBuilder(profile, user, _imageProcessor, _serverAddress, _accessToken, _userDataManager, _localization, _mediaSourceManager, _logger, _mediaEncoder)
.GetItemDidl(_config.GetDlnaConfiguration(), item, user, null, _session.DeviceId, new Filter(), playlistItem.StreamInfo);
playlistItem.Didl = itemXml;
diff --git a/Emby.Drawing/ImageProcessor.cs b/Emby.Drawing/ImageProcessor.cs
index 1e4646227..faaeb5af8 100644
--- a/Emby.Drawing/ImageProcessor.cs
+++ b/Emby.Drawing/ImageProcessor.cs
@@ -368,10 +368,10 @@ namespace Emby.Drawing
return GetCachePath(ResizedImageCachePath, filename, "." + format.ToString().ToLowerInvariant());
}
- public ImageDimensions GetImageSize(BaseItem item, ItemImageInfo info)
- => GetImageSize(item, info, true);
+ public ImageDimensions GetImageDimensions(BaseItem item, ItemImageInfo info)
+ => GetImageDimensions(item, info, true);
- public ImageDimensions GetImageSize(BaseItem item, ItemImageInfo info, bool updateItem)
+ public ImageDimensions GetImageDimensions(BaseItem item, ItemImageInfo info, bool updateItem)
{
int width = info.Width;
int height = info.Height;
@@ -384,7 +384,7 @@ namespace Emby.Drawing
string path = info.Path;
_logger.LogInformation("Getting image size for item {ItemType} {Path}", item.GetType().Name, path);
- ImageDimensions size = GetImageSize(path);
+ ImageDimensions size = GetImageDimensions(path);
info.Width = size.Width;
info.Height = size.Height;
@@ -399,7 +399,7 @@ namespace Emby.Drawing
/// <summary>
/// Gets the size of the image.
/// </summary>
- public ImageDimensions GetImageSize(string path)
+ public ImageDimensions GetImageDimensions(string path)
=> _imageEncoder.GetImageSize(path);
/// <summary>
diff --git a/Emby.Photos/PhotoProvider.cs b/Emby.Photos/PhotoProvider.cs
index aaebe1a21..f3457d105 100644
--- a/Emby.Photos/PhotoProvider.cs
+++ b/Emby.Photos/PhotoProvider.cs
@@ -181,7 +181,7 @@ namespace Emby.Photos
try
{
- var size = _imageProcessor.GetImageSize(item, img, false);
+ var size = _imageProcessor.GetImageDimensions(item, img, false);
if (size.Width > 0 && size.Height > 0)
{
diff --git a/Emby.Server.Implementations/Dto/DtoService.cs b/Emby.Server.Implementations/Dto/DtoService.cs
index f5634690f..983eb51e6 100644
--- a/Emby.Server.Implementations/Dto/DtoService.cs
+++ b/Emby.Server.Implementations/Dto/DtoService.cs
@@ -1418,7 +1418,7 @@ namespace Emby.Server.Implementations.Dto
try
{
- size = _imageProcessor.GetImageSize(item, imageInfo);
+ size = _imageProcessor.GetImageDimensions(item, imageInfo);
if (size.Width <= 0 || size.Height <= 0)
{
diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs
index b5e23476e..61db7b8d4 100644
--- a/MediaBrowser.Api/Images/ImageService.cs
+++ b/MediaBrowser.Api/Images/ImageService.cs
@@ -324,7 +324,7 @@ namespace MediaBrowser.Api.Images
var fileInfo = _fileSystem.GetFileInfo(info.Path);
length = fileInfo.Length;
- ImageDimensions size = _imageProcessor.GetImageSize(item, info, true);
+ ImageDimensions size = _imageProcessor.GetImageDimensions(item, info, true);
width = size.Width;
height = size.Height;
diff --git a/MediaBrowser.Controller/Drawing/IImageProcessor.cs b/MediaBrowser.Controller/Drawing/IImageProcessor.cs
index b713d50b1..a11e2186f 100644
--- a/MediaBrowser.Controller/Drawing/IImageProcessor.cs
+++ b/MediaBrowser.Controller/Drawing/IImageProcessor.cs
@@ -26,16 +26,29 @@ namespace MediaBrowser.Controller.Drawing
/// <value>The image enhancers.</value>
IImageEnhancer[] ImageEnhancers { get; }
- ImageDimensions GetImageSize(string path);
+ /// <summary>
+ /// Gets the dimensions of the image.
+ /// </summary>
+ /// <param name="path">Path to the image file.</param>
+ /// <returns>ImageDimensions</returns>
+ ImageDimensions GetImageDimensions(string path);
/// <summary>
- /// Gets the size of the image.
+ /// Gets the dimensions of the image.
/// </summary>
+ /// <param name="item">The base item.</param>
/// <param name="info">The information.</param>
- /// <returns>ImageSize.</returns>
- ImageDimensions GetImageSize(BaseItem item, ItemImageInfo info);
+ /// <returns>ImageDimensions</returns>
+ ImageDimensions GetImageDimensions(BaseItem item, ItemImageInfo info);
- ImageDimensions GetImageSize(BaseItem item, ItemImageInfo info, bool updateItem);
+ /// <summary>
+ /// Gets the dimensions of the image.
+ /// </summary>
+ /// <param name="item">The base item.</param>
+ /// <param name="info">The information.</param>
+ /// <param name="updateItem">Whether or not the item info should be updated.</param>
+ /// <returns>ImageDimensions</returns>
+ ImageDimensions GetImageDimensions(BaseItem item, ItemImageInfo info, bool updateItem);
/// <summary>
/// Adds the parts.
diff --git a/MediaBrowser.Model/Drawing/ImageSize.cs b/MediaBrowser.Model/Drawing/ImageDimensions.cs
index 75591d83d..e7805ac49 100644
--- a/MediaBrowser.Model/Drawing/ImageSize.cs
+++ b/MediaBrowser.Model/Drawing/ImageDimensions.cs
@@ -1,7 +1,7 @@
namespace MediaBrowser.Model.Drawing
{
/// <summary>
- /// Struct ImageSize
+ /// Struct ImageDimensions
/// </summary>
public struct ImageDimensions
{
diff --git a/README.md b/README.md
index 5d9a940ee..d869c8978 100644
--- a/README.md
+++ b/README.md
@@ -12,7 +12,8 @@
<a href="https://cloud.drone.io/jellyfin/jellyfin"><img alt="Build Status" src="https://cloud.drone.io/api/badges/jellyfin/jellyfin/status.svg"/></a>
<a href="https://hub.docker.com/r/jellyfin/jellyfin"><img alt="Docker Pull Count" src="https://img.shields.io/docker/pulls/jellyfin/jellyfin.svg"/></a>
</br>
-<a href="https://opencollective.com/jellyfin"><img alt="Donate" src="https://opencollective.com/jellyfin/tiers/backer/badge.svg?label=Backers&color=brightgreen"/></a>
+<a href="https://opencollective.com/jellyfin"><img alt="Donate" src="https://img.shields.io/opencollective/all/jellyfin.svg?label=backers"/></a>
+<a href="https://forum.jellyfin.org"/><img alt="Discuss on our Forum" src="https://img.shields.io/discourse/https/forum.jellyfin.org/users.svg"/></a>
<a href="https://matrix.to/#/+jellyfin:matrix.org"><img alt="Chat on Matrix" src="https://img.shields.io/matrix/jellyfin:matrix.org.svg?logo=matrix"/></a>
<a href="https://www.reddit.com/r/jellyfin/"><img alt="Join our Subreddit" src="https://img.shields.io/badge/reddit-r%2Fjellyfin-%23FF5700.svg"/></a>
</p>