2013-02-21 01:33:05 +00:00
|
|
|
|
using MediaBrowser.Common.Extensions;
|
2013-03-04 05:43:06 +00:00
|
|
|
|
using MediaBrowser.Controller;
|
2013-02-21 01:33:05 +00:00
|
|
|
|
using MediaBrowser.Controller.Entities;
|
|
|
|
|
using MediaBrowser.Controller.Entities.Movies;
|
|
|
|
|
using MediaBrowser.Controller.Library;
|
2013-03-03 16:53:58 +00:00
|
|
|
|
using MediaBrowser.Controller.Resolvers;
|
2013-02-21 01:33:05 +00:00
|
|
|
|
using MediaBrowser.Model.Entities;
|
|
|
|
|
using System;
|
|
|
|
|
using System.Collections.Generic;
|
|
|
|
|
using System.IO;
|
2013-06-12 21:46:50 +00:00
|
|
|
|
using System.Linq;
|
2013-02-21 01:33:05 +00:00
|
|
|
|
|
2013-03-03 06:58:04 +00:00
|
|
|
|
namespace MediaBrowser.Server.Implementations.Library.Resolvers.Movies
|
2013-02-21 01:33:05 +00:00
|
|
|
|
{
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Class MovieResolver
|
|
|
|
|
/// </summary>
|
2013-05-28 01:59:26 +00:00
|
|
|
|
public class MovieResolver : BaseVideoResolver<Video>
|
2013-02-21 01:33:05 +00:00
|
|
|
|
{
|
2013-03-04 05:43:06 +00:00
|
|
|
|
private IServerApplicationPaths ApplicationPaths { get; set; }
|
2013-06-12 21:46:50 +00:00
|
|
|
|
|
2013-03-04 05:43:06 +00:00
|
|
|
|
public MovieResolver(IServerApplicationPaths appPaths)
|
|
|
|
|
{
|
|
|
|
|
ApplicationPaths = appPaths;
|
|
|
|
|
}
|
|
|
|
|
|
2013-02-21 01:33:05 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets the priority.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <value>The priority.</value>
|
|
|
|
|
public override ResolverPriority Priority
|
|
|
|
|
{
|
|
|
|
|
get
|
|
|
|
|
{
|
|
|
|
|
// Give plugins a chance to catch iso's first
|
|
|
|
|
// Also since we have to loop through child files looking for videos,
|
|
|
|
|
// see if we can avoid some of that by letting other resolvers claim folders first
|
|
|
|
|
return ResolverPriority.Second;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Resolves the specified args.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="args">The args.</param>
|
2013-05-28 01:59:26 +00:00
|
|
|
|
/// <returns>Video.</returns>
|
|
|
|
|
protected override Video Resolve(ItemResolveArgs args)
|
2013-02-21 01:33:05 +00:00
|
|
|
|
{
|
2013-05-28 01:59:26 +00:00
|
|
|
|
// Must be a directory
|
2013-02-21 01:33:05 +00:00
|
|
|
|
if (args.IsDirectory)
|
|
|
|
|
{
|
|
|
|
|
// Avoid expensive tests against VF's and all their children by not allowing this
|
|
|
|
|
if (args.Parent == null || args.Parent.IsRoot)
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// If the parent is not a boxset, the only other allowed parent type is Folder
|
|
|
|
|
if (!(args.Parent is BoxSet))
|
|
|
|
|
{
|
|
|
|
|
if (args.Parent.GetType() != typeof(Folder))
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Optimization to avoid running all these tests against Top folders
|
|
|
|
|
if (args.Parent != null && args.Parent.IsRoot)
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
2013-05-28 01:59:26 +00:00
|
|
|
|
// Since the looping is expensive, this is an optimization to help us avoid it
|
|
|
|
|
if (args.ContainsMetaFileByName("series.xml") || args.Path.IndexOf("[tvdbid", StringComparison.OrdinalIgnoreCase) != -1)
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (args.Path.IndexOf("[trailers]", StringComparison.OrdinalIgnoreCase) != -1)
|
|
|
|
|
{
|
|
|
|
|
return FindMovie<Trailer>(args);
|
|
|
|
|
}
|
|
|
|
|
if (args.Path.IndexOf("[musicvideos]", StringComparison.OrdinalIgnoreCase) != -1)
|
|
|
|
|
{
|
|
|
|
|
return FindMovie<MusicVideo>(args);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return FindMovie<Movie>(args);
|
2013-02-21 01:33:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Sets the initial item values.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="item">The item.</param>
|
|
|
|
|
/// <param name="args">The args.</param>
|
2013-05-28 01:59:26 +00:00
|
|
|
|
protected override void SetInitialItemValues(Video item, ItemResolveArgs args)
|
2013-02-21 01:33:05 +00:00
|
|
|
|
{
|
|
|
|
|
base.SetInitialItemValues(item, args);
|
|
|
|
|
|
|
|
|
|
SetProviderIdFromPath(item);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Sets the provider id from path.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="item">The item.</param>
|
2013-05-28 01:59:26 +00:00
|
|
|
|
private void SetProviderIdFromPath(Video item)
|
2013-02-21 01:33:05 +00:00
|
|
|
|
{
|
|
|
|
|
//we need to only look at the name of this actual item (not parents)
|
2013-03-03 06:58:04 +00:00
|
|
|
|
var justName = Path.GetFileName(item.Path);
|
2013-02-21 01:33:05 +00:00
|
|
|
|
|
|
|
|
|
var id = justName.GetAttributeValue("tmdbid");
|
|
|
|
|
|
|
|
|
|
if (!string.IsNullOrEmpty(id))
|
|
|
|
|
{
|
|
|
|
|
item.SetProviderId(MetadataProviders.Tmdb, id);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Finds a movie based on a child file system entries
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="args">The args.</param>
|
|
|
|
|
/// <returns>Movie.</returns>
|
2013-05-28 01:59:26 +00:00
|
|
|
|
private T FindMovie<T>(ItemResolveArgs args)
|
|
|
|
|
where T : Video, new ()
|
2013-02-21 01:33:05 +00:00
|
|
|
|
{
|
|
|
|
|
// Optimization to avoid having to resolve every file
|
|
|
|
|
bool? isKnownMovie = null;
|
|
|
|
|
|
2013-05-28 01:59:26 +00:00
|
|
|
|
var movies = new List<T>();
|
2013-02-21 01:33:05 +00:00
|
|
|
|
|
|
|
|
|
// Loop through each child file/folder and see if we find a video
|
|
|
|
|
foreach (var child in args.FileSystemChildren)
|
|
|
|
|
{
|
2013-06-11 20:35:54 +00:00
|
|
|
|
if ((child.Attributes & FileAttributes.Directory) == FileAttributes.Directory)
|
2013-02-21 01:33:05 +00:00
|
|
|
|
{
|
2013-04-28 05:29:27 +00:00
|
|
|
|
if (IsDvdDirectory(child.Name))
|
2013-02-21 01:33:05 +00:00
|
|
|
|
{
|
2013-05-28 01:59:26 +00:00
|
|
|
|
return new T
|
2013-02-21 01:33:05 +00:00
|
|
|
|
{
|
|
|
|
|
Path = args.Path,
|
|
|
|
|
VideoType = VideoType.Dvd
|
|
|
|
|
};
|
|
|
|
|
}
|
2013-04-28 05:29:27 +00:00
|
|
|
|
if (IsBluRayDirectory(child.Name))
|
2013-02-21 01:33:05 +00:00
|
|
|
|
{
|
2013-05-28 01:59:26 +00:00
|
|
|
|
return new T
|
2013-02-21 01:33:05 +00:00
|
|
|
|
{
|
|
|
|
|
Path = args.Path,
|
|
|
|
|
VideoType = VideoType.BluRay
|
|
|
|
|
};
|
|
|
|
|
}
|
2013-04-28 05:29:27 +00:00
|
|
|
|
if (IsHdDvdDirectory(child.Name))
|
2013-02-21 01:33:05 +00:00
|
|
|
|
{
|
2013-05-28 01:59:26 +00:00
|
|
|
|
return new T
|
2013-02-21 01:33:05 +00:00
|
|
|
|
{
|
|
|
|
|
Path = args.Path,
|
|
|
|
|
VideoType = VideoType.HdDvd
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2013-05-20 16:43:22 +00:00
|
|
|
|
// Don't misidentify xbmc trailers as a movie
|
2013-05-20 17:04:39 +00:00
|
|
|
|
if (child.Name.IndexOf(BaseItem.XbmcTrailerFileSuffix, StringComparison.OrdinalIgnoreCase) != -1)
|
2013-05-20 16:43:22 +00:00
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
2013-03-04 05:43:06 +00:00
|
|
|
|
var childArgs = new ItemResolveArgs(ApplicationPaths)
|
2013-02-21 01:33:05 +00:00
|
|
|
|
{
|
|
|
|
|
FileInfo = child,
|
2013-04-28 05:29:27 +00:00
|
|
|
|
Path = child.FullName
|
2013-02-21 01:33:05 +00:00
|
|
|
|
};
|
|
|
|
|
|
2013-05-28 01:59:26 +00:00
|
|
|
|
var item = ResolveVideo<T>(childArgs);
|
2013-02-21 01:33:05 +00:00
|
|
|
|
|
|
|
|
|
if (item != null)
|
|
|
|
|
{
|
|
|
|
|
// If we already know it's a movie, we can stop looping
|
|
|
|
|
if (!isKnownMovie.HasValue)
|
|
|
|
|
{
|
2013-06-09 16:47:28 +00:00
|
|
|
|
isKnownMovie = args.ContainsMetaFileByName("movie.xml") || args.ContainsMetaFileByName("tmdb3.json") || args.Path.IndexOf("[tmdbid", StringComparison.OrdinalIgnoreCase) != -1;
|
2013-02-21 01:33:05 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (isKnownMovie.Value)
|
|
|
|
|
{
|
|
|
|
|
return item;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
movies.Add(item);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2013-06-12 21:46:50 +00:00
|
|
|
|
if (movies.Count > 1)
|
|
|
|
|
{
|
|
|
|
|
return GetMultiFileMovie(movies);
|
|
|
|
|
}
|
|
|
|
|
|
2013-02-21 01:33:05 +00:00
|
|
|
|
return movies.Count == 1 ? movies[0] : null;
|
|
|
|
|
}
|
|
|
|
|
|
2013-06-12 21:46:50 +00:00
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Gets the multi file movie.
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <typeparam name="T"></typeparam>
|
|
|
|
|
/// <param name="movies">The movies.</param>
|
|
|
|
|
/// <returns>``0.</returns>
|
|
|
|
|
private T GetMultiFileMovie<T>(List<T> movies)
|
|
|
|
|
where T : Video, new()
|
|
|
|
|
{
|
|
|
|
|
var multiPartMovies = movies.OrderBy(i => i.Path)
|
|
|
|
|
.Where(i => EntityResolutionHelper.IsMultiPartFile(i.Path))
|
|
|
|
|
.ToList();
|
|
|
|
|
|
|
|
|
|
// They must all be part of the sequence
|
|
|
|
|
if (multiPartMovies.Count != movies.Count)
|
|
|
|
|
{
|
|
|
|
|
return null;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var firstPart = multiPartMovies[0];
|
|
|
|
|
|
|
|
|
|
firstPart.IsMultiPart = true;
|
|
|
|
|
|
|
|
|
|
return firstPart;
|
|
|
|
|
}
|
|
|
|
|
|
2013-02-21 01:33:05 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// Determines whether [is DVD directory] [the specified directory name].
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="directoryName">Name of the directory.</param>
|
|
|
|
|
/// <returns><c>true</c> if [is DVD directory] [the specified directory name]; otherwise, <c>false</c>.</returns>
|
|
|
|
|
private bool IsDvdDirectory(string directoryName)
|
|
|
|
|
{
|
|
|
|
|
return directoryName.Equals("video_ts", StringComparison.OrdinalIgnoreCase);
|
|
|
|
|
}
|
2013-06-12 21:46:50 +00:00
|
|
|
|
|
2013-02-21 01:33:05 +00:00
|
|
|
|
/// <summary>
|
|
|
|
|
/// Determines whether [is hd DVD directory] [the specified directory name].
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="directoryName">Name of the directory.</param>
|
|
|
|
|
/// <returns><c>true</c> if [is hd DVD directory] [the specified directory name]; otherwise, <c>false</c>.</returns>
|
|
|
|
|
private bool IsHdDvdDirectory(string directoryName)
|
|
|
|
|
{
|
|
|
|
|
return directoryName.Equals("hvdvd_ts", StringComparison.OrdinalIgnoreCase);
|
|
|
|
|
}
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Determines whether [is blu ray directory] [the specified directory name].
|
|
|
|
|
/// </summary>
|
|
|
|
|
/// <param name="directoryName">Name of the directory.</param>
|
|
|
|
|
/// <returns><c>true</c> if [is blu ray directory] [the specified directory name]; otherwise, <c>false</c>.</returns>
|
|
|
|
|
private bool IsBluRayDirectory(string directoryName)
|
|
|
|
|
{
|
|
|
|
|
return directoryName.Equals("bdmv", StringComparison.OrdinalIgnoreCase);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|