diff --git a/MediaBrowser.Controller/Resolvers/BaseVideoResolver.cs b/MediaBrowser.Controller/Resolvers/BaseVideoResolver.cs
index 9e5d68c489..06bee2ad1e 100644
--- a/MediaBrowser.Controller/Resolvers/BaseVideoResolver.cs
+++ b/MediaBrowser.Controller/Resolvers/BaseVideoResolver.cs
@@ -35,6 +35,7 @@ namespace MediaBrowser.Controller.Resolvers
// If the path is a file check for a matching extensions
if (!args.IsDirectory)
{
+ // http://wiki.xbmc.org/index.php?title=Media_stubs
var isPlaceHolder = EntityResolutionHelper.IsVideoPlaceHolder(args.Path);
if (EntityResolutionHelper.IsVideoFile(args.Path) || isPlaceHolder)
@@ -44,13 +45,34 @@ namespace MediaBrowser.Controller.Resolvers
var type = string.Equals(extension, ".iso", StringComparison.OrdinalIgnoreCase) || string.Equals(extension, ".img", StringComparison.OrdinalIgnoreCase) ?
VideoType.Iso : VideoType.VideoFile;
- return new TVideoType
+ var video = new TVideoType
{
VideoType = type,
Path = args.Path,
IsInMixedFolder = true,
IsPlaceHolder = isPlaceHolder
};
+
+ if (isPlaceHolder)
+ {
+ if (args.Path.EndsWith("dvd.disc", StringComparison.OrdinalIgnoreCase))
+ {
+ video.VideoType = VideoType.Dvd;
+ }
+ else if (args.Path.EndsWith("hddvd.disc", StringComparison.OrdinalIgnoreCase))
+ {
+ video.VideoType = VideoType.HdDvd;
+ }
+ else if (args.Path.EndsWith("bluray.disc", StringComparison.OrdinalIgnoreCase) ||
+ args.Path.EndsWith("brrip.disc", StringComparison.OrdinalIgnoreCase) ||
+ args.Path.EndsWith("bd25.disc", StringComparison.OrdinalIgnoreCase) ||
+ args.Path.EndsWith("bd50.disc", StringComparison.OrdinalIgnoreCase))
+ {
+ video.VideoType = VideoType.BluRay;
+ }
+ }
+
+ return video;
}
}
diff --git a/MediaBrowser.Model/Configuration/ServerConfiguration.cs b/MediaBrowser.Model/Configuration/ServerConfiguration.cs
index fc232edb31..0bff8a1bdf 100644
--- a/MediaBrowser.Model/Configuration/ServerConfiguration.cs
+++ b/MediaBrowser.Model/Configuration/ServerConfiguration.cs
@@ -210,6 +210,7 @@ namespace MediaBrowser.Model.Configuration
public PathSubstitution[] PathSubstitutions { get; set; }
public string ServerName { get; set; }
+ public string WanDdns { get; set; }
///
/// Initializes a new instance of the class.
diff --git a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs
index 620a7a6f65..c2279fb508 100644
--- a/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs
+++ b/MediaBrowser.Providers/MediaInfo/FFProbeVideoInfo.cs
@@ -53,9 +53,18 @@ namespace MediaBrowser.Providers.MediaInfo
{
var isoMount = await MountIsoIfNeeded(item, cancellationToken).ConfigureAwait(false);
+ BlurayDiscInfo blurayDiscInfo = null;
+
try
{
- OnPreFetch(item, isoMount);
+ if (item.VideoType == VideoType.BluRay || (item.IsoType.HasValue && item.IsoType == IsoType.BluRay))
+ {
+ var inputPath = isoMount != null ? isoMount.MountedPath : item.Path;
+
+ blurayDiscInfo = GetBDInfo(inputPath);
+ }
+
+ OnPreFetch(item, isoMount, blurayDiscInfo);
// If we didn't find any satisfying the min length, just take them all
if (item.VideoType == VideoType.Dvd || (item.IsoType.HasValue && item.IsoType == IsoType.Dvd))
@@ -67,6 +76,15 @@ namespace MediaBrowser.Providers.MediaInfo
}
}
+ if (item.VideoType == VideoType.BluRay || (item.IsoType.HasValue && item.IsoType == IsoType.BluRay))
+ {
+ if (item.PlayableStreamFileNames.Count == 0)
+ {
+ _logger.Error("No playable vobs found in bluray structure, skipping ffprobe.");
+ return ItemUpdateType.MetadataImport;
+ }
+ }
+
var result = await GetMediaInfo(item, isoMount, cancellationToken).ConfigureAwait(false);
cancellationToken.ThrowIfCancellationRequested();
@@ -75,7 +93,7 @@ namespace MediaBrowser.Providers.MediaInfo
cancellationToken.ThrowIfCancellationRequested();
- await Fetch(item, cancellationToken, result, isoMount, directoryService).ConfigureAwait(false);
+ await Fetch(item, cancellationToken, result, isoMount, blurayDiscInfo, directoryService).ConfigureAwait(false);
}
finally
@@ -128,7 +146,7 @@ namespace MediaBrowser.Providers.MediaInfo
return result;
}
- protected async Task Fetch(Video video, CancellationToken cancellationToken, InternalMediaInfoResult data, IIsoMount isoMount, IDirectoryService directoryService)
+ protected async Task Fetch(Video video, CancellationToken cancellationToken, InternalMediaInfoResult data, IIsoMount isoMount, BlurayDiscInfo blurayInfo, IDirectoryService directoryService)
{
if (data.format != null)
{
@@ -147,8 +165,7 @@ namespace MediaBrowser.Providers.MediaInfo
if (video.VideoType == VideoType.BluRay || (video.IsoType.HasValue && video.IsoType.Value == IsoType.BluRay))
{
- var inputPath = isoMount != null ? isoMount.MountedPath : video.Path;
- FetchBdInfo(video, chapters, mediaStreams, inputPath, cancellationToken);
+ FetchBdInfo(video, chapters, mediaStreams, blurayInfo);
}
AddExternalSubtitles(video, mediaStreams, directoryService);
@@ -183,14 +200,10 @@ namespace MediaBrowser.Providers.MediaInfo
await _itemRepo.SaveChapters(video.Id, chapters, cancellationToken).ConfigureAwait(false);
}
- private void FetchBdInfo(BaseItem item, List chapters, List mediaStreams, string inputPath, CancellationToken cancellationToken)
+ private void FetchBdInfo(BaseItem item, List chapters, List mediaStreams, BlurayDiscInfo blurayInfo)
{
var video = (Video)item;
- var result = GetBDInfo(inputPath);
-
- cancellationToken.ThrowIfCancellationRequested();
-
int? currentHeight = null;
int? currentWidth = null;
int? currentBitRate = null;
@@ -206,7 +219,28 @@ namespace MediaBrowser.Providers.MediaInfo
}
// Fill video properties from the BDInfo result
- Fetch(video, mediaStreams, result, chapters);
+ mediaStreams.Clear();
+ mediaStreams.AddRange(blurayInfo.MediaStreams);
+
+ video.MainFeaturePlaylistName = blurayInfo.PlaylistName;
+
+ if (blurayInfo.RunTimeTicks.HasValue && blurayInfo.RunTimeTicks.Value > 0)
+ {
+ video.RunTimeTicks = blurayInfo.RunTimeTicks;
+ }
+
+ video.PlayableStreamFileNames = blurayInfo.Files.ToList();
+
+ if (blurayInfo.Chapters != null)
+ {
+ chapters.Clear();
+
+ chapters.AddRange(blurayInfo.Chapters.Select(c => new ChapterInfo
+ {
+ StartPositionTicks = TimeSpan.FromSeconds(c).Ticks
+
+ }));
+ }
videoStream = mediaStreams.FirstOrDefault(s => s.Type == MediaStreamType.Video);
@@ -224,35 +258,6 @@ namespace MediaBrowser.Providers.MediaInfo
return !num.HasValue || num.Value == 0;
}
- /// The chapters.
- private void Fetch(Video video, List mediaStreams, BlurayDiscInfo stream, List chapters)
- {
- // Check all input for null/empty/zero
-
- mediaStreams.Clear();
- mediaStreams.AddRange(stream.MediaStreams);
-
- video.MainFeaturePlaylistName = stream.PlaylistName;
-
- if (stream.RunTimeTicks.HasValue && stream.RunTimeTicks.Value > 0)
- {
- video.RunTimeTicks = stream.RunTimeTicks;
- }
-
- video.PlayableStreamFileNames = stream.Files.ToList();
-
- if (stream.Chapters != null)
- {
- chapters.Clear();
-
- chapters.AddRange(stream.Chapters.Select(c => new ChapterInfo
- {
- StartPositionTicks = TimeSpan.FromSeconds(c).Ticks
-
- }));
- }
- }
-
///
/// Gets information about the longest playlist on a bdrom
///
@@ -498,7 +503,7 @@ namespace MediaBrowser.Providers.MediaInfo
///
/// The item.
/// The mount.
- private void OnPreFetch(Video item, IIsoMount mount)
+ private void OnPreFetch(Video item, IIsoMount mount, BlurayDiscInfo blurayDiscInfo)
{
if (item.VideoType == VideoType.Iso)
{
@@ -509,6 +514,11 @@ namespace MediaBrowser.Providers.MediaInfo
{
FetchFromDvdLib(item, mount);
}
+
+ if (item.VideoType == VideoType.BluRay || (item.IsoType.HasValue && item.IsoType.Value == IsoType.BluRay))
+ {
+ item.PlayableStreamFileNames = blurayDiscInfo.Files.ToList();
+ }
}
private void FetchFromDvdLib(Video item, IIsoMount mount)
diff --git a/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs b/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs
index 08d21ab39a..5f6bdfa042 100644
--- a/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs
+++ b/MediaBrowser.Providers/TV/TvdbEpisodeProvider.cs
@@ -45,6 +45,9 @@ namespace MediaBrowser.Providers.TV
if (!string.IsNullOrEmpty(seriesTvdbId))
{
+ await TvdbSeriesProvider.Current.EnsureSeriesInfo(seriesTvdbId, searchInfo.MetadataLanguage,
+ cancellationToken).ConfigureAwait(false);
+
var seriesDataPath = TvdbSeriesProvider.GetSeriesDataPath(_config.ApplicationPaths, seriesTvdbId);
try
diff --git a/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs b/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs
index 4bd22107c4..4b78c1a962 100644
--- a/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs
+++ b/MediaBrowser.Providers/TV/TvdbSeriesProvider.cs
@@ -1005,7 +1005,7 @@ namespace MediaBrowser.Providers.TV
/// System.String.
internal static string GetSeriesDataPath(IApplicationPaths appPaths)
{
- var dataPath = Path.Combine(appPaths.DataPath, "tvdb-v3");
+ var dataPath = Path.Combine(appPaths.CachePath, "tvdb");
return dataPath;
}
diff --git a/MediaBrowser.ServerApplication/ApplicationHost.cs b/MediaBrowser.ServerApplication/ApplicationHost.cs
index 1907344a10..479e07ee6c 100644
--- a/MediaBrowser.ServerApplication/ApplicationHost.cs
+++ b/MediaBrowser.ServerApplication/ApplicationHost.cs
@@ -372,6 +372,15 @@ namespace MediaBrowser.ServerApplication
{
// Not there, no big deal
}
+
+ try
+ {
+ Directory.Delete(Path.Combine(ApplicationPaths.DataPath, "tvdb-v3"), true);
+ }
+ catch (IOException)
+ {
+ // Not there, no big deal
+ }
});
}
@@ -856,11 +865,22 @@ namespace MediaBrowser.ServerApplication
private readonly CultureInfo _usCulture = new CultureInfo("en-US");
private string GetWanAddress()
{
- var ip = WanAddressEntryPoint.WanAddress;
+ var ip = ServerConfigurationManager.Configuration.WanDdns;
+
+ if (string.IsNullOrWhiteSpace(ip))
+ {
+ ip = WanAddressEntryPoint.WanAddress;
+ }
if (!string.IsNullOrEmpty(ip))
{
- return "http://" + ip + ":" + ServerConfigurationManager.Configuration.HttpServerPortNumber.ToString(_usCulture);
+ if (!ip.StartsWith("http://", StringComparison.OrdinalIgnoreCase) &&
+ !ip.StartsWith("https://", StringComparison.OrdinalIgnoreCase))
+ {
+ ip = "http://" + ip;
+ }
+
+ return ip + ":" + ServerConfigurationManager.Configuration.HttpServerPortNumber.ToString(_usCulture);
}
return null;