remember display mirroring
This commit is contained in:
parent
73082a0449
commit
6780e146a0
|
@ -20,7 +20,8 @@ namespace MediaBrowser.Controller.Entities.Audio
|
|||
IHasMusicGenres,
|
||||
IHasLookupInfo<SongInfo>,
|
||||
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<string> Tags { get; set; }
|
||||
|
||||
public bool IsThemeMedia { get; set; }
|
||||
|
||||
public Audio()
|
||||
{
|
||||
Artists = new List<string>();
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
8
MediaBrowser.Controller/Entities/IThemeMedia.cs
Normal file
8
MediaBrowser.Controller/Entities/IThemeMedia.cs
Normal file
|
@ -0,0 +1,8 @@
|
|||
|
||||
namespace MediaBrowser.Controller.Entities
|
||||
{
|
||||
public interface IThemeMedia
|
||||
{
|
||||
bool IsThemeMedia { get; }
|
||||
}
|
||||
}
|
|
@ -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<Guid> AdditionalPartIds { get; set; }
|
||||
public List<Guid> LocalAlternateVersionIds { get; set; }
|
||||
|
||||
public bool IsThemeMedia { get; set; }
|
||||
|
||||
public string FormatName { get; set; }
|
||||
public long? Size { get; set; }
|
||||
public string Container { get; set; }
|
||||
|
|
|
@ -151,6 +151,7 @@
|
|||
<Compile Include="Entities\ISupportsBoxSetGrouping.cs" />
|
||||
<Compile Include="Entities\ISupportsPlaceHolders.cs" />
|
||||
<Compile Include="Entities\ItemImageInfo.cs" />
|
||||
<Compile Include="Entities\IThemeMedia.cs" />
|
||||
<Compile Include="Entities\LinkedChild.cs" />
|
||||
<Compile Include="Entities\MusicVideo.cs" />
|
||||
<Compile Include="Entities\IHasAwards.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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -146,21 +146,6 @@ namespace MediaBrowser.Dlna.Ssdp
|
|||
StartQueueTimer();
|
||||
}
|
||||
|
||||
public void SendDatagramFromDevices(string header,
|
||||
Dictionary<string, string> 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)
|
||||
{
|
||||
|
|
|
@ -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<string, string>(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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -26,16 +26,12 @@ namespace MediaBrowser.Model.Notifications
|
|||
|
||||
public SendToUserType? SendToUserMode { get; set; }
|
||||
|
||||
public List<string> ExcludeUserIds { get; set; }
|
||||
|
||||
public NotificationRequest()
|
||||
{
|
||||
UserIds = new List<string>();
|
||||
Date = DateTime.UtcNow;
|
||||
|
||||
Variables = new Dictionary<string, string>();
|
||||
|
||||
ExcludeUserIds = new List<string>();
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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<ImageType>();
|
||||
|
||||
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);
|
||||
|
||||
|
|
|
@ -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"
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
|
||||
<metadata>
|
||||
<id>MediaBrowser.Common.Internal</id>
|
||||
<version>3.0.426</version>
|
||||
<version>3.0.427</version>
|
||||
<title>MediaBrowser.Common.Internal</title>
|
||||
<authors>Luke</authors>
|
||||
<owners>ebr,Luke,scottisafool</owners>
|
||||
|
@ -12,7 +12,7 @@
|
|||
<description>Contains common components shared by Media Browser Theater and Media Browser Server. Not intended for plugin developer consumption.</description>
|
||||
<copyright>Copyright © Media Browser 2013</copyright>
|
||||
<dependencies>
|
||||
<dependency id="MediaBrowser.Common" version="3.0.426" />
|
||||
<dependency id="MediaBrowser.Common" version="3.0.427" />
|
||||
<dependency id="NLog" version="3.1.0.0" />
|
||||
<dependency id="SimpleInjector" version="2.5.2" />
|
||||
<dependency id="sharpcompress" version="0.10.2" />
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
|
||||
<metadata>
|
||||
<id>MediaBrowser.Common</id>
|
||||
<version>3.0.426</version>
|
||||
<version>3.0.427</version>
|
||||
<title>MediaBrowser.Common</title>
|
||||
<authors>Media Browser Team</authors>
|
||||
<owners>ebr,Luke,scottisafool</owners>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
|
||||
<metadata>
|
||||
<id>MediaBrowser.Model.Signed</id>
|
||||
<version>3.0.426</version>
|
||||
<version>3.0.427</version>
|
||||
<title>MediaBrowser.Model - Signed Edition</title>
|
||||
<authors>Media Browser Team</authors>
|
||||
<owners>ebr,Luke,scottisafool</owners>
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
|
||||
<metadata>
|
||||
<id>MediaBrowser.Server.Core</id>
|
||||
<version>3.0.426</version>
|
||||
<version>3.0.427</version>
|
||||
<title>Media Browser.Server.Core</title>
|
||||
<authors>Media Browser Team</authors>
|
||||
<owners>ebr,Luke,scottisafool</owners>
|
||||
|
@ -12,7 +12,7 @@
|
|||
<description>Contains core components required to build plugins for Media Browser Server.</description>
|
||||
<copyright>Copyright © Media Browser 2013</copyright>
|
||||
<dependencies>
|
||||
<dependency id="MediaBrowser.Common" version="3.0.426" />
|
||||
<dependency id="MediaBrowser.Common" version="3.0.427" />
|
||||
</dependencies>
|
||||
</metadata>
|
||||
<files>
|
||||
|
|
Loading…
Reference in New Issue
Block a user