aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Controller
diff options
context:
space:
mode:
authorLuke <luke.pulverenti@gmail.com>2016-10-22 16:31:23 -0400
committerGitHub <noreply@github.com>2016-10-22 16:31:23 -0400
commit165b4c2fb8868045cd9dae3f00280e1c7b513acb (patch)
tree47a53e6922e3061c7228daa73fb21b72b1e2806e /MediaBrowser.Controller
parent3c1114228ba3b6a19cb73fa7f9aaa4e3ce3cab80 (diff)
parentce47beba842dc026483dc3649a1efb8c34b30662 (diff)
Merge pull request #2251 from MediaBrowser/dev
Dev
Diffstat (limited to 'MediaBrowser.Controller')
-rw-r--r--MediaBrowser.Controller/Entities/CollectionFolder.cs14
-rw-r--r--MediaBrowser.Controller/Entities/TV/Season.cs1
-rw-r--r--MediaBrowser.Controller/Entities/TV/Series.cs16
-rw-r--r--MediaBrowser.Controller/Entities/User.cs16
-rw-r--r--MediaBrowser.Controller/Entities/UserViewBuilder.cs175
-rw-r--r--MediaBrowser.Controller/Health/IHealthMonitor.cs12
-rw-r--r--MediaBrowser.Controller/Library/NameExtensions.cs2
-rw-r--r--MediaBrowser.Controller/MediaBrowser.Controller.csproj10
-rw-r--r--MediaBrowser.Controller/Threading/PeriodicTimer.cs72
-rw-r--r--MediaBrowser.Controller/packages.config1
10 files changed, 168 insertions, 151 deletions
diff --git a/MediaBrowser.Controller/Entities/CollectionFolder.cs b/MediaBrowser.Controller/Entities/CollectionFolder.cs
index 41e277b7c..414b2b2c3 100644
--- a/MediaBrowser.Controller/Entities/CollectionFolder.cs
+++ b/MediaBrowser.Controller/Entities/CollectionFolder.cs
@@ -11,8 +11,8 @@ using System.Threading.Tasks;
using CommonIO;
using MediaBrowser.Controller.Configuration;
using MediaBrowser.Model.Configuration;
+using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.Serialization;
-using MoreLinq;
namespace MediaBrowser.Controller.Entities
{
@@ -29,7 +29,7 @@ namespace MediaBrowser.Controller.Entities
PhysicalLocationsList = new List<string>();
}
- [IgnoreDataMember]
+ [System.Runtime.Serialization.IgnoreDataMember]
protected override bool SupportsShortcutChildren
{
get
@@ -38,7 +38,7 @@ namespace MediaBrowser.Controller.Entities
}
}
- [IgnoreDataMember]
+ [System.Runtime.Serialization.IgnoreDataMember]
public override bool SupportsPlayedStatus
{
get
@@ -129,7 +129,7 @@ namespace MediaBrowser.Controller.Entities
/// Allow different display preferences for each collection folder
/// </summary>
/// <value>The display prefs id.</value>
- [IgnoreDataMember]
+ [System.Runtime.Serialization.IgnoreDataMember]
public override Guid DisplayPreferencesId
{
get
@@ -138,7 +138,7 @@ namespace MediaBrowser.Controller.Entities
}
}
- [IgnoreDataMember]
+ [System.Runtime.Serialization.IgnoreDataMember]
public override IEnumerable<string> PhysicalLocations
{
get
@@ -283,7 +283,7 @@ namespace MediaBrowser.Controller.Entities
/// Our children are actually just references to the ones in the physical root...
/// </summary>
/// <value>The actual children.</value>
- [IgnoreDataMember]
+ [System.Runtime.Serialization.IgnoreDataMember]
protected override IEnumerable<BaseItem> ActualChildren
{
get { return GetActualChildren(); }
@@ -322,7 +322,7 @@ namespace MediaBrowser.Controller.Entities
return result;
}
- [IgnoreDataMember]
+ [System.Runtime.Serialization.IgnoreDataMember]
public override bool SupportsPeople
{
get
diff --git a/MediaBrowser.Controller/Entities/TV/Season.cs b/MediaBrowser.Controller/Entities/TV/Season.cs
index ce13f5fc5..fa713c5ca 100644
--- a/MediaBrowser.Controller/Entities/TV/Season.cs
+++ b/MediaBrowser.Controller/Entities/TV/Season.cs
@@ -2,7 +2,6 @@
using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Querying;
using MediaBrowser.Model.Users;
-using MoreLinq;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
diff --git a/MediaBrowser.Controller/Entities/TV/Series.cs b/MediaBrowser.Controller/Entities/TV/Series.cs
index 39703f67a..df464b52a 100644
--- a/MediaBrowser.Controller/Entities/TV/Series.cs
+++ b/MediaBrowser.Controller/Entities/TV/Series.cs
@@ -9,8 +9,8 @@ using System.Linq;
using System.Runtime.Serialization;
using System.Threading;
using System.Threading.Tasks;
+using MediaBrowser.Model.Extensions;
using MediaBrowser.Model.Providers;
-using MoreLinq;
namespace MediaBrowser.Controller.Entities.TV
{
@@ -106,6 +106,12 @@ namespace MediaBrowser.Controller.Entities.TV
private string AddLibrariesToPresentationUniqueKey(string key)
{
+ var lang = GetPreferredMetadataLanguage();
+ if (!string.IsNullOrWhiteSpace(lang))
+ {
+ key += "-" + lang;
+ }
+
var folders = LibraryManager.GetCollectionFolders(this)
.Select(i => i.Id.ToString("N"))
.ToArray();
@@ -209,8 +215,8 @@ namespace MediaBrowser.Controller.Entities.TV
var query = new InternalItemsQuery(user)
{
AncestorWithPresentationUniqueKey = seriesKey,
- IncludeItemTypes = new[] {typeof (Season).Name},
- SortBy = new[] {ItemSortBy.SortName}
+ IncludeItemTypes = new[] { typeof(Season).Name },
+ SortBy = new[] { ItemSortBy.SortName }
};
if (!config.DisplayMissingEpisodes && !config.DisplayUnairedEpisodes)
@@ -267,8 +273,8 @@ namespace MediaBrowser.Controller.Entities.TV
var query = new InternalItemsQuery(user)
{
AncestorWithPresentationUniqueKey = seriesKey,
- IncludeItemTypes = new[] {typeof (Episode).Name, typeof (Season).Name},
- SortBy = new[] {ItemSortBy.SortName}
+ IncludeItemTypes = new[] { typeof(Episode).Name, typeof(Season).Name },
+ SortBy = new[] { ItemSortBy.SortName }
};
var config = user.Configuration;
if (!config.DisplayMissingEpisodes && !config.DisplayUnairedEpisodes)
diff --git a/MediaBrowser.Controller/Entities/User.cs b/MediaBrowser.Controller/Entities/User.cs
index 46da469fa..00320e9b7 100644
--- a/MediaBrowser.Controller/Entities/User.cs
+++ b/MediaBrowser.Controller/Entities/User.cs
@@ -42,7 +42,7 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the path.
/// </summary>
/// <value>The path.</value>
- [IgnoreDataMember]
+ [System.Runtime.Serialization.IgnoreDataMember]
public override string Path
{
get
@@ -81,7 +81,7 @@ namespace MediaBrowser.Controller.Entities
/// If the item is a folder, it returns the folder itself
/// </summary>
/// <value>The containing folder path.</value>
- [IgnoreDataMember]
+ [System.Runtime.Serialization.IgnoreDataMember]
public override string ContainingFolderPath
{
get
@@ -94,7 +94,7 @@ namespace MediaBrowser.Controller.Entities
/// Gets a value indicating whether this instance is owned item.
/// </summary>
/// <value><c>true</c> if this instance is owned item; otherwise, <c>false</c>.</value>
- [IgnoreDataMember]
+ [System.Runtime.Serialization.IgnoreDataMember]
public override bool IsOwnedItem
{
get
@@ -107,7 +107,7 @@ namespace MediaBrowser.Controller.Entities
/// Gets the root folder.
/// </summary>
/// <value>The root folder.</value>
- [IgnoreDataMember]
+ [System.Runtime.Serialization.IgnoreDataMember]
public Folder RootFolder
{
get
@@ -129,7 +129,7 @@ namespace MediaBrowser.Controller.Entities
private volatile UserConfiguration _config;
private readonly object _configSyncLock = new object();
- [IgnoreDataMember]
+ [System.Runtime.Serialization.IgnoreDataMember]
public UserConfiguration Configuration
{
get
@@ -152,7 +152,7 @@ namespace MediaBrowser.Controller.Entities
private volatile UserPolicy _policy;
private readonly object _policySyncLock = new object();
- [IgnoreDataMember]
+ [System.Runtime.Serialization.IgnoreDataMember]
public UserPolicy Policy
{
get
@@ -232,7 +232,7 @@ namespace MediaBrowser.Controller.Entities
/// Gets the path to the user's configuration directory
/// </summary>
/// <value>The configuration directory path.</value>
- [IgnoreDataMember]
+ [System.Runtime.Serialization.IgnoreDataMember]
public string ConfigurationDirectoryPath
{
get
@@ -308,7 +308,7 @@ namespace MediaBrowser.Controller.Entities
return Configuration.GroupedFolders.Select(i => new Guid(i)).Contains(id);
}
- [IgnoreDataMember]
+ [System.Runtime.Serialization.IgnoreDataMember]
public override bool SupportsPeople
{
get
diff --git a/MediaBrowser.Controller/Entities/UserViewBuilder.cs b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
index 38397572e..9debdf9ba 100644
--- a/MediaBrowser.Controller/Entities/UserViewBuilder.cs
+++ b/MediaBrowser.Controller/Entities/UserViewBuilder.cs
@@ -17,7 +17,7 @@ using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using MediaBrowser.Controller.Configuration;
-using MoreLinq;
+using MediaBrowser.Model.Extensions;
namespace MediaBrowser.Controller.Entities
{
@@ -201,7 +201,7 @@ namespace MediaBrowser.Controller.Entities
return await GetMusicFolders(queryParent, user, query).ConfigureAwait(false);
case SpecialFolder.MusicGenres:
- return await GetMusicGenres(queryParent, user, query).ConfigureAwait(false);
+ return GetMusicGenres(queryParent, user, query);
case SpecialFolder.MusicGenre:
return await GetMusicGenreItems(queryParent, displayParent, user, query).ConfigureAwait(false);
@@ -290,32 +290,20 @@ namespace MediaBrowser.Controller.Entities
return GetResult(list, parent, query);
}
- private async Task<QueryResult<BaseItem>> GetMusicGenres(Folder parent, User user, InternalItemsQuery query)
+ private QueryResult<BaseItem> GetMusicGenres(Folder parent, User user, InternalItemsQuery query)
{
- var tasks = GetRecursiveChildren(parent, user, new[] { CollectionType.Music, CollectionType.MusicVideos })
- .Where(i => !i.IsFolder)
- .SelectMany(i => i.Genres)
- .DistinctNames()
- .Select(i =>
- {
- try
- {
- return _libraryManager.GetMusicGenre(i);
- }
- catch
- {
- // Full exception logged at lower levels
- _logger.Error("Error getting genre");
- return null;
- }
-
- })
- .Where(i => i != null)
- .Select(i => GetUserView(i.Name, SpecialFolder.MusicGenre, i.SortName, parent));
-
- var genres = await Task.WhenAll(tasks).ConfigureAwait(false);
+ var result = _libraryManager.GetMusicGenres(new InternalItemsQuery(user)
+ {
+ AncestorIds = new[] { parent.Id.ToString("N") },
+ StartIndex = query.StartIndex,
+ Limit = query.Limit
+ });
- return GetResult(genres, parent, query);
+ return new QueryResult<BaseItem>
+ {
+ TotalRecordCount = result.TotalRecordCount,
+ Items = result.Items.Select(i => i.Item1).ToArray()
+ };
}
private async Task<QueryResult<BaseItem>> GetMusicGenreItems(Folder queryParent, Folder displayParent, User user, InternalItemsQuery query)
@@ -332,50 +320,51 @@ namespace MediaBrowser.Controller.Entities
private QueryResult<BaseItem> GetMusicAlbumArtists(Folder parent, User user, InternalItemsQuery query)
{
- var items = parent.QueryRecursive(new InternalItemsQuery(user)
+ var artists = _libraryManager.GetAlbumArtists(new InternalItemsQuery(user)
{
- Recursive = true,
- ParentId = parent.Id,
- IncludeItemTypes = new[] { typeof(Audio.Audio).Name },
- EnableTotalRecordCount = false
-
- }).Items.Cast<IHasAlbumArtist>();
-
- var artists = _libraryManager.GetAlbumArtists(items);
+ AncestorIds = new[] { parent.Id.ToString("N") },
+ StartIndex = query.StartIndex,
+ Limit = query.Limit
+ });
- return GetResult(artists, parent, query);
+ return new QueryResult<BaseItem>
+ {
+ TotalRecordCount = artists.TotalRecordCount,
+ Items = artists.Items.Select(i => i.Item1).ToArray()
+ };
}
private QueryResult<BaseItem> GetMusicArtists(Folder parent, User user, InternalItemsQuery query)
{
- var items = parent.QueryRecursive(new InternalItemsQuery(user)
+ var artists = _libraryManager.GetArtists(new InternalItemsQuery(user)
{
- Recursive = true,
- ParentId = parent.Id,
- IncludeItemTypes = new[] { typeof(Audio.Audio).Name, typeof(MusicVideo).Name },
- EnableTotalRecordCount = false
-
- }).Items.Cast<IHasArtist>();
-
- var artists = _libraryManager.GetArtists(items);
+ AncestorIds = new[] { parent.Id.ToString("N") },
+ StartIndex = query.StartIndex,
+ Limit = query.Limit
+ });
- return GetResult(artists, parent, query);
+ return new QueryResult<BaseItem>
+ {
+ TotalRecordCount = artists.TotalRecordCount,
+ Items = artists.Items.Select(i => i.Item1).ToArray()
+ };
}
private QueryResult<BaseItem> GetFavoriteArtists(Folder parent, User user, InternalItemsQuery query)
{
- var items = parent.QueryRecursive(new InternalItemsQuery(user)
+ var artists = _libraryManager.GetArtists(new InternalItemsQuery(user)
{
- Recursive = true,
- ParentId = parent.Id,
- IncludeItemTypes = new[] { typeof(Audio.Audio).Name },
- EnableTotalRecordCount = false
-
- }).Items.Cast<IHasAlbumArtist>();
-
- var artists = _libraryManager.GetAlbumArtists(items).Where(i => _userDataManager.GetUserData(user, i).IsFavorite);
+ AncestorIds = new[] { parent.Id.ToString("N") },
+ StartIndex = query.StartIndex,
+ Limit = query.Limit,
+ IsFavorite = true
+ });
- return GetResult(artists, parent, query);
+ return new QueryResult<BaseItem>
+ {
+ TotalRecordCount = artists.TotalRecordCount,
+ Items = artists.Items.Select(i => i.Item1).ToArray()
+ };
}
private QueryResult<BaseItem> GetMusicPlaylists(Folder parent, User user, InternalItemsQuery query)
@@ -577,35 +566,18 @@ namespace MediaBrowser.Controller.Entities
private async Task<QueryResult<BaseItem>> GetMovieGenres(Folder parent, User user, InternalItemsQuery query)
{
- var tasks = parent.QueryRecursive(new InternalItemsQuery(user)
+ var result = _libraryManager.GetGenres(new InternalItemsQuery(user)
{
- IncludeItemTypes = new[] { typeof(Movie).Name },
- Recursive = true,
- EnableTotalRecordCount = false
-
- }).Items
- .SelectMany(i => i.Genres)
- .DistinctNames()
- .Select(i =>
- {
- try
- {
- return _libraryManager.GetGenre(i);
- }
- catch
- {
- // Full exception logged at lower levels
- _logger.Error("Error getting genre");
- return null;
- }
-
- })
- .Where(i => i != null)
- .Select(i => GetUserView(i.Name, SpecialFolder.MovieGenre, i.SortName, parent));
-
- var genres = await Task.WhenAll(tasks).ConfigureAwait(false);
+ AncestorIds = new[] { parent.Id.ToString("N") },
+ StartIndex = query.StartIndex,
+ Limit = query.Limit
+ });
- return GetResult(genres, parent, query);
+ return new QueryResult<BaseItem>
+ {
+ TotalRecordCount = result.TotalRecordCount,
+ Items = result.Items.Select(i => i.Item1).ToArray()
+ };
}
private async Task<QueryResult<BaseItem>> GetMovieGenreItems(Folder queryParent, Folder displayParent, User user, InternalItemsQuery query)
@@ -720,35 +692,18 @@ namespace MediaBrowser.Controller.Entities
private async Task<QueryResult<BaseItem>> GetTvGenres(Folder parent, User user, InternalItemsQuery query)
{
- var tasks = parent.QueryRecursive(new InternalItemsQuery(user)
+ var result = _libraryManager.GetGenres(new InternalItemsQuery(user)
{
- IncludeItemTypes = new[] { typeof(Series).Name },
- Recursive = true,
- EnableTotalRecordCount = false
-
- }).Items
- .SelectMany(i => i.Genres)
- .DistinctNames()
- .Select(i =>
- {
- try
- {
- return _libraryManager.GetGenre(i);
- }
- catch
- {
- // Full exception logged at lower levels
- _logger.Error("Error getting genre");
- return null;
- }
-
- })
- .Where(i => i != null)
- .Select(i => GetUserView(i.Name, SpecialFolder.TvGenre, i.SortName, parent));
-
- var genres = await Task.WhenAll(tasks).ConfigureAwait(false);
+ AncestorIds = new[] { parent.Id.ToString("N") },
+ StartIndex = query.StartIndex,
+ Limit = query.Limit
+ });
- return GetResult(genres, parent, query);
+ return new QueryResult<BaseItem>
+ {
+ TotalRecordCount = result.TotalRecordCount,
+ Items = result.Items.Select(i => i.Item1).ToArray()
+ };
}
private QueryResult<BaseItem> GetTvGenreItems(Folder queryParent, Folder displayParent, User user, InternalItemsQuery query)
diff --git a/MediaBrowser.Controller/Health/IHealthMonitor.cs b/MediaBrowser.Controller/Health/IHealthMonitor.cs
deleted file mode 100644
index b8ad98fc1..000000000
--- a/MediaBrowser.Controller/Health/IHealthMonitor.cs
+++ /dev/null
@@ -1,12 +0,0 @@
-using System.Collections.Generic;
-using System.Threading;
-using System.Threading.Tasks;
-using MediaBrowser.Model.Notifications;
-
-namespace MediaBrowser.Controller.Health
-{
- public interface IHealthMonitor
- {
- Task<List<Notification>> GetNotifications(CancellationToken cancellationToken);
- }
-}
diff --git a/MediaBrowser.Controller/Library/NameExtensions.cs b/MediaBrowser.Controller/Library/NameExtensions.cs
index 72f036b0a..19d0fc772 100644
--- a/MediaBrowser.Controller/Library/NameExtensions.cs
+++ b/MediaBrowser.Controller/Library/NameExtensions.cs
@@ -1,9 +1,9 @@
using MediaBrowser.Common.Extensions;
-using MoreLinq;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
+using MediaBrowser.Model.Extensions;
namespace MediaBrowser.Controller.Library
{
diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
index 36d59d3e4..c14e25030 100644
--- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj
+++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<Project ToolsVersion="4.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
@@ -11,9 +11,10 @@
<AssemblyName>MediaBrowser.Controller</AssemblyName>
<FileAlignment>512</FileAlignment>
<SolutionDir Condition="$(SolutionDir) == '' Or $(SolutionDir) == '*Undefined*'">..\</SolutionDir>
- <TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
+ <TargetFrameworkVersion>v4.6</TargetFrameworkVersion>
<ReleaseVersion>
</ReleaseVersion>
+ <TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<DebugSymbols>true</DebugSymbols>
@@ -51,9 +52,6 @@
<Reference Include="Interfaces.IO">
<HintPath>..\packages\Interfaces.IO.1.0.0.5\lib\portable-net45+sl4+wp71+win8+wpa81\Interfaces.IO.dll</HintPath>
</Reference>
- <Reference Include="MoreLinq">
- <HintPath>..\packages\morelinq.1.4.0\lib\net35\MoreLinq.dll</HintPath>
- </Reference>
<Reference Include="Patterns.Logging">
<HintPath>..\packages\Patterns.Logging.1.0.0.2\lib\portable-net45+sl4+wp71+win8+wpa81\Patterns.Logging.dll</HintPath>
</Reference>
@@ -168,7 +166,6 @@
<Compile Include="Entities\UserView.cs" />
<Compile Include="Entities\UserViewBuilder.cs" />
<Compile Include="FileOrganization\IFileOrganizationService.cs" />
- <Compile Include="Health\IHealthMonitor.cs" />
<Compile Include="IO\ThrottledStream.cs" />
<Compile Include="Library\DeleteOptions.cs" />
<Compile Include="Library\ILibraryPostScanTask.cs" />
@@ -391,6 +388,7 @@
<Compile Include="Sync\ISyncRepository.cs" />
<Compile Include="Sync\SyncedFileInfo.cs" />
<Compile Include="Sync\SyncedItemProgress.cs" />
+ <Compile Include="Threading\PeriodicTimer.cs" />
<Compile Include="TV\ITVSeriesManager.cs" />
</ItemGroup>
<ItemGroup>
diff --git a/MediaBrowser.Controller/Threading/PeriodicTimer.cs b/MediaBrowser.Controller/Threading/PeriodicTimer.cs
new file mode 100644
index 000000000..f9d19b9a1
--- /dev/null
+++ b/MediaBrowser.Controller/Threading/PeriodicTimer.cs
@@ -0,0 +1,72 @@
+using System;
+using System.Threading;
+using Microsoft.Win32;
+
+namespace MediaBrowser.Controller.Threading
+{
+ public class PeriodicTimer : IDisposable
+ {
+ public Action<object> Callback { get; set; }
+ private Timer _timer;
+ private readonly object _state;
+ private readonly object _timerLock = new object();
+ private readonly TimeSpan _period;
+
+ public PeriodicTimer(Action<object> callback, object state, TimeSpan dueTime, TimeSpan period)
+ {
+ if (callback == null)
+ {
+ throw new ArgumentNullException("callback");
+ }
+
+ Callback = callback;
+ _period = period;
+ _state = state;
+
+ StartTimer(dueTime);
+ }
+
+ void SystemEvents_PowerModeChanged(object sender, PowerModeChangedEventArgs e)
+ {
+ if (e.Mode == PowerModes.Resume)
+ {
+ DisposeTimer();
+ StartTimer(Timeout.InfiniteTimeSpan);
+ }
+ }
+
+ private void TimerCallback(object state)
+ {
+ Callback(state);
+ }
+
+ private void StartTimer(TimeSpan dueTime)
+ {
+ lock (_timerLock)
+ {
+ _timer = new Timer(TimerCallback, _state, dueTime, _period);
+
+ SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;
+ }
+ }
+
+ private void DisposeTimer()
+ {
+ SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged;
+
+ lock (_timerLock)
+ {
+ if (_timer != null)
+ {
+ _timer.Dispose();
+ _timer = null;
+ }
+ }
+ }
+
+ public void Dispose()
+ {
+ DisposeTimer();
+ }
+ }
+}
diff --git a/MediaBrowser.Controller/packages.config b/MediaBrowser.Controller/packages.config
index 84422d9da..08345d1c5 100644
--- a/MediaBrowser.Controller/packages.config
+++ b/MediaBrowser.Controller/packages.config
@@ -2,6 +2,5 @@
<packages>
<package id="CommonIO" version="1.0.0.9" targetFramework="net45" />
<package id="Interfaces.IO" version="1.0.0.5" targetFramework="net45" />
- <package id="morelinq" version="1.4.0" targetFramework="net45" />
<package id="Patterns.Logging" version="1.0.0.2" targetFramework="net45" />
</packages> \ No newline at end of file