diff --git a/MediaBrowser.Api/UserLibrary/ItemsService.cs b/MediaBrowser.Api/UserLibrary/ItemsService.cs
index cae74cc2f..d6f348836 100644
--- a/MediaBrowser.Api/UserLibrary/ItemsService.cs
+++ b/MediaBrowser.Api/UserLibrary/ItemsService.cs
@@ -1,4 +1,5 @@
using System.Globalization;
+using System.IO;
using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
@@ -6,6 +7,7 @@ using MediaBrowser.Controller.Entities.Movies;
using MediaBrowser.Controller.Entities.TV;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Localization;
+using MediaBrowser.Controller.Providers;
using MediaBrowser.Model.Entities;
using MediaBrowser.Model.Querying;
using ServiceStack.ServiceHost;
@@ -212,6 +214,21 @@ namespace MediaBrowser.Api.UserLibrary
[ApiMember(Name = "MaxPremiereDate", Description = "Optional. The maximum premiere date. Format = yyyyMMddHHmmss", IsRequired = false, DataType = "string", ParameterType = "query", Verb = "POST")]
public string MaxPremiereDate { get; set; }
+
+ [ApiMember(Name = "HasOverview", Description = "Optional filter by items that have an overview or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
+ public bool? HasOverview { get; set; }
+
+ [ApiMember(Name = "HasImdbId", Description = "Optional filter by items that have an imdb id or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
+ public bool? HasImdbId { get; set; }
+
+ [ApiMember(Name = "HasTmdbId", Description = "Optional filter by items that have a tmdb id or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
+ public bool? HasTmdbId { get; set; }
+
+ [ApiMember(Name = "HasTvdbId", Description = "Optional filter by items that have a tvdb id or not.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
+ public bool? HasTvdbId { get; set; }
+
+ [ApiMember(Name = "IsYearMismatched", Description = "Optional filter by items that are potentially misidentified.", IsRequired = false, DataType = "bool", ParameterType = "query", Verb = "GET")]
+ public bool? IsYearMismatched { get; set; }
}
///
@@ -1029,9 +1046,92 @@ namespace MediaBrowser.Api.UserLibrary
items = items.Where(i => i.PremiereDate.HasValue && i.PremiereDate.Value <= date);
}
+ if (request.HasOverview.HasValue)
+ {
+ var filterValue = request.HasOverview.Value;
+
+ items = items.Where(i =>
+ {
+ var hasValue = !string.IsNullOrEmpty(i.Overview);
+
+ return hasValue == filterValue;
+ });
+ }
+
+ if (request.HasImdbId.HasValue)
+ {
+ var filterValue = request.HasImdbId.Value;
+
+ items = items.Where(i =>
+ {
+ var hasValue = !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Imdb));
+
+ return hasValue == filterValue;
+ });
+ }
+
+ if (request.HasTmdbId.HasValue)
+ {
+ var filterValue = request.HasTmdbId.Value;
+
+ items = items.Where(i =>
+ {
+ var hasValue = !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Tmdb));
+
+ return hasValue == filterValue;
+ });
+ }
+
+ if (request.HasTvdbId.HasValue)
+ {
+ var filterValue = request.HasTvdbId.Value;
+
+ items = items.Where(i =>
+ {
+ var hasValue = !string.IsNullOrEmpty(i.GetProviderId(MetadataProviders.Tvdb));
+
+ return hasValue == filterValue;
+ });
+ }
+
+ if (request.IsYearMismatched.HasValue)
+ {
+ var filterValue = request.IsYearMismatched.Value;
+
+ items = items.Where(i => IsYearMismatched(i) == filterValue);
+ }
+
return items;
}
+ private bool IsYearMismatched(BaseItem item)
+ {
+ if (item.ProductionYear.HasValue)
+ {
+ var path = item.Path;
+
+ if (!string.IsNullOrEmpty(path))
+ {
+ int? yearInName;
+ string name;
+ NameParser.ParseName(Path.GetFileName(path), out name, out yearInName);
+
+ // Go up a level if we didn't get a year
+ if (!yearInName.HasValue)
+ {
+ NameParser.ParseName(Path.GetFileName(Path.GetDirectoryName(path)), out name, out yearInName);
+ }
+
+ if (yearInName.HasValue)
+ {
+ return yearInName.Value != item.ProductionYear.Value;
+ }
+ }
+ }
+
+ return false;
+ }
+
///
/// Determines whether the specified item has image.
///
diff --git a/MediaBrowser.Controller/Entities/BaseItem.cs b/MediaBrowser.Controller/Entities/BaseItem.cs
index d88282429..25da18fca 100644
--- a/MediaBrowser.Controller/Entities/BaseItem.cs
+++ b/MediaBrowser.Controller/Entities/BaseItem.cs
@@ -138,6 +138,7 @@ namespace MediaBrowser.Controller.Entities
/// Gets or sets the type of the location.
///
/// The type of the location.
+ [IgnoreDataMember]
public virtual LocationType LocationType
{
get
diff --git a/MediaBrowser.Controller/Entities/Video.cs b/MediaBrowser.Controller/Entities/Video.cs
index ef768f628..9b02571b0 100644
--- a/MediaBrowser.Controller/Entities/Video.cs
+++ b/MediaBrowser.Controller/Entities/Video.cs
@@ -262,7 +262,10 @@ namespace MediaBrowser.Controller.Entities
{
if (!IsInMixedFolder)
{
- return new[] { System.IO.Path.GetDirectoryName(Path) };
+ if (VideoType == VideoType.VideoFile || VideoType == VideoType.Iso)
+ {
+ return new[] { System.IO.Path.GetDirectoryName(Path) };
+ }
}
return base.GetDeletePaths();
diff --git a/MediaBrowser.Controller/MediaBrowser.Controller.csproj b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
index a309d815c..9b89b12c5 100644
--- a/MediaBrowser.Controller/MediaBrowser.Controller.csproj
+++ b/MediaBrowser.Controller/MediaBrowser.Controller.csproj
@@ -117,6 +117,7 @@
+
diff --git a/MediaBrowser.Controller/Providers/NameParser.cs b/MediaBrowser.Controller/Providers/NameParser.cs
new file mode 100644
index 000000000..726f0e60e
--- /dev/null
+++ b/MediaBrowser.Controller/Providers/NameParser.cs
@@ -0,0 +1,39 @@
+using System;
+using System.Text.RegularExpressions;
+
+namespace MediaBrowser.Controller.Providers
+{
+ public static class NameParser
+ {
+ static readonly Regex[] NameMatches = new[] {
+ new Regex(@"(?.*)\((?\d{4})\)"), // matches "My Movie (2001)" and gives us the name and the year
+ new Regex(@"(?.*)(\.(?\d{4})(\.|$)).*$"),
+ new Regex(@"(?.*)") // last resort matches the whole string as the name
+ };
+
+
+ ///
+ /// Parses the name.
+ ///
+ /// The name.
+ /// Name of the just.
+ /// The year.
+ public static void ParseName(string name, out string justName, out int? year)
+ {
+ justName = null;
+ year = null;
+ foreach (var re in NameMatches)
+ {
+ Match m = re.Match(name);
+ if (m.Success)
+ {
+ justName = m.Groups["name"].Value.Trim();
+ string y = m.Groups["year"] != null ? m.Groups["year"].Value : null;
+ int temp;
+ year = Int32.TryParse(y, out temp) ? temp : (int?)null;
+ break;
+ }
+ }
+ }
+ }
+}
diff --git a/MediaBrowser.Mono.userprefs b/MediaBrowser.Mono.userprefs
index f1260b1da..4a91e2e60 100644
--- a/MediaBrowser.Mono.userprefs
+++ b/MediaBrowser.Mono.userprefs
@@ -1,10 +1,14 @@
-
+
-
-
-
+
+
+
+
+
+
+
@@ -16,10 +20,13 @@
-
+
+
+
+
+
-
-
+
diff --git a/MediaBrowser.Providers/Movies/MovieDbProvider.cs b/MediaBrowser.Providers/Movies/MovieDbProvider.cs
index fe409c090..e4fe2a914 100644
--- a/MediaBrowser.Providers/Movies/MovieDbProvider.cs
+++ b/MediaBrowser.Providers/Movies/MovieDbProvider.cs
@@ -15,7 +15,6 @@ using System.Globalization;
using System.IO;
using System.Linq;
using System.Net;
-using System.Text.RegularExpressions;
using System.Threading;
using System.Threading.Tasks;
@@ -190,12 +189,6 @@ namespace MediaBrowser.Providers.Movies
internal static string ApiKey = "f6bd687ffa63cd282b6ff2c6877f2669";
internal static string AcceptHeader = "application/json,image/*";
- static readonly Regex[] NameMatches = new[] {
- new Regex(@"(?.*)\((?\d{4})\)"), // matches "My Movie (2001)" and gives us the name and the year
- new Regex(@"(?.*)(\.(?\d{4})(\.|$)).*$"),
- new Regex(@"(?.*)") // last resort matches the whole string as the name
- };
-
protected override bool NeedsRefreshInternal(BaseItem item, BaseProviderInfo providerInfo)
{
if (string.IsNullOrEmpty(item.GetProviderId(MetadataProviders.Tmdb)))
@@ -309,30 +302,6 @@ namespace MediaBrowser.Providers.Movies
return false;
}
- ///
- /// Parses the name.
- ///
- /// The name.
- /// Name of the just.
- /// The year.
- public static void ParseName(string name, out string justName, out int? year)
- {
- justName = null;
- year = null;
- foreach (var re in NameMatches)
- {
- Match m = re.Match(name);
- if (m.Success)
- {
- justName = m.Groups["name"].Value.Trim();
- string y = m.Groups["year"] != null ? m.Groups["year"].Value : null;
- int temp;
- year = Int32.TryParse(y, out temp) ? temp : (int?)null;
- break;
- }
- }
- }
-
///
/// Finds the id.
///
@@ -343,7 +312,7 @@ namespace MediaBrowser.Providers.Movies
{
int? yearInName;
string name = item.Name;
- ParseName(name, out name, out yearInName);
+ NameParser.ParseName(name, out name, out yearInName);
var year = item.ProductionYear ?? yearInName;
diff --git a/MediaBrowser.Providers/Movies/OpenMovieDatabaseProvider.cs b/MediaBrowser.Providers/Movies/OpenMovieDatabaseProvider.cs
index 6550396e5..d881859c6 100644
--- a/MediaBrowser.Providers/Movies/OpenMovieDatabaseProvider.cs
+++ b/MediaBrowser.Providers/Movies/OpenMovieDatabaseProvider.cs
@@ -109,19 +109,11 @@ namespace MediaBrowser.Providers.Movies
public override async Task FetchAsync(BaseItem item, bool force, CancellationToken cancellationToken)
{
- BaseProviderInfo data;
-
- if (!item.ProviderData.TryGetValue(Id, out data))
- {
- data = new BaseProviderInfo();
- item.ProviderData[Id] = data;
- }
-
var imdbId = item.GetProviderId(MetadataProviders.Imdb);
if (string.IsNullOrEmpty(imdbId))
{
- data.LastRefreshStatus = ProviderRefreshStatus.Success;
+ SetLastRefreshed(item, DateTime.UtcNow);
return true;
}
@@ -182,9 +174,7 @@ namespace MediaBrowser.Providers.Movies
ParseAdditionalMetadata(item, result);
}
- data.LastRefreshStatus = ProviderRefreshStatus.Success;
SetLastRefreshed(item, DateTime.UtcNow);
-
return true;
}
diff --git a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
index 2d32811d3..3bfbdea3e 100644
--- a/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
+++ b/MediaBrowser.Server.Implementations/MediaBrowser.Server.Implementations.csproj
@@ -41,6 +41,9 @@
False
..\packages\MediaBrowser.BdInfo.1.0.0.5\lib\net20\BDInfo.dll
+
+ ..\packages\ServiceStack.OrmLite.Sqlite.Mono.3.9.70\lib\net35\Mono.Data.Sqlite.dll
+
False
..\packages\ServiceStack.3.9.70\lib\net35\ServiceStack.dll
@@ -57,6 +60,13 @@
False
..\packages\ServiceStack.Common.3.9.70\lib\net35\ServiceStack.Interfaces.dll
+
+ False
+ ..\packages\ServiceStack.OrmLite.Sqlite.Mono.3.9.70\lib\net35\ServiceStack.OrmLite.dll
+
+
+ ..\packages\ServiceStack.OrmLite.Sqlite.Mono.3.9.70\lib\net35\ServiceStack.OrmLite.Sqlite.dll
+
False
..\packages\ServiceStack.3.9.70\lib\net35\ServiceStack.ServiceInterface.dll
@@ -262,6 +272,7 @@
+
PreserveNewest
diff --git a/MediaBrowser.Server.Implementations/packages.config b/MediaBrowser.Server.Implementations/packages.config
index d5abe58ca..488dbc1ae 100644
--- a/MediaBrowser.Server.Implementations/packages.config
+++ b/MediaBrowser.Server.Implementations/packages.config
@@ -9,6 +9,7 @@
+
diff --git a/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj b/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
index 900169c70..e32dad8d7 100644
--- a/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
+++ b/MediaBrowser.Server.Mono/MediaBrowser.Server.Mono.csproj
@@ -44,13 +44,13 @@
+
- ..\packages\ServiceStack.Common.3.9.62\lib\net35\ServiceStack.Common.dll
+ ..\packages\ServiceStack.Common.3.9.70\lib\net35\ServiceStack.Common.dll
- ..\packages\ServiceStack.Common.3.9.62\lib\net35\ServiceStack.Interfaces.dll
+ ..\packages\ServiceStack.Common.3.9.70\lib\net35\ServiceStack.Interfaces.dll
-
@@ -82,7 +82,6 @@
-
FFMpeg\FFMpegDownloader.cs
diff --git a/MediaBrowser.Server.Mono/Native/HttpClientFactory.cs b/MediaBrowser.Server.Mono/Native/HttpClientFactory.cs
deleted file mode 100644
index 0fceab060..000000000
--- a/MediaBrowser.Server.Mono/Native/HttpClientFactory.cs
+++ /dev/null
@@ -1,24 +0,0 @@
-using System;
-using System.Net.Http;
-
-namespace MediaBrowser.ServerApplication.Native
-{
- ///
- /// Class HttpClientFactory
- ///
- public static class HttpClientFactory
- {
- ///
- /// Gets the HTTP client.
- ///
- /// if set to true [enable HTTP compression].
- /// HttpClient.
- public static HttpClient GetHttpClient(bool enableHttpCompression)
- {
- return new HttpClient()
- {
- Timeout = TimeSpan.FromSeconds(20)
- };
- }
- }
-}
diff --git a/MediaBrowser.Tests/Providers/MovieDbProviderTests.cs b/MediaBrowser.Tests/Providers/MovieDbProviderTests.cs
index f7a87c9d4..8f5dcc034 100644
--- a/MediaBrowser.Tests/Providers/MovieDbProviderTests.cs
+++ b/MediaBrowser.Tests/Providers/MovieDbProviderTests.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Providers.Movies;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Providers.Movies;
using Microsoft.VisualStudio.TestTools.UnitTesting;
namespace MediaBrowser.Tests.Providers {
@@ -8,27 +9,27 @@ namespace MediaBrowser.Tests.Providers {
public void TestNameMatches() {
var name = string.Empty;
int? year = null;
- MovieDbProvider.ParseName("My Movie (2013)", out name, out year);
+ NameParser.ParseName("My Movie (2013)", out name, out year);
Assert.AreEqual("My Movie", name);
Assert.AreEqual(2013, year);
name = string.Empty;
year = null;
- MovieDbProvider.ParseName("My Movie 2 (2013)", out name, out year);
+ NameParser.ParseName("My Movie 2 (2013)", out name, out year);
Assert.AreEqual("My Movie 2", name);
Assert.AreEqual(2013, year);
name = string.Empty;
year = null;
- MovieDbProvider.ParseName("My Movie 2001 (2013)", out name, out year);
+ NameParser.ParseName("My Movie 2001 (2013)", out name, out year);
Assert.AreEqual("My Movie 2001", name);
Assert.AreEqual(2013, year);
name = string.Empty;
year = null;
- MovieDbProvider.ParseName("My Movie - 2 (2013)", out name, out year);
+ NameParser.ParseName("My Movie - 2 (2013)", out name, out year);
Assert.AreEqual("My Movie - 2", name);
Assert.AreEqual(2013, year);
name = string.Empty;
year = null;
- MovieDbProvider.ParseName("curse.of.chucky.2013.stv.unrated.multi.1080p.bluray.x264-rough", out name, out year);
+ NameParser.ParseName("curse.of.chucky.2013.stv.unrated.multi.1080p.bluray.x264-rough", out name, out year);
Assert.AreEqual("curse.of.chucky", name);
Assert.AreEqual(2013, year);
}