remember display mirroring

pull/702/head
Luke Pulverenti 10 years ago
parent 73082a0449
commit 6780e146a0

@ -20,7 +20,8 @@ namespace MediaBrowser.Controller.Entities.Audio
IHasMusicGenres, IHasMusicGenres,
IHasLookupInfo<SongInfo>, IHasLookupInfo<SongInfo>,
IHasTags, IHasTags,
IHasMediaSources IHasMediaSources,
IThemeMedia
{ {
public string FormatName { get; set; } public string FormatName { get; set; }
public long? Size { get; set; } public long? Size { get; set; }
@ -28,6 +29,8 @@ namespace MediaBrowser.Controller.Entities.Audio
public int? TotalBitrate { get; set; } public int? TotalBitrate { get; set; }
public List<string> Tags { get; set; } public List<string> Tags { get; set; }
public bool IsThemeMedia { get; set; }
public Audio() public Audio()
{ {
Artists = new List<string>(); Artists = new List<string>();

@ -749,7 +749,18 @@ namespace MediaBrowser.Controller.Entities
var themeVideosChanged = !item.ThemeVideoIds.SequenceEqual(newThemeVideoIds); 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); await Task.WhenAll(tasks).ConfigureAwait(false);
@ -768,7 +779,18 @@ namespace MediaBrowser.Controller.Entities
var themeSongsChanged = !item.ThemeSongIds.SequenceEqual(newThemeSongIds); 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); await Task.WhenAll(tasks).ConfigureAwait(false);

@ -0,0 +1,8 @@

namespace MediaBrowser.Controller.Entities
{
public interface IThemeMedia
{
bool IsThemeMedia { get; }
}
}

@ -24,7 +24,8 @@ namespace MediaBrowser.Controller.Entities
IHasTags, IHasTags,
ISupportsPlaceHolders, ISupportsPlaceHolders,
IHasMediaSources, IHasMediaSources,
IHasShortOverview IHasShortOverview,
IThemeMedia
{ {
public bool IsMultiPart { get; set; } public bool IsMultiPart { get; set; }
public bool HasLocalAlternateVersions { get; set; } public bool HasLocalAlternateVersions { get; set; }
@ -33,6 +34,8 @@ namespace MediaBrowser.Controller.Entities
public List<Guid> AdditionalPartIds { get; set; } public List<Guid> AdditionalPartIds { get; set; }
public List<Guid> LocalAlternateVersionIds { get; set; } public List<Guid> LocalAlternateVersionIds { get; set; }
public bool IsThemeMedia { get; set; }
public string FormatName { get; set; } public string FormatName { get; set; }
public long? Size { get; set; } public long? Size { get; set; }
public string Container { get; set; } public string Container { get; set; }

@ -151,6 +151,7 @@
<Compile Include="Entities\ISupportsBoxSetGrouping.cs" /> <Compile Include="Entities\ISupportsBoxSetGrouping.cs" />
<Compile Include="Entities\ISupportsPlaceHolders.cs" /> <Compile Include="Entities\ISupportsPlaceHolders.cs" />
<Compile Include="Entities\ItemImageInfo.cs" /> <Compile Include="Entities\ItemImageInfo.cs" />
<Compile Include="Entities\IThemeMedia.cs" />
<Compile Include="Entities\LinkedChild.cs" /> <Compile Include="Entities\LinkedChild.cs" />
<Compile Include="Entities\MusicVideo.cs" /> <Compile Include="Entities\MusicVideo.cs" />
<Compile Include="Entities\IHasAwards.cs" /> <Compile Include="Entities\IHasAwards.cs" />

@ -1,6 +1,7 @@
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
namespace MediaBrowser.Controller.Providers namespace MediaBrowser.Controller.Providers
{ {
@ -23,6 +24,18 @@ namespace MediaBrowser.Controller.Providers
{ {
MetadataRefreshMode = MetadataRefreshMode.Default; 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 public class ImageRefreshOptions

@ -69,7 +69,7 @@ namespace MediaBrowser.Dlna.Ssdp
} }
catch (Exception ex) 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; ++SendCount;
} }

@ -1,8 +1,6 @@
using MediaBrowser.Common.Events; using MediaBrowser.Common.Events;
using MediaBrowser.Common.Net; using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Configuration; using MediaBrowser.Controller.Configuration;
using MediaBrowser.Dlna.PlayTo;
using MediaBrowser.Model.Events;
using MediaBrowser.Model.Logging; using MediaBrowser.Model.Logging;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
@ -10,7 +8,6 @@ using System.Linq;
using System.Net; using System.Net;
using System.Net.NetworkInformation; using System.Net.NetworkInformation;
using System.Net.Sockets; using System.Net.Sockets;
using System.Text;
using System.Threading; using System.Threading;
using System.Threading.Tasks; 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; string nts;
e.Headers.TryGetValue("NTS", out nts); e.Headers.TryGetValue("NTS", out nts);
@ -87,10 +84,16 @@ namespace MediaBrowser.Dlna.Ssdp
EventHelper.FireEventIfNotNull(DeviceLeft, this, e, _logger); EventHelper.FireEventIfNotNull(DeviceLeft, this, e, _logger);
return; 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) 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) private Socket GetMulticastSocket(int networkInterfaceIndex)
{ {
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); var socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
@ -223,7 +196,7 @@ namespace MediaBrowser.Dlna.Ssdp
return socket; return socket;
} }
private void TryCreateDevice(SsdpMessageEventArgs args) private void TryCreateDevice(SsdpMessageEventArgs args)
{ {
string nts; string nts;
args.Headers.TryGetValue("NTS", out nts); args.Headers.TryGetValue("NTS", out nts);
@ -262,7 +235,7 @@ namespace MediaBrowser.Dlna.Ssdp
public void Dispose() public void Dispose()
{ {
_ssdpHandler.MessageReceived -= _ssdpHandler_MessageReceived; _ssdpHandler.MessageReceived -= _ssdpHandler_MessageReceived;
if (!_disposed) if (!_disposed)
{ {
_disposed = true; _disposed = true;

@ -146,21 +146,6 @@ namespace MediaBrowser.Dlna.Ssdp
StartQueueTimer(); 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) private void RespondToSearch(IPEndPoint endpoint, string deviceType)
{ {
if (_config.GetDlnaConfiguration().EnableDebugLogging) if (_config.GetDlnaConfiguration().EnableDebugLogging)
@ -185,7 +170,7 @@ namespace MediaBrowser.Dlna.Ssdp
values["ST"] = d.Type; values["ST"] = d.Type;
values["USN"] = d.USN; values["USN"] = d.USN;
SendDatagram(header, values, endpoint, null); SendDatagram(header, values, endpoint, new IPEndPoint(d.Address, 0));
if (_config.GetDlnaConfiguration().EnableDebugLogging) if (_config.GetDlnaConfiguration().EnableDebugLogging)
{ {

@ -1,5 +1,4 @@
using System; using System.Collections.Generic;
using System.Collections.Generic;
using System.Text; using System.Text;
namespace MediaBrowser.Dlna.Ssdp namespace MediaBrowser.Dlna.Ssdp
@ -23,30 +22,5 @@ namespace MediaBrowser.Dlna.Ssdp
return builder.ToString(); 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 SendToUserType? SendToUserMode { get; set; }
public List<string> ExcludeUserIds { get; set; }
public NotificationRequest() public NotificationRequest()
{ {
UserIds = new List<string>(); UserIds = new List<string>();
Date = DateTime.UtcNow; Date = DateTime.UtcNow;
Variables = new Dictionary<string, string>(); Variables = new Dictionary<string, string>();
ExcludeUserIds = new List<string>();
} }
} }
} }

@ -117,6 +117,13 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
return; 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) if (e.Users.Count == 0)
{ {
return; return;
@ -142,6 +149,13 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
return; 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) if (e.Users.Count == 0)
{ {
return; return;

@ -195,19 +195,17 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications
var user = e.Users.FirstOrDefault(); var user = e.Users.FirstOrDefault();
var item = e.MediaInfo; 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 // Don't report theme song or local trailer playback
// TODO: This will also cause movie specials to not be reported
return; return;
} }
var notification = new NotificationRequest var notification = new NotificationRequest
{ {
NotificationType = type, NotificationType = type
ExcludeUserIds = e.Users.Select(i => i.Id.ToString("N")).ToList()
}; };
notification.Variables["ItemName"] = item.Name; notification.Variables["ItemName"] = item.Name;

@ -475,13 +475,27 @@ namespace MediaBrowser.Server.Implementations.LiveTv
} }
item.ChannelType = channelInfo.ChannelType; item.ChannelType = channelInfo.ChannelType;
item.ProviderImageUrl = channelInfo.ImageUrl;
item.HasProviderImage = channelInfo.HasImage;
item.ProviderImagePath = channelInfo.ImagePath;
item.ExternalId = channelInfo.Id; item.ExternalId = channelInfo.Id;
item.ServiceName = serviceName; item.ServiceName = serviceName;
item.Number = channelInfo.Number; 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)) if (string.IsNullOrEmpty(item.Name))
{ {
item.Name = channelInfo.Name; item.Name = channelInfo.Name;
@ -489,7 +503,8 @@ namespace MediaBrowser.Server.Implementations.LiveTv
await item.RefreshMetadata(new MetadataRefreshOptions await item.RefreshMetadata(new MetadataRefreshOptions
{ {
ForceSave = isNew ForceSave = isNew,
ReplaceImages = replaceImages.Distinct().ToList()
}, cancellationToken); }, cancellationToken);

@ -602,7 +602,6 @@
"LabelNotificationEnabled": "Enable this notification", "LabelNotificationEnabled": "Enable this notification",
"LabelMonitorUsers": "Monitor activity from:", "LabelMonitorUsers": "Monitor activity from:",
"LabelSendNotificationToUsers": "Send the notification to:", "LabelSendNotificationToUsers": "Send the notification to:",
"UsersNotNotifiedAboutSelfActivity": "Users will not be notified about their own activities.",
"LabelUseNotificationServices": "Use the following services:", "LabelUseNotificationServices": "Use the following services:",
"CategoryUser": "User", "CategoryUser": "User",
"CategorySystem": "System", "CategorySystem": "System",
@ -769,15 +768,15 @@
"LabelDisplayPluginsFor": "Display plugins for:", "LabelDisplayPluginsFor": "Display plugins for:",
"PluginTabMediaBrowserClassic": "MB Classic", "PluginTabMediaBrowserClassic": "MB Classic",
"PluginTabMediaBrowserTheater": "MB Theater", "PluginTabMediaBrowserTheater": "MB Theater",
"LabelEpisodeName": "Episode name", "LabelEpisodeNamePlain": "Episode name",
"LabelSeriesName": "Series name", "LabelSeriesNamePlain": "Series name",
"ValueSeriesNamePeriod": "Series.name", "ValueSeriesNamePeriod": "Series.name",
"ValueSeriesNameUnderscore": "Series_name", "ValueSeriesNameUnderscore": "Series_name",
"ValueEpisodeNamePeriod": "Episode.name", "ValueEpisodeNamePeriod": "Episode.name",
"ValueEpisodeNameUnderscore": "Episode_name", "ValueEpisodeNameUnderscore": "Episode_name",
"LabelSeasonNumber": "Season number", "LabelSeasonNumberPlain": "Season number",
"LabelEpisodeNumber": "Episode number", "LabelEpisodeNumberPlain": "Episode number",
"LabelEndingEpisodeNumber": "Ending episode number", "LabelEndingEpisodeNumberPlain": "Ending episode number",
"HeaderTypeText": "Enter Text", "HeaderTypeText": "Enter Text",
"LabelTypeText": "Text", "LabelTypeText": "Text",
"HeaderSearchForSubtitles": "Search for Subtitles", "HeaderSearchForSubtitles": "Search for Subtitles",
@ -1100,5 +1099,11 @@
"OptionNoTrailer": "No Trailer", "OptionNoTrailer": "No Trailer",
"OptionNoThemeSong": "No Theme Song", "OptionNoThemeSong": "No Theme Song",
"OptionNoThemeVideo": "No Theme Video", "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); GetConfiguration().GetOptions(notificationType);
var users = GetUserIds(request, options) var users = GetUserIds(request, options)
.Except(request.ExcludeUserIds)
.Select(i => _userManager.GetUserById(new Guid(i))); .Select(i => _userManager.GetUserById(new Guid(i)));
var title = GetTitle(request, options); var title = GetTitle(request, options);

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata> <metadata>
<id>MediaBrowser.Common.Internal</id> <id>MediaBrowser.Common.Internal</id>
<version>3.0.426</version> <version>3.0.427</version>
<title>MediaBrowser.Common.Internal</title> <title>MediaBrowser.Common.Internal</title>
<authors>Luke</authors> <authors>Luke</authors>
<owners>ebr,Luke,scottisafool</owners> <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> <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> <copyright>Copyright © Media Browser 2013</copyright>
<dependencies> <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="NLog" version="3.1.0.0" />
<dependency id="SimpleInjector" version="2.5.2" /> <dependency id="SimpleInjector" version="2.5.2" />
<dependency id="sharpcompress" version="0.10.2" /> <dependency id="sharpcompress" version="0.10.2" />

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd"> <package xmlns="http://schemas.microsoft.com/packaging/2012/06/nuspec.xsd">
<metadata> <metadata>
<id>MediaBrowser.Common</id> <id>MediaBrowser.Common</id>
<version>3.0.426</version> <version>3.0.427</version>
<title>MediaBrowser.Common</title> <title>MediaBrowser.Common</title>
<authors>Media Browser Team</authors> <authors>Media Browser Team</authors>
<owners>ebr,Luke,scottisafool</owners> <owners>ebr,Luke,scottisafool</owners>

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> <package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
<metadata> <metadata>
<id>MediaBrowser.Model.Signed</id> <id>MediaBrowser.Model.Signed</id>
<version>3.0.426</version> <version>3.0.427</version>
<title>MediaBrowser.Model - Signed Edition</title> <title>MediaBrowser.Model - Signed Edition</title>
<authors>Media Browser Team</authors> <authors>Media Browser Team</authors>
<owners>ebr,Luke,scottisafool</owners> <owners>ebr,Luke,scottisafool</owners>

@ -2,7 +2,7 @@
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd"> <package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata> <metadata>
<id>MediaBrowser.Server.Core</id> <id>MediaBrowser.Server.Core</id>
<version>3.0.426</version> <version>3.0.427</version>
<title>Media Browser.Server.Core</title> <title>Media Browser.Server.Core</title>
<authors>Media Browser Team</authors> <authors>Media Browser Team</authors>
<owners>ebr,Luke,scottisafool</owners> <owners>ebr,Luke,scottisafool</owners>
@ -12,7 +12,7 @@
<description>Contains core components required to build plugins for Media Browser Server.</description> <description>Contains core components required to build plugins for Media Browser Server.</description>
<copyright>Copyright © Media Browser 2013</copyright> <copyright>Copyright © Media Browser 2013</copyright>
<dependencies> <dependencies>
<dependency id="MediaBrowser.Common" version="3.0.426" /> <dependency id="MediaBrowser.Common" version="3.0.427" />
</dependencies> </dependencies>
</metadata> </metadata>
<files> <files>

Loading…
Cancel
Save