updated mono build

pull/702/head
Luke Pulverenti 10 years ago
parent b9a2af1fd5
commit 4e81655239

@ -1,5 +1,4 @@
using MediaBrowser.Common.Extensions;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Controller.Persistence;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Serialization;
using ServiceStack;
@ -79,14 +78,6 @@ namespace MediaBrowser.Api
{
var result = _displayPreferencesManager.GetDisplayPreferences(request.Id, request.UserId, request.Client);
if (result == null)
{
result = new DisplayPreferences
{
Id = request.Id
};
}
return ToOptimizedSerializedResultUsingCache(result);
}

@ -1,5 +1,6 @@
using MediaBrowser.Common.Net;
using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Model.Events;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Tasks;
using System.Collections.Generic;
@ -11,7 +12,7 @@ namespace MediaBrowser.Api.ScheduledTasks
/// <summary>
/// Class ScheduledTasksWebSocketListener
/// </summary>
public class ScheduledTasksWebSocketListener : BasePeriodicWebSocketListener<IEnumerable<TaskInfo>, object>
public class ScheduledTasksWebSocketListener : BasePeriodicWebSocketListener<IEnumerable<TaskInfo>, WebSocketListenerState>
{
/// <summary>
/// Gets or sets the task manager.
@ -37,6 +38,26 @@ namespace MediaBrowser.Api.ScheduledTasks
: base(logger)
{
TaskManager = taskManager;
TaskManager.TaskExecuting += TaskManager_TaskExecuting;
TaskManager.TaskCompleted += TaskManager_TaskCompleted;
}
void TaskManager_TaskCompleted(object sender, TaskCompletionEventArgs e)
{
SendData(true);
e.Task.TaskProgress -= Argument_TaskProgress;
}
void TaskManager_TaskExecuting(object sender, GenericEventArgs<IScheduledTaskWorker> e)
{
SendData(true);
e.Argument.TaskProgress += Argument_TaskProgress;
}
void Argument_TaskProgress(object sender, GenericEventArgs<double> e)
{
SendData(false);
}
/// <summary>
@ -44,12 +65,20 @@ namespace MediaBrowser.Api.ScheduledTasks
/// </summary>
/// <param name="state">The state.</param>
/// <returns>Task{IEnumerable{TaskInfo}}.</returns>
protected override Task<IEnumerable<TaskInfo>> GetDataToSend(object state)
protected override Task<IEnumerable<TaskInfo>> GetDataToSend(WebSocketListenerState state)
{
return Task.FromResult(TaskManager.ScheduledTasks
.OrderBy(i => i.Name)
.Select(ScheduledTaskHelpers.GetTaskInfo)
.Where(i => !i.IsHidden));
}
protected override bool SendOnTimer
{
get
{
return false;
}
}
}
}

@ -133,7 +133,7 @@ namespace MediaBrowser.Api.WebSocket
/// <summary>
/// Class LogFileWebSocketState
/// </summary>
public class LogFileWebSocketState
public class LogFileWebSocketState : WebSocketListenerState
{
/// <summary>
/// Gets or sets the last log file path.

@ -11,7 +11,7 @@ namespace MediaBrowser.Api.WebSocket
/// <summary>
/// Class SessionInfoWebSocketListener
/// </summary>
class SessionInfoWebSocketListener : BasePeriodicWebSocketListener<IEnumerable<SessionInfoDto>, object>
class SessionInfoWebSocketListener : BasePeriodicWebSocketListener<IEnumerable<SessionInfoDto>, WebSocketListenerState>
{
/// <summary>
/// Gets the name.
@ -43,7 +43,7 @@ namespace MediaBrowser.Api.WebSocket
/// </summary>
/// <param name="state">The state.</param>
/// <returns>Task{SystemInfo}.</returns>
protected override Task<IEnumerable<SessionInfoDto>> GetDataToSend(object state)
protected override Task<IEnumerable<SessionInfoDto>> GetDataToSend(WebSocketListenerState state)
{
return Task.FromResult(_sessionManager.Sessions.Where(i => i.IsActive).Select(_sessionManager.GetSessionInfoDto));
}

@ -9,7 +9,7 @@ namespace MediaBrowser.Api.WebSocket
/// <summary>
/// Class SystemInfoWebSocketListener
/// </summary>
public class SystemInfoWebSocketListener : BasePeriodicWebSocketListener<SystemInfo, object>
public class SystemInfoWebSocketListener : BasePeriodicWebSocketListener<SystemInfo, WebSocketListenerState>
{
/// <summary>
/// Gets the name.
@ -41,7 +41,7 @@ namespace MediaBrowser.Api.WebSocket
/// </summary>
/// <param name="state">The state.</param>
/// <returns>Task{SystemInfo}.</returns>
protected override Task<SystemInfo> GetDataToSend(object state)
protected override Task<SystemInfo> GetDataToSend(WebSocketListenerState state)
{
return Task.FromResult(_appHost.GetSystemInfo());
}

@ -1,6 +1,8 @@
using MediaBrowser.Common.Configuration;
using MediaBrowser.Common.Events;
using MediaBrowser.Common.Extensions;
using MediaBrowser.Common.ScheduledTasks;
using MediaBrowser.Model.Events;
using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Serialization;
using MediaBrowser.Model.Tasks;
@ -18,6 +20,8 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
/// </summary>
public class ScheduledTaskWorker : IScheduledTaskWorker
{
public event EventHandler<GenericEventArgs<double>> TaskProgress;
/// <summary>
/// Gets or sets the scheduled task.
/// </summary>
@ -344,13 +348,13 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
throw new InvalidOperationException("Cannot execute a Task that is already running");
}
var progress = new Progress<double>();
CurrentCancellationTokenSource = new CancellationTokenSource();
Logger.Info("Executing {0}", Name);
((TaskManager)TaskManager).OnTaskExecuting(ScheduledTask);
var progress = new Progress<double>();
((TaskManager)TaskManager).OnTaskExecuting(this);
progress.ProgressChanged += progress_ProgressChanged;
@ -412,6 +416,12 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
void progress_ProgressChanged(object sender, double e)
{
CurrentProgress = e;
EventHelper.FireEventIfNotNull(TaskProgress, this, new GenericEventArgs<double>
{
Argument = e
}, Logger);
}
/// <summary>
@ -546,7 +556,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
LastExecutionResult = result;
((TaskManager) TaskManager).OnTaskCompleted(ScheduledTask, result);
((TaskManager)TaskManager).OnTaskCompleted(this, result);
}
/// <summary>

@ -17,8 +17,8 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
/// </summary>
public class TaskManager : ITaskManager
{
public event EventHandler<EventArgs> TaskExecuting;
public event EventHandler<GenericEventArgs<TaskResult>> TaskCompleted;
public event EventHandler<GenericEventArgs<IScheduledTaskWorker>> TaskExecuting;
public event EventHandler<TaskCompletionEventArgs> TaskCompleted;
/// <summary>
/// Gets the list of Scheduled Tasks
@ -125,7 +125,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
// If it's idle just execute immediately
if (task.State == TaskState.Idle)
{
((ScheduledTaskWorker)task).Execute();
Execute(task);
return;
}
@ -149,7 +149,8 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
{
var myTasks = ScheduledTasks.ToList();
myTasks.AddRange(tasks.Select(t => new ScheduledTaskWorker(t, ApplicationPaths, this, JsonSerializer, Logger)));
var list = tasks.ToList();
myTasks.AddRange(list.Select(t => new ScheduledTaskWorker(t, ApplicationPaths, this, JsonSerializer, Logger)));
ScheduledTasks = myTasks.ToArray();
}
@ -189,9 +190,13 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
/// Called when [task executing].
/// </summary>
/// <param name="task">The task.</param>
internal void OnTaskExecuting(IScheduledTask task)
internal void OnTaskExecuting(IScheduledTaskWorker task)
{
EventHelper.QueueEventIfNotNull(TaskExecuting, task, EventArgs.Empty, Logger);
EventHelper.QueueEventIfNotNull(TaskExecuting, this, new GenericEventArgs<IScheduledTaskWorker>
{
Argument = task
}, Logger);
}
/// <summary>
@ -199,9 +204,15 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
/// </summary>
/// <param name="task">The task.</param>
/// <param name="result">The result.</param>
internal void OnTaskCompleted(IScheduledTask task, TaskResult result)
internal void OnTaskCompleted(IScheduledTaskWorker task, TaskResult result)
{
EventHelper.QueueEventIfNotNull(TaskCompleted, task, new GenericEventArgs<TaskResult> { Argument = result }, Logger);
EventHelper.QueueEventIfNotNull(TaskCompleted, task, new TaskCompletionEventArgs
{
Result = result,
Task = task
}, Logger);
ExecuteQueuedTasks();
}
@ -219,7 +230,7 @@ namespace MediaBrowser.Common.Implementations.ScheduledTasks
if (scheduledTask.State == TaskState.Idle)
{
((ScheduledTaskWorker)scheduledTask).Execute();
Execute(scheduledTask);
_taskQueue.Remove(type);
}

@ -15,7 +15,7 @@ namespace MediaBrowser.Common.Net
/// <typeparam name="TReturnDataType">The type of the T return data type.</typeparam>
/// <typeparam name="TStateType">The type of the T state type.</typeparam>
public abstract class BasePeriodicWebSocketListener<TReturnDataType, TStateType> : IWebSocketListener, IDisposable
where TStateType : class, new()
where TStateType : WebSocketListenerState, new()
where TReturnDataType : class
{
/// <summary>
@ -83,7 +83,15 @@ namespace MediaBrowser.Common.Net
}
protected readonly CultureInfo UsCulture = new CultureInfo("en-US");
protected virtual bool SendOnTimer
{
get
{
return true;
}
}
/// <summary>
/// Starts sending messages over a web socket
/// </summary>
@ -99,9 +107,15 @@ namespace MediaBrowser.Common.Net
Logger.Info("{1} Begin transmitting over websocket to {0}", message.Connection.RemoteEndPoint, GetType().Name);
var timer = new Timer(TimerCallback, message.Connection, Timeout.Infinite, Timeout.Infinite);
var timer = SendOnTimer ?
new Timer(TimerCallback, message.Connection, Timeout.Infinite, Timeout.Infinite) :
null;
var state = new TStateType();
var state = new TStateType
{
IntervalMs = periodMs,
InitialDelayMs = dueTimeMs
};
var semaphore = new SemaphoreSlim(1, 1);
@ -110,14 +124,17 @@ namespace MediaBrowser.Common.Net
ActiveConnections.Add(new Tuple<IWebSocketConnection, CancellationTokenSource, Timer, TStateType, SemaphoreSlim>(message.Connection, cancellationTokenSource, timer, state, semaphore));
}
timer.Change(TimeSpan.FromMilliseconds(dueTimeMs), TimeSpan.FromMilliseconds(periodMs));
if (timer != null)
{
timer.Change(TimeSpan.FromMilliseconds(dueTimeMs), TimeSpan.FromMilliseconds(periodMs));
}
}
/// <summary>
/// Timers the callback.
/// </summary>
/// <param name="state">The state.</param>
private async void TimerCallback(object state)
private void TimerCallback(object state)
{
var connection = (IWebSocketConnection)state;
@ -139,11 +156,50 @@ namespace MediaBrowser.Common.Net
return;
}
SendData(tuple);
}
protected void SendData(bool force)
{
List<Tuple<IWebSocketConnection, CancellationTokenSource, Timer, TStateType, SemaphoreSlim>> tuples;
lock (ActiveConnections)
{
tuples = ActiveConnections
.Where(c =>
{
if (c.Item1.State == WebSocketState.Open && !c.Item2.IsCancellationRequested)
{
var state = c.Item4;
if (force || (DateTime.UtcNow - state.DateLastSendUtc).TotalMilliseconds >= state.IntervalMs)
{
return true;
}
}
return false;
})
.ToList();
}
foreach (var tuple in tuples)
{
SendData(tuple);
}
}
private async void SendData(Tuple<IWebSocketConnection, CancellationTokenSource, Timer, TStateType, SemaphoreSlim> tuple)
{
var connection = tuple.Item1;
try
{
await tuple.Item5.WaitAsync(tuple.Item2.Token).ConfigureAwait(false);
var data = await GetDataToSend(tuple.Item4).ConfigureAwait(false);
var state = tuple.Item4;
var data = await GetDataToSend(state).ConfigureAwait(false);
if (data != null)
{
@ -153,6 +209,8 @@ namespace MediaBrowser.Common.Net
Data = data
}, tuple.Item2.Token).ConfigureAwait(false);
state.DateLastSendUtc = DateTime.UtcNow;
}
tuple.Item5.Release();
@ -196,13 +254,18 @@ namespace MediaBrowser.Common.Net
{
Logger.Info("{1} stop transmitting over websocket to {0}", connection.Item1.RemoteEndPoint, GetType().Name);
try
{
connection.Item3.Dispose();
}
catch (ObjectDisposedException)
var timer = connection.Item3;
if (timer != null)
{
try
{
timer.Dispose();
}
catch (ObjectDisposedException)
{
}
}
try
@ -212,7 +275,7 @@ namespace MediaBrowser.Common.Net
}
catch (ObjectDisposedException)
{
}
try
@ -223,7 +286,7 @@ namespace MediaBrowser.Common.Net
{
}
ActiveConnections.Remove(connection);
}
@ -253,4 +316,11 @@ namespace MediaBrowser.Common.Net
Dispose(true);
}
}
public class WebSocketListenerState
{
public DateTime DateLastSendUtc { get; set; }
public long InitialDelayMs { get; set; }
public long IntervalMs { get; set; }
}
}

@ -1,4 +1,5 @@
using MediaBrowser.Model.Tasks;
using MediaBrowser.Model.Events;
using MediaBrowser.Model.Tasks;
using System;
using System.Collections.Generic;
@ -9,6 +10,11 @@ namespace MediaBrowser.Common.ScheduledTasks
/// </summary>
public interface IScheduledTaskWorker : IDisposable
{
/// <summary>
/// Occurs when [task progress].
/// </summary>
event EventHandler<GenericEventArgs<double>> TaskProgress;
/// <summary>
/// Gets or sets the scheduled task.
/// </summary>

@ -1,5 +1,4 @@
using MediaBrowser.Model.Events;
using MediaBrowser.Model.Tasks;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
@ -50,7 +49,7 @@ namespace MediaBrowser.Common.ScheduledTasks
void Cancel(IScheduledTaskWorker task);
Task Execute(IScheduledTaskWorker task);
event EventHandler<EventArgs> TaskExecuting;
event EventHandler<GenericEventArgs<TaskResult>> TaskCompleted;
event EventHandler<GenericEventArgs<IScheduledTaskWorker>> TaskExecuting;
event EventHandler<TaskCompletionEventArgs> TaskCompleted;
}
}

@ -5,7 +5,7 @@ namespace MediaBrowser.Common.ScheduledTasks
{
public class TaskCompletionEventArgs : EventArgs
{
public IScheduledTask Task { get; set; }
public IScheduledTaskWorker Task { get; set; }
public TaskResult Result { get; set; }
}

@ -85,13 +85,7 @@
</ItemGroup>
<ItemGroup />
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
<ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition=" '$(ConfigurationName)' != 'Release Mono' " />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">

@ -23,6 +23,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.Dlna", "MediaB
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "MediaBrowser.MediaEncoding", "MediaBrowser.MediaEncoding\MediaBrowser.MediaEncoding.csproj", "{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OpenSubtitlesHandler", "OpenSubtitlesHandler\OpenSubtitlesHandler.csproj", "{4A4402D4-E910-443B-B8FC-2C18286A2CA0}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|x86 = Debug|x86
@ -33,8 +35,8 @@ Global
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Debug|x86.ActiveCfg = Debug|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Debug|x86.Build.0 = Debug|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Any CPU.ActiveCfg = Release|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Any CPU.Build.0 = Release|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release|Any CPU.Build.0 = Release|Any CPU
{0BD82FA6-EB8A-4452-8AF5-74F9C3849451}.Release|x86.ActiveCfg = Release|Any CPU
@ -71,6 +73,14 @@ Global
{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|Any CPU.Build.0 = Release|Any CPU
{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|x86.ActiveCfg = Release|Any CPU
{442B5058-DCAF-4263-BB6A-F21E31120A1B}.Release|x86.Build.0 = Release|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Debug|x86.ActiveCfg = Debug|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Debug|x86.Build.0 = Debug|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release Mono|Any CPU.Build.0 = Release Mono|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release|Any CPU.ActiveCfg = Release|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release|Any CPU.Build.0 = Release|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release|x86.ActiveCfg = Release|Any CPU
{4A4402D4-E910-443B-B8FC-2C18286A2CA0}.Release|x86.Build.0 = Release|Any CPU
{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Debug|x86.ActiveCfg = Debug|Any CPU
{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Debug|x86.Build.0 = Debug|Any CPU
{4FD51AC5-2C16-4308-A993-C3A84F3B4582}.Release Mono|Any CPU.ActiveCfg = Release Mono|Any CPU

@ -5,7 +5,7 @@
<File FileName="MediaBrowser.Server.Mono\app.config" Line="1" Column="1" />
<File FileName="MediaBrowser.ServerApplication\ApplicationHost.cs" Line="1" Column="1" />
<File FileName="MediaBrowser.Server.Mono\Native\NativeApp.cs" Line="1" Column="1" />
<File FileName="MediaBrowser.Server.Mono\Program.cs" Line="36" Column="37" />
<File FileName="MediaBrowser.Server.Mono\Program.cs" Line="24" Column="15" />
</Files>
</MonoDevelop.Ide.Workbench>
<MonoDevelop.Ide.DebuggingService.Breakpoints>

@ -6,6 +6,7 @@ using MediaBrowser.Common.Updates;
using MediaBrowser.Controller;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Notifications;
using MediaBrowser.Controller.Plugins;
@ -257,7 +258,7 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications
NotificationType = NotificationType.NewLibraryContent.ToString()
};
notification.Variables["Name"] = item.Name;
notification.Variables["Name"] = GetItemName(item);
await SendNotification(notification).ConfigureAwait(false);
}
@ -274,6 +275,31 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications
}
}
private string GetItemName(BaseItem item)
{
var name = item.Name;
var hasSeries = item as IHasSeries;
if (hasSeries != null)
{
name = hasSeries.SeriesName + " - " + name;
}
var hasArtist = item as IHasArtist;
if (hasArtist != null)
{
var artists = hasArtist.AllArtists;
if (artists.Count > 0)
{
name = hasArtist.AllArtists[0] + " - " + name;
}
}
return name;
}
async void _userManager_UserCreated(object sender, GenericEventArgs<User> e)
{
var notification = new NotificationRequest
@ -286,9 +312,9 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications
await SendNotification(notification).ConfigureAwait(false);
}
async void _taskManager_TaskCompleted(object sender, GenericEventArgs<TaskResult> e)
async void _taskManager_TaskCompleted(object sender, TaskCompletionEventArgs e)
{
var result = e.Argument;
var result = e.Result;
if (result.Status == TaskCompletionStatus.Failed)
{
@ -301,8 +327,8 @@ namespace MediaBrowser.Server.Implementations.EntryPoints.Notifications
NotificationType = type
};
notification.Variables["Name"] = e.Argument.Name;
notification.Variables["ErrorMessage"] = e.Argument.ErrorMessage;
notification.Variables["Name"] = result.Name;
notification.Variables["ErrorMessage"] = result.ErrorMessage;
await SendNotification(notification).ConfigureAwait(false);
}

@ -106,9 +106,9 @@ namespace MediaBrowser.Server.Implementations.EntryPoints
_serverManager.SendWebSocketMessage("PackageInstallationFailed", e.InstallationInfo);
}
void _taskManager_TaskCompleted(object sender, GenericEventArgs<TaskResult> e)
void _taskManager_TaskCompleted(object sender, TaskCompletionEventArgs e)
{
_serverManager.SendWebSocketMessage("ScheduledTaskEnded", e.Argument);
_serverManager.SendWebSocketMessage("ScheduledTaskEnded", e.Result);
}
/// <summary>

@ -191,10 +191,12 @@ namespace MediaBrowser.Server.Implementations.Persistence
throw new ArgumentNullException("displayPreferencesId");
}
var guidId = displayPreferencesId.GetMD5();
var cmd = _connection.CreateCommand();
cmd.CommandText = "select data from userdisplaypreferences where id = @id and userId=@userId and client=@client";
cmd.Parameters.Add(cmd, "@id", DbType.Guid).Value = displayPreferencesId.GetMD5();
cmd.Parameters.Add(cmd, "@id", DbType.Guid).Value = guidId;
cmd.Parameters.Add(cmd, "@userId", DbType.Guid).Value = userId;
cmd.Parameters.Add(cmd, "@client", DbType.String).Value = client;
@ -209,7 +211,10 @@ namespace MediaBrowser.Server.Implementations.Persistence
}
}
return null;
return new DisplayPreferences
{
Id = guidId.ToString("N")
};
}
/// <summary>

@ -282,7 +282,18 @@ namespace MediaBrowser.Server.Implementations.Session
if (!string.IsNullOrWhiteSpace(info.ItemId) && libraryItem != null)
{
info.Item = GetItemInfo(libraryItem, runtimeTicks, libraryItem, info.MediaSourceId);
var current = session.NowPlayingItem;
if (current == null || !string.Equals(current.Id, info.ItemId, StringComparison.OrdinalIgnoreCase))
{
info.Item = GetItemInfo(libraryItem, libraryItem, info.MediaSourceId);
}
else
{
info.Item = current;
}
info.Item.RunTimeTicks = runtimeTicks;
}
session.NowPlayingItem = info.Item;
@ -1182,12 +1193,11 @@ namespace MediaBrowser.Server.Implementations.Session
/// Converts a BaseItem to a BaseItemInfo
/// </summary>
/// <param name="item">The item.</param>
/// <param name="runtimeTicks">The now playing runtime ticks.</param>
/// <param name="chapterOwner">The chapter owner.</param>
/// <param name="mediaSourceId">The media source identifier.</param>
/// <returns>BaseItemInfo.</returns>
/// <exception cref="System.ArgumentNullException">item</exception>
private BaseItemInfo GetItemInfo(BaseItem item, long? runtimeTicks, BaseItem chapterOwner, string mediaSourceId)
private BaseItemInfo GetItemInfo(BaseItem item, BaseItem chapterOwner, string mediaSourceId)
{
if (item == null)
{
@ -1200,7 +1210,7 @@ namespace MediaBrowser.Server.Implementations.Session
Name = item.Name,
MediaType = item.MediaType,
Type = item.GetClientTypeName(),
RunTimeTicks = runtimeTicks,
RunTimeTicks = item.RunTimeTicks,
IndexNumber = item.IndexNumber,
ParentIndexNumber = item.ParentIndexNumber,
PremiereDate = item.PremiereDate,
@ -1376,7 +1386,7 @@ namespace MediaBrowser.Server.Implementations.Session
{
var item = _libraryManager.GetItemById(new Guid(itemId));
var info = GetItemInfo(item, item.RunTimeTicks, null, null);
var info = GetItemInfo(item, null, null);
ReportNowViewingItem(sessionId, info);
}

@ -51,5 +51,10 @@ namespace MediaBrowser.ServerApplication.Native
{
get { return false; }
}
public static void PreventSystemStandby()
{
}
}
}

@ -1,9 +1,9 @@
using MediaBrowser.Controller.Plugins;
using MediaBrowser.Controller.Session;
using MediaBrowser.Model.Logging;
using MediaBrowser.ServerApplication.Native;
using System;
using System.Linq;
using System.Runtime.InteropServices;
using System.Threading;
namespace MediaBrowser.ServerApplication.EntryPoints
@ -37,7 +37,7 @@ namespace MediaBrowser.ServerApplication.EntryPoints
{
try
{
SystemHelper.ResetStandbyTimer();
NativeApp.PreventSystemStandby();
}
catch (Exception ex)
{
@ -54,25 +54,4 @@ namespace MediaBrowser.ServerApplication.EntryPoints
}
}
}
internal enum EXECUTION_STATE : uint
{
ES_NONE = 0,
ES_SYSTEM_REQUIRED = 0x00000001,
ES_DISPLAY_REQUIRED = 0x00000002,
ES_USER_PRESENT = 0x00000004,
ES_AWAYMODE_REQUIRED = 0x00000040,
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);
}
}
}

@ -194,12 +194,12 @@ namespace MediaBrowser.ServerApplication.FFMpeg
var uname = new Uname();
#if __MonoCS__
Utsname uname;
var callResult = Syscall.uname(out uname);
Utsname utsname;
var callResult = Syscall.uname(out utsname);
if (callResult == 0)
{
uname.sysname= uname.sysname;
uname.machine= uname.machine;
uname.sysname= utsname.sysname;
uname.machine= utsname.machine;
}
#endif
return uname;

@ -1,4 +1,5 @@

using System.Runtime.InteropServices;
namespace MediaBrowser.ServerApplication.Native
{
/// <summary>
@ -57,5 +58,31 @@ namespace MediaBrowser.ServerApplication.Native
return MainStartup.CanSelfUpdate;
}
}
public static void PreventSystemStandby()
{
SystemHelper.ResetStandbyTimer();
}
internal enum EXECUTION_STATE : uint
{
ES_NONE = 0,
ES_SYSTEM_REQUIRED = 0x00000001,
ES_DISPLAY_REQUIRED = 0x00000002,
ES_USER_PRESENT = 0x00000004,
ES_AWAYMODE_REQUIRED = 0x00000040,
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);
}
}
}
}

@ -29,6 +29,11 @@
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release Mono|AnyCPU' ">
<Optimize>false</Optimize>
<OutputPath>bin\Release Mono</OutputPath>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
@ -113,6 +118,7 @@
<Content Include="XML-RPC\Docs\XML-RPC.txt" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition=" '$(ConfigurationName)' != 'Release Mono' " />
<!-- To modify your build process, add your task inside one of the targets below and uncomment it.
Other similar extension points exist, see Microsoft.Common.targets.
<Target Name="BeforeBuild">

Loading…
Cancel
Save