From 6780e146a0bbea7065f478f957642a8ce50a6643 Mon Sep 17 00:00:00 2001 From: Luke Pulverenti Date: Mon, 25 Aug 2014 22:30:52 -0400 Subject: [PATCH] remember display mirroring --- .../Entities/Audio/Audio.cs | 5 +- MediaBrowser.Controller/Entities/BaseItem.cs | 26 +++++++++- .../Entities/IThemeMedia.cs | 8 +++ MediaBrowser.Controller/Entities/Video.cs | 5 +- .../MediaBrowser.Controller.csproj | 1 + .../Providers/MetadataRefreshOptions.cs | 13 +++++ MediaBrowser.Dlna/Ssdp/Datagram.cs | 2 +- MediaBrowser.Dlna/Ssdp/DeviceDiscovery.cs | 51 +++++-------------- MediaBrowser.Dlna/Ssdp/SsdpHandler.cs | 17 +------ MediaBrowser.Dlna/Ssdp/SsdpMessageBuilder.cs | 28 +--------- .../Notifications/NotificationRequest.cs | 4 -- .../EntryPoints/ActivityLogEntryPoint.cs | 14 +++++ .../Notifications/Notifications.cs | 8 ++- .../LiveTv/LiveTvManager.cs | 23 +++++++-- .../Localization/Server/server.json | 19 ++++--- .../Notifications/NotificationManager.cs | 1 - Nuget/MediaBrowser.Common.Internal.nuspec | 4 +- Nuget/MediaBrowser.Common.nuspec | 2 +- Nuget/MediaBrowser.Model.Signed.nuspec | 2 +- Nuget/MediaBrowser.Server.Core.nuspec | 4 +- 20 files changed, 123 insertions(+), 114 deletions(-) create mode 100644 MediaBrowser.Controller/Entities/IThemeMedia.cs diff --git a/MediaBrowser.Controller/Entities/Audio/Audio.cs b/MediaBrowser.Controller/Entities/Audio/Audio.cs index d3085cb680..7d54e012c6 100644 --- a/MediaBrowser.Controller/Entities/Audio/Audio.cs +++ b/MediaBrowser.Controller/Entities/Audio/Audio.cs @@ -20,7 +20,8 @@ namespace MediaBrowser.Controller.Entities.Audio IHasMusicGenres, IHasLookupInfo, IHasTags, - IHasMediaSources + IHasMediaSources, + IThemeMedia { public string FormatName { get; set; } public long? Size { get; set; } @@ -28,6 +29,8 @@ namespace MediaBrowser.Controller.Entities.Audio public int? TotalBitrate { get; set; } public List Tags { get; set; } + public bool IsThemeMedia { get; set; } + public Audio() { Artists = new List(); diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs index e718a53ff8..fd7a33ddf4 100644 --- a/MediaBrowser.Controller/Entities/BaseItem.cs +++ b/MediaBrowser.Controller/Entities/BaseItem.cs @@ -749,7 +749,18 @@ namespace MediaBrowser.Controller.Entities var themeVideosChanged = !item.ThemeVideoIds.SequenceEqual(newThemeVideoIds); - var tasks = newThemeVideos.Select(i => i.RefreshMetadata(options, cancellationToken)); + var tasks = newThemeVideos.Select(i => + { + var subOptions = new MetadataRefreshOptions(options); + + if (!i.IsThemeMedia) + { + i.IsThemeMedia = true; + subOptions.ForceSave = true; + } + + return i.RefreshMetadata(subOptions, cancellationToken); + }); await Task.WhenAll(tasks).ConfigureAwait(false); @@ -768,7 +779,18 @@ namespace MediaBrowser.Controller.Entities var themeSongsChanged = !item.ThemeSongIds.SequenceEqual(newThemeSongIds); - var tasks = newThemeSongs.Select(i => i.RefreshMetadata(options, cancellationToken)); + var tasks = newThemeSongs.Select(i => + { + var subOptions = new MetadataRefreshOptions(options); + + if (!i.IsThemeMedia) + { + i.IsThemeMedia = true; + subOptions.ForceSave = true; + } + + return i.RefreshMetadata(subOptions, cancellationToken); + }); await Task.WhenAll(tasks).ConfigureAwait(false); diff --git a/MediaBrowser.Controller/Entities/IThemeMedia.cs b/MediaBrowser.Controller/Entities/IThemeMedia.cs new file mode 100644 index 0000000000..b2eff230ff --- /dev/null +++ b/MediaBrowser.Controller/Entities/IThemeMedia.cs @@ -0,0 +1,8 @@ + +namespace MediaBrowser.Controller.Entities +{ + public interface IThemeMedia + { + bool IsThemeMedia { get; } + } +} diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs index ff4c5dd900..ea530272dd 100644 --- a/MediaBrowser.Controller/Entities/Video.cs +++ b/MediaBrowser.Controller/Entities/Video.cs @@ -24,7 +24,8 @@ namespace MediaBrowser.Controller.Entities IHasTags, ISupportsPlaceHolders, IHasMediaSources, - IHasShortOverview + IHasShortOverview, + IThemeMedia { public bool IsMultiPart { get; set; } public bool HasLocalAlternateVersions { get; set; } @@ -33,6 +34,8 @@ namespace MediaBrowser.Controller.Entities public List AdditionalPartIds { get; set; } public List LocalAlternateVersionIds { get; set; } + public bool IsThemeMedia { get; set; } + public string FormatName { get; set; } public long? Size { get; set; } public string Container { get; set; } diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj index cbf99d9a81..561ae93261 100644 --- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj +++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj @@ -151,6 +151,7 @@ + diff --git a/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs b/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs index 7f1ddbce9b..dd07979d34 100644 --- a/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs +++ b/MediaBrowser.Controller/Providers/MetadataRefreshOptions.cs @@ -1,6 +1,7 @@ using MediaBrowser.Model.Entities; using System; using System.Collections.Generic; +using System.Linq; namespace MediaBrowser.Controller.Providers { @@ -23,6 +24,18 @@ namespace MediaBrowser.Controller.Providers { MetadataRefreshMode = MetadataRefreshMode.Default; } + + public MetadataRefreshOptions(MetadataRefreshOptions copy) + { + MetadataRefreshMode = copy.MetadataRefreshMode; + ForceSave = copy.ForceSave; + ReplaceAllMetadata = copy.ReplaceAllMetadata; + + ImageRefreshMode = copy.ImageRefreshMode; + DirectoryService = copy.DirectoryService; + ReplaceAllImages = copy.ReplaceAllImages; + ReplaceImages = copy.ReplaceImages.ToList(); + } } public class ImageRefreshOptions diff --git a/MediaBrowser.Dlna/Ssdp/Datagram.cs b/MediaBrowser.Dlna/Ssdp/Datagram.cs index 9df7502e7c..2554d33c6e 100644 --- a/MediaBrowser.Dlna/Ssdp/Datagram.cs +++ b/MediaBrowser.Dlna/Ssdp/Datagram.cs @@ -69,7 +69,7 @@ namespace MediaBrowser.Dlna.Ssdp } catch (Exception ex) { - _logger.ErrorException("Error sending Datagram: " + Message, ex); + _logger.ErrorException("Error sending Datagram to {0} from {1}: " + Message, ex, ToEndPoint, FromEndPoint == null ? "" : FromEndPoint.ToString()); } ++SendCount; } diff --git a/MediaBrowser.Dlna/Ssdp/DeviceDiscovery.cs b/MediaBrowser.Dlna/Ssdp/DeviceDiscovery.cs index 8cda730825..cc9b80d757 100644 --- a/MediaBrowser.Dlna/Ssdp/DeviceDiscovery.cs +++ b/MediaBrowser.Dlna/Ssdp/DeviceDiscovery.cs @@ -1,8 +1,6 @@ using MediaBrowser.Common.Events; using MediaBrowser.Common.Net; using MediaBrowser.Controller.Configuration; -using MediaBrowser.Dlna.PlayTo; -using MediaBrowser.Model.Events; using MediaBrowser.Model.Logging; using System; using System.Collections.Generic; @@ -10,7 +8,6 @@ using System.Linq; using System.Net; using System.Net.NetworkInformation; using System.Net.Sockets; -using System.Text; using System.Threading; using System.Threading.Tasks; @@ -75,7 +72,7 @@ namespace MediaBrowser.Dlna.Ssdp } } - void _ssdpHandler_MessageReceived(object sender, SsdpMessageEventArgs e) + void _ssdpHandler_MessageReceived(object sender, SsdpMessageEventArgs e) { string nts; e.Headers.TryGetValue("NTS", out nts); @@ -87,10 +84,16 @@ namespace MediaBrowser.Dlna.Ssdp EventHelper.FireEventIfNotNull(DeviceLeft, this, e, _logger); return; } - - try + + try { - //TryCreateDevice(e, IPAddress.Parse(_networkManager.GetLocalIpAddresses().First())); + //var ip = _networkManager.GetLocalIpAddresses().FirstOrDefault(); + + //if (ip != null) + //{ + // e.LocalIp = IPAddress.Parse(ip); + // TryCreateDevice(e); + //} } catch (OperationCanceledException) { @@ -184,36 +187,6 @@ namespace MediaBrowser.Dlna.Ssdp } - private void CreateNotifier(Socket socket) - { - Task.Factory.StartNew(async (o) => - { - try - { - var msg = new SsdpMessageBuilder().BuildRendererDiscoveryMessage(); - var request = Encoding.UTF8.GetBytes(msg); - - while (true) - { - socket.SendTo(request, new IPEndPoint(IPAddress.Parse("239.255.255.250"), 1900)); - - var delay = _config.GetDlnaConfiguration().ClientDiscoveryIntervalSeconds * 1000; - - await Task.Delay(delay).ConfigureAwait(false); - } - } - catch (OperationCanceledException) - { - } - catch (Exception ex) - { - _logger.ErrorException("Error in notifier", ex); - } - - }, _tokenSource.Token, TaskCreationOptions.LongRunning); - - } - private Socket GetMulticastSocket(int networkInterfaceIndex) { var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); @@ -223,7 +196,7 @@ namespace MediaBrowser.Dlna.Ssdp return socket; } - private void TryCreateDevice(SsdpMessageEventArgs args) + private void TryCreateDevice(SsdpMessageEventArgs args) { string nts; args.Headers.TryGetValue("NTS", out nts); @@ -262,7 +235,7 @@ namespace MediaBrowser.Dlna.Ssdp public void Dispose() { _ssdpHandler.MessageReceived -= _ssdpHandler_MessageReceived; - + if (!_disposed) { _disposed = true; diff --git a/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs b/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs index 10a234fb1b..b8c64a7871 100644 --- a/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs +++ b/MediaBrowser.Dlna/Ssdp/SsdpHandler.cs @@ -146,21 +146,6 @@ namespace MediaBrowser.Dlna.Ssdp StartQueueTimer(); } - public void SendDatagramFromDevices(string header, - Dictionary values, - IPEndPoint endpoint, - string deviceType) - { - foreach (var d in RegisteredDevices) - { - if (string.Equals(deviceType, "ssdp:all", StringComparison.OrdinalIgnoreCase) || - string.Equals(deviceType, d.Type, StringComparison.OrdinalIgnoreCase)) - { - SendDatagram(header, values, endpoint, new IPEndPoint(d.Address, 0)); - } - } - } - private void RespondToSearch(IPEndPoint endpoint, string deviceType) { if (_config.GetDlnaConfiguration().EnableDebugLogging) @@ -185,7 +170,7 @@ namespace MediaBrowser.Dlna.Ssdp values["ST"] = d.Type; values["USN"] = d.USN; - SendDatagram(header, values, endpoint, null); + SendDatagram(header, values, endpoint, new IPEndPoint(d.Address, 0)); if (_config.GetDlnaConfiguration().EnableDebugLogging) { diff --git a/MediaBrowser.Dlna/Ssdp/SsdpMessageBuilder.cs b/MediaBrowser.Dlna/Ssdp/SsdpMessageBuilder.cs index 0eff6ad6fc..e479ca19a5 100644 --- a/MediaBrowser.Dlna/Ssdp/SsdpMessageBuilder.cs +++ b/MediaBrowser.Dlna/Ssdp/SsdpMessageBuilder.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Text; namespace MediaBrowser.Dlna.Ssdp @@ -23,30 +22,5 @@ namespace MediaBrowser.Dlna.Ssdp return builder.ToString(); } - - public string BuildDiscoveryMessage(string deviceSearchType, string mx) - { - const string header = "M-SEARCH * HTTP/1.1"; - - var values = new Dictionary(StringComparer.OrdinalIgnoreCase); - - values["HOST"] = "239.255.255.250:1900"; - values["USER-AGENT"] = "UPnP/1.0 DLNADOC/1.50 Platinum/1.0.4.2"; - values["ST"] = "ssdp:all"; - values["MAN"] = "ssdp:discover"; - values["MX"] = "10"; - - return BuildMessage(header, values); - } - - public string BuildRendererDiscoveryMessage() - { - return BuildDiscoveryMessage("urn:schemas-upnp-org:device:MediaRenderer:1", "3"); - } - - public string BuildMediaServerDiscoveryMessage() - { - return BuildDiscoveryMessage("urn:schemas-upnp-org:device:MediaRenderer:1", "3"); - } } } diff --git a/MediaBrowser.Model/Notifications/NotificationRequest.cs b/MediaBrowser.Model/Notifications/NotificationRequest.cs index 6e9368f441..3cd463422c 100644 --- a/MediaBrowser.Model/Notifications/NotificationRequest.cs +++ b/MediaBrowser.Model/Notifications/NotificationRequest.cs @@ -26,16 +26,12 @@ namespace MediaBrowser.Model.Notifications public SendToUserType? SendToUserMode { get; set; } - public List ExcludeUserIds { get; set; } - public NotificationRequest() { UserIds = new List(); Date = DateTime.UtcNow; Variables = new Dictionary(); - - ExcludeUserIds = new List(); } } } \ No newline at end of file diff --git a/MediaBrowser.Server.Implementations/EntryPoints/ActivityLogEntryPoint.cs b/MediaBrowser.Server.Implementations/EntryPoints/ActivityLogEntryPoint.cs index 0bd772a56f..fb1010f1b4 100644 --- a/MediaBrowser.Server.Implementations/EntryPoints/ActivityLogEntryPoint.cs +++ b/MediaBrowser.Server.Implementations/EntryPoints/ActivityLogEntryPoint.cs @@ -117,6 +117,13 @@ namespace MediaBrowser.Server.Implementations.EntryPoints return; } + var themeMedia = item as IThemeMedia; + if (themeMedia != null && themeMedia.IsThemeMedia) + { + // Don't report theme song or local trailer playback + return; + } + if (e.Users.Count == 0) { return; @@ -142,6 +149,13 @@ namespace MediaBrowser.Server.Implementations.EntryPoints return; } + var themeMedia = item as IThemeMedia; + if (themeMedia != null && themeMedia.IsThemeMedia) + { + // Don't report theme song or local trailer playback + return; + } + if (e.Users.Count == 0) { return; diff --git a/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifications.cs b/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifications.cs index 6a0bb780c4..065b5e95dc 100644 --- a/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifications.cs +++ b/MediaBrowser.Server.Implementations/EntryPoints/Notifications/Notifications.cs @@ -195,19 +195,17 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications var user = e.Users.FirstOrDefault(); var item = e.MediaInfo; + var themeMedia = item as IThemeMedia; - if (e.Item != null && e.Item.Parent == null) + if (themeMedia != null && themeMedia.IsThemeMedia) { // Don't report theme song or local trailer playback - // TODO: This will also cause movie specials to not be reported return; } var notification = new NotificationRequest { - NotificationType = type, - - ExcludeUserIds = e.Users.Select(i => i.Id.ToString("N")).ToList() + NotificationType = type }; notification.Variables["ItemName"] = item.Name; diff --git a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs index cc06c6c50b..d072217af4 100644 --- a/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs +++ b/MediaBrowser.Server.Implementations/LiveTv/LiveTvManager.cs @@ -475,13 +475,27 @@ namespace MediaBrowser.Server.Implementations.LiveTv } item.ChannelType = channelInfo.ChannelType; - item.ProviderImageUrl = channelInfo.ImageUrl; - item.HasProviderImage = channelInfo.HasImage; - item.ProviderImagePath = channelInfo.ImagePath; item.ExternalId = channelInfo.Id; item.ServiceName = serviceName; item.Number = channelInfo.Number; + var replaceImages = new List(); + + if (!string.Equals(item.ProviderImageUrl, channelInfo.ImageUrl, StringComparison.OrdinalIgnoreCase)) + { + isNew = true; + replaceImages.Add(ImageType.Primary); + } + if (!string.Equals(item.ProviderImagePath, channelInfo.ImagePath, StringComparison.OrdinalIgnoreCase)) + { + isNew = true; + replaceImages.Add(ImageType.Primary); + } + + item.ProviderImageUrl = channelInfo.ImageUrl; + item.HasProviderImage = channelInfo.HasImage; + item.ProviderImagePath = channelInfo.ImagePath; + if (string.IsNullOrEmpty(item.Name)) { item.Name = channelInfo.Name; @@ -489,7 +503,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv await item.RefreshMetadata(new MetadataRefreshOptions { - ForceSave = isNew + ForceSave = isNew, + ReplaceImages = replaceImages.Distinct().ToList() }, cancellationToken); diff --git a/MediaBrowser.Server.Implementations/Localization/Server/server.json b/MediaBrowser.Server.Implementations/Localization/Server/server.json index df9e28b902..6b1f3d91ac 100644 --- a/MediaBrowser.Server.Implementations/Localization/Server/server.json +++ b/MediaBrowser.Server.Implementations/Localization/Server/server.json @@ -602,7 +602,6 @@ "LabelNotificationEnabled": "Enable this notification", "LabelMonitorUsers": "Monitor activity from:", "LabelSendNotificationToUsers": "Send the notification to:", - "UsersNotNotifiedAboutSelfActivity": "Users will not be notified about their own activities.", "LabelUseNotificationServices": "Use the following services:", "CategoryUser": "User", "CategorySystem": "System", @@ -769,15 +768,15 @@ "LabelDisplayPluginsFor": "Display plugins for:", "PluginTabMediaBrowserClassic": "MB Classic", "PluginTabMediaBrowserTheater": "MB Theater", - "LabelEpisodeName": "Episode name", - "LabelSeriesName": "Series name", + "LabelEpisodeNamePlain": "Episode name", + "LabelSeriesNamePlain": "Series name", "ValueSeriesNamePeriod": "Series.name", "ValueSeriesNameUnderscore": "Series_name", "ValueEpisodeNamePeriod": "Episode.name", "ValueEpisodeNameUnderscore": "Episode_name", - "LabelSeasonNumber": "Season number", - "LabelEpisodeNumber": "Episode number", - "LabelEndingEpisodeNumber": "Ending episode number", + "LabelSeasonNumberPlain": "Season number", + "LabelEpisodeNumberPlain": "Episode number", + "LabelEndingEpisodeNumberPlain": "Ending episode number", "HeaderTypeText": "Enter Text", "LabelTypeText": "Text", "HeaderSearchForSubtitles": "Search for Subtitles", @@ -1100,5 +1099,11 @@ "OptionNoTrailer": "No Trailer", "OptionNoThemeSong": "No Theme Song", "OptionNoThemeVideo": "No Theme Video", - "LabelOneTimeDonationAmount": "Donation amount:" + "LabelOneTimeDonationAmount": "Donation amount:", + "OptionActor": "Actor", + "OptionComposer": "Composer", + "OptionDirector": "Director", + "OptionGuestStar": "Guest star", + "OptionProducer": "Producer", + "OptionWriter": "Writer" } diff --git a/MediaBrowser.Server.Implementations/Notifications/NotificationManager.cs b/MediaBrowser.Server.Implementations/Notifications/NotificationManager.cs index 7286846db7..3558922d8b 100644 --- a/MediaBrowser.Server.Implementations/Notifications/NotificationManager.cs +++ b/MediaBrowser.Server.Implementations/Notifications/NotificationManager.cs @@ -44,7 +44,6 @@ namespace MediaBrowser.Server.Implementations.Notifications GetConfiguration().GetOptions(notificationType); var users = GetUserIds(request, options) - .Except(request.ExcludeUserIds) .Select(i => _userManager.GetUserById(new Guid(i))); var title = GetTitle(request, options); diff --git a/Nuget/MediaBrowser.Common.Internal.nuspec b/Nuget/MediaBrowser.Common.Internal.nuspec index 3f023c5ef5..e843c6298e 100644 --- a/Nuget/MediaBrowser.Common.Internal.nuspec +++ b/Nuget/MediaBrowser.Common.Internal.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common.Internal - 3.0.426 + 3.0.427 MediaBrowser.Common.Internal Luke ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption. Copyright © Media Browser 2013 - + diff --git a/Nuget/MediaBrowser.Common.nuspec b/Nuget/MediaBrowser.Common.nuspec index 908d069544..90a66b3c78 100644 --- a/Nuget/MediaBrowser.Common.nuspec +++ b/Nuget/MediaBrowser.Common.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Common - 3.0.426 + 3.0.427 MediaBrowser.Common Media Browser Team ebr,Luke,scottisafool diff --git a/Nuget/MediaBrowser.Model.Signed.nuspec b/Nuget/MediaBrowser.Model.Signed.nuspec index 6a9c203ceb..a444d4c33b 100644 --- a/Nuget/MediaBrowser.Model.Signed.nuspec +++ b/Nuget/MediaBrowser.Model.Signed.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Model.Signed - 3.0.426 + 3.0.427 MediaBrowser.Model - Signed Edition Media Browser Team ebr,Luke,scottisafool diff --git a/Nuget/MediaBrowser.Server.Core.nuspec b/Nuget/MediaBrowser.Server.Core.nuspec index 3cbad00b7a..dadc51dff2 100644 --- a/Nuget/MediaBrowser.Server.Core.nuspec +++ b/Nuget/MediaBrowser.Server.Core.nuspec @@ -2,7 +2,7 @@ MediaBrowser.Server.Core - 3.0.426 + 3.0.427 Media Browser.Server.Core Media Browser Team ebr,Luke,scottisafool @@ -12,7 +12,7 @@ Contains core components required to build plugins for Media Browser Server. Copyright © Media Browser 2013 - +