aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.XbmcMetadata/Providers
diff options
context:
space:
mode:
authorLuke Pulverenti <luke.pulverenti@gmail.com>2014-06-29 23:04:50 -0400
committerLuke Pulverenti <luke.pulverenti@gmail.com>2014-06-29 23:04:50 -0400
commit3d47b495a96fce84c03d9f3177dc6dbc8a4afa3c (patch)
tree9d03bc06b30fec5695bb7a89094387ecbdd8e3e9 /MediaBrowser.XbmcMetadata/Providers
parent1a5a75854bd3ec4cdd771c9afdaefe0acb62c03c (diff)
fixes #795 - Support reading Xbmc nfo's
Diffstat (limited to 'MediaBrowser.XbmcMetadata/Providers')
-rw-r--r--MediaBrowser.XbmcMetadata/Providers/AlbumNfoProvider.cs34
-rw-r--r--MediaBrowser.XbmcMetadata/Providers/ArtistNfoProvider.cs34
-rw-r--r--MediaBrowser.XbmcMetadata/Providers/BaseNfoProvider.cs89
-rw-r--r--MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs55
-rw-r--r--MediaBrowser.XbmcMetadata/Providers/EpisodeNfoProvider.cs44
-rw-r--r--MediaBrowser.XbmcMetadata/Providers/MovieNfoProvider.cs45
-rw-r--r--MediaBrowser.XbmcMetadata/Providers/SeasonNfoProvider.cs35
-rw-r--r--MediaBrowser.XbmcMetadata/Providers/SeriesNfoProvider.cs34
8 files changed, 370 insertions, 0 deletions
diff --git a/MediaBrowser.XbmcMetadata/Providers/AlbumNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/AlbumNfoProvider.cs
new file mode 100644
index 0000000000..535fa28b83
--- /dev/null
+++ b/MediaBrowser.XbmcMetadata/Providers/AlbumNfoProvider.cs
@@ -0,0 +1,34 @@
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.Entities.Audio;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.XbmcMetadata.Parsers;
+using System.IO;
+using System.Threading;
+
+namespace MediaBrowser.XbmcMetadata.Providers
+{
+ public class AlbumNfoProvider : BaseNfoProvider<MusicAlbum>
+ {
+ private readonly ILogger _logger;
+ private readonly IConfigurationManager _config;
+
+ public AlbumNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config)
+ : base(fileSystem)
+ {
+ _logger = logger;
+ _config = config;
+ }
+
+ protected override void Fetch(LocalMetadataResult<MusicAlbum> result, string path, CancellationToken cancellationToken)
+ {
+ new BaseNfoParser<MusicAlbum>(_logger, _config).Fetch(result.Item, path, cancellationToken);
+ }
+
+ protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService)
+ {
+ return directoryService.GetFile(Path.Combine(info.Path, "album.nfo"));
+ }
+ }
+}
diff --git a/MediaBrowser.XbmcMetadata/Providers/ArtistNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/ArtistNfoProvider.cs
new file mode 100644
index 0000000000..f281c10483
--- /dev/null
+++ b/MediaBrowser.XbmcMetadata/Providers/ArtistNfoProvider.cs
@@ -0,0 +1,34 @@
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.Entities.Audio;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.XbmcMetadata.Parsers;
+using System.IO;
+using System.Threading;
+
+namespace MediaBrowser.XbmcMetadata.Providers
+{
+ public class ArtistNfoProvider : BaseNfoProvider<MusicArtist>
+ {
+ private readonly ILogger _logger;
+ private readonly IConfigurationManager _config;
+
+ public ArtistNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config)
+ : base(fileSystem)
+ {
+ _logger = logger;
+ _config = config;
+ }
+
+ protected override void Fetch(LocalMetadataResult<MusicArtist> result, string path, CancellationToken cancellationToken)
+ {
+ new BaseNfoParser<MusicArtist>(_logger, _config).Fetch(result.Item, path, cancellationToken);
+ }
+
+ protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService)
+ {
+ return directoryService.GetFile(Path.Combine(info.Path, "artist.nfo"));
+ }
+ }
+}
diff --git a/MediaBrowser.XbmcMetadata/Providers/BaseNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/BaseNfoProvider.cs
new file mode 100644
index 0000000000..65648e1d05
--- /dev/null
+++ b/MediaBrowser.XbmcMetadata/Providers/BaseNfoProvider.cs
@@ -0,0 +1,89 @@
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Logging;
+using System;
+using System.IO;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace MediaBrowser.XbmcMetadata.Providers
+{
+ public abstract class BaseNfoProvider<T> : ILocalMetadataProvider<T>, IHasChangeMonitor
+ where T : IHasMetadata, new()
+ {
+ protected IFileSystem FileSystem;
+
+ public async Task<LocalMetadataResult<T>> GetMetadata(ItemInfo info, CancellationToken cancellationToken)
+ {
+ var result = new LocalMetadataResult<T>();
+
+ var file = GetXmlFile(info, new DirectoryService(new NullLogger()));
+
+ if (file == null)
+ {
+ return result;
+ }
+
+ var path = file.FullName;
+
+ await XmlProviderUtils.XmlParsingResourcePool.WaitAsync(cancellationToken).ConfigureAwait(false);
+
+ try
+ {
+ result.Item = new T();
+
+ Fetch(result, path, cancellationToken);
+ result.HasMetadata = true;
+ }
+ catch (FileNotFoundException)
+ {
+ result.HasMetadata = false;
+ }
+ catch (DirectoryNotFoundException)
+ {
+ result.HasMetadata = false;
+ }
+ finally
+ {
+ XmlProviderUtils.XmlParsingResourcePool.Release();
+ }
+
+ return result;
+ }
+
+ protected abstract void Fetch(LocalMetadataResult<T> result, string path, CancellationToken cancellationToken);
+
+ protected BaseNfoProvider(IFileSystem fileSystem)
+ {
+ FileSystem = fileSystem;
+ }
+
+ protected abstract FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService);
+
+ public bool HasChanged(IHasMetadata item, IDirectoryService directoryService, DateTime date)
+ {
+ var file = GetXmlFile(new ItemInfo { IsInMixedFolder = item.IsInMixedFolder, Path = item.Path }, directoryService);
+
+ if (file == null)
+ {
+ return false;
+ }
+
+ return file.Exists && FileSystem.GetLastWriteTimeUtc(file) > date;
+ }
+
+ public string Name
+ {
+ get
+ {
+ return "Xbmc Nfo";
+ }
+ }
+ }
+
+ static class XmlProviderUtils
+ {
+ internal static readonly SemaphoreSlim XmlParsingResourcePool = new SemaphoreSlim(4, 4);
+ }
+}
diff --git a/MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs
new file mode 100644
index 0000000000..d51c44ad4e
--- /dev/null
+++ b/MediaBrowser.XbmcMetadata/Providers/BaseVideoNfoProvider.cs
@@ -0,0 +1,55 @@
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.XbmcMetadata.Parsers;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+
+namespace MediaBrowser.XbmcMetadata.Providers
+{
+ public class BaseVideoNfoProvider<T> : BaseNfoProvider<T>
+ where T : Video, new ()
+ {
+ private readonly ILogger _logger;
+ private readonly IConfigurationManager _config;
+
+ public BaseVideoNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config)
+ : base(fileSystem)
+ {
+ _logger = logger;
+ _config = config;
+ }
+
+ protected override void Fetch(LocalMetadataResult<T> result, string path, CancellationToken cancellationToken)
+ {
+ var chapters = new List<ChapterInfo>();
+
+ new MovieNfoParser(_logger, _config).Fetch(result.Item, chapters, path, cancellationToken);
+
+ result.Chapters = chapters;
+ }
+
+ protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService)
+ {
+ var path = GetMovieSavePath(info);
+
+ return directoryService.GetFile(path);
+ }
+
+ public static string GetMovieSavePath(ItemInfo item)
+ {
+ if (Directory.Exists(item.Path))
+ {
+ var path = item.Path;
+
+ return Path.Combine(path, Path.GetFileNameWithoutExtension(path) + ".nfo");
+ }
+
+ return Path.ChangeExtension(item.Path, ".nfo");
+ }
+ }
+} \ No newline at end of file
diff --git a/MediaBrowser.XbmcMetadata/Providers/EpisodeNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/EpisodeNfoProvider.cs
new file mode 100644
index 0000000000..7899305e3a
--- /dev/null
+++ b/MediaBrowser.XbmcMetadata/Providers/EpisodeNfoProvider.cs
@@ -0,0 +1,44 @@
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Entities;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.XbmcMetadata.Parsers;
+using System.Collections.Generic;
+using System.IO;
+using System.Threading;
+
+namespace MediaBrowser.XbmcMetadata.Providers
+{
+ public class EpisodeNfoProvider : BaseNfoProvider<Episode>
+ {
+ private readonly ILogger _logger;
+ private readonly IConfigurationManager _config;
+
+ public EpisodeNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config)
+ : base(fileSystem)
+ {
+ _logger = logger;
+ _config = config;
+ }
+
+ protected override void Fetch(LocalMetadataResult<Episode> result, string path, CancellationToken cancellationToken)
+ {
+ var images = new List<LocalImageInfo>();
+ var chapters = new List<ChapterInfo>();
+
+ new EpisodeNfoParser(_logger, _config).Fetch(result.Item, images, chapters, path, cancellationToken);
+
+ result.Images = images;
+ result.Chapters = chapters;
+ }
+
+ protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService)
+ {
+ var path = Path.ChangeExtension(info.Path, ".nfo");
+
+ return directoryService.GetFile(path);
+ }
+ }
+}
diff --git a/MediaBrowser.XbmcMetadata/Providers/MovieNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/MovieNfoProvider.cs
new file mode 100644
index 0000000000..bd17c8539d
--- /dev/null
+++ b/MediaBrowser.XbmcMetadata/Providers/MovieNfoProvider.cs
@@ -0,0 +1,45 @@
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Movies;
+using MediaBrowser.Model.Logging;
+
+namespace MediaBrowser.XbmcMetadata.Providers
+{
+ public class MovieNfoProvider : BaseVideoNfoProvider<Movie>
+ {
+ public MovieNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config) : base(fileSystem, logger, config)
+ {
+ }
+ }
+
+ public class MusicVideoNfoProvider : BaseVideoNfoProvider<MusicVideo>
+ {
+ public MusicVideoNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config) : base(fileSystem, logger, config)
+ {
+ }
+ }
+
+ public class AdultVideoNfoProvider : BaseVideoNfoProvider<AdultVideo>
+ {
+ public AdultVideoNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config) : base(fileSystem, logger, config)
+ {
+ }
+ }
+
+ public class VideoNfoProvider : BaseVideoNfoProvider<Video>
+ {
+ public VideoNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config) : base(fileSystem, logger, config)
+ {
+ }
+ }
+
+ public class TrailerNfoProvider : BaseVideoNfoProvider<Trailer>
+ {
+ public TrailerNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config)
+ : base(fileSystem, logger, config)
+ {
+ }
+ }
+
+} \ No newline at end of file
diff --git a/MediaBrowser.XbmcMetadata/Providers/SeasonNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/SeasonNfoProvider.cs
new file mode 100644
index 0000000000..7b68ed94b2
--- /dev/null
+++ b/MediaBrowser.XbmcMetadata/Providers/SeasonNfoProvider.cs
@@ -0,0 +1,35 @@
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.XbmcMetadata.Parsers;
+using System.IO;
+using System.Threading;
+
+namespace MediaBrowser.XbmcMetadata.Providers
+{
+ public class SeasonNfoProvider : BaseNfoProvider<Season>
+ {
+ private readonly ILogger _logger;
+ private readonly IConfigurationManager _config;
+
+ public SeasonNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config)
+ : base(fileSystem)
+ {
+ _logger = logger;
+ _config = config;
+ }
+
+ protected override void Fetch(LocalMetadataResult<Season> result, string path, CancellationToken cancellationToken)
+ {
+ new SeasonNfoParser(_logger, _config).Fetch(result.Item, path, cancellationToken);
+ }
+
+ protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService)
+ {
+ return directoryService.GetFile(Path.Combine(info.Path, "season.nfo"));
+ }
+ }
+}
+
diff --git a/MediaBrowser.XbmcMetadata/Providers/SeriesNfoProvider.cs b/MediaBrowser.XbmcMetadata/Providers/SeriesNfoProvider.cs
new file mode 100644
index 0000000000..4a71d9fd34
--- /dev/null
+++ b/MediaBrowser.XbmcMetadata/Providers/SeriesNfoProvider.cs
@@ -0,0 +1,34 @@
+using MediaBrowser.Common.Configuration;
+using MediaBrowser.Common.IO;
+using MediaBrowser.Controller.Entities.TV;
+using MediaBrowser.Controller.Providers;
+using MediaBrowser.Model.Logging;
+using MediaBrowser.XbmcMetadata.Parsers;
+using System.IO;
+using System.Threading;
+
+namespace MediaBrowser.XbmcMetadata.Providers
+{
+ public class SeriesNfoProvider : BaseNfoProvider<Series>
+ {
+ private readonly ILogger _logger;
+ private readonly IConfigurationManager _config;
+
+ public SeriesNfoProvider(IFileSystem fileSystem, ILogger logger, IConfigurationManager config)
+ : base(fileSystem)
+ {
+ _logger = logger;
+ _config = config;
+ }
+
+ protected override void Fetch(LocalMetadataResult<Series> result, string path, CancellationToken cancellationToken)
+ {
+ new SeriesNfoParser(_logger, _config).Fetch(result.Item, path, cancellationToken);
+ }
+
+ protected override FileSystemInfo GetXmlFile(ItemInfo info, IDirectoryService directoryService)
+ {
+ return directoryService.GetFile(Path.Combine(info.Path, "series.nfo"));
+ }
+ }
+}