| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 | 
							- using MediaBrowser.Common.Extensions;
 
- using MediaBrowser.Common.IO;
 
- using MediaBrowser.Controller;
 
- using MediaBrowser.Controller.Themes;
 
- using MediaBrowser.Model.Logging;
 
- using MediaBrowser.Model.Serialization;
 
- using MediaBrowser.Model.Themes;
 
- using System;
 
- using System.Collections.Generic;
 
- using System.IO;
 
- using System.Linq;
 
- namespace MediaBrowser.Server.Implementations.Themes
 
- {
 
-     public class AppThemeManager : IAppThemeManager
 
-     {
 
-         private readonly IServerApplicationPaths _appPaths;
 
-         private readonly IFileSystem _fileSystem;
 
-         private readonly IJsonSerializer _json;
 
-         private readonly ILogger _logger;
 
-         private readonly string[] _supportedImageExtensions = { ".png", ".jpg", ".jpeg" };
 
-         public AppThemeManager(IServerApplicationPaths appPaths, IFileSystem fileSystem, IJsonSerializer json, ILogger logger)
 
-         {
 
-             _appPaths = appPaths;
 
-             _fileSystem = fileSystem;
 
-             _json = json;
 
-             _logger = logger;
 
-         }
 
-         private string ThemePath
 
-         {
 
-             get
 
-             {
 
-                 return Path.Combine(_appPaths.ProgramDataPath, "appthemes");
 
-             }
 
-         }
 
-         private string GetThemesPath(string applicationName)
 
-         {
 
-             if (string.IsNullOrWhiteSpace(applicationName))
 
-             {
 
-                 throw new ArgumentNullException("applicationName");
 
-             }
 
-             // Force everything lowercase for consistency and maximum compatibility with case-sensitive file systems
 
-             var name = _fileSystem.GetValidFilename(applicationName.ToLower());
 
-             return Path.Combine(ThemePath, name);
 
-         }
 
-         private string GetThemePath(string applicationName, string name)
 
-         {
 
-             if (string.IsNullOrWhiteSpace(name))
 
-             {
 
-                 throw new ArgumentNullException("name");
 
-             }
 
-             
 
-             // Force everything lowercase for consistency and maximum compatibility with case-sensitive file systems
 
-             name = _fileSystem.GetValidFilename(name.ToLower());
 
-             return Path.Combine(GetThemesPath(applicationName), name);
 
-         }
 
-         private string GetImagesPath(string applicationName, string themeName)
 
-         {
 
-             return Path.Combine(GetThemePath(applicationName, themeName), "images");
 
-         }
 
-         public IEnumerable<AppThemeInfo> GetThemes(string applicationName)
 
-         {
 
-             var path = GetThemesPath(applicationName);
 
-             try
 
-             {
 
-                 return Directory
 
-                     .EnumerateFiles(path, "*", SearchOption.AllDirectories)
 
-                     .Where(i => string.Equals(Path.GetExtension(i), ".json", StringComparison.OrdinalIgnoreCase))
 
-                     .Select(i =>
 
-                     {
 
-                         try
 
-                         {
 
-                             return _json.DeserializeFromFile<AppThemeInfo>(i);
 
-                         }
 
-                         catch (Exception ex)
 
-                         {
 
-                             _logger.ErrorException("Error deserializing {0}", ex, i);
 
-                             return null;
 
-                         }
 
-                     }).Where(i => i != null);
 
-             }
 
-             catch (DirectoryNotFoundException)
 
-             {
 
-                 return new List<AppThemeInfo>();
 
-             }
 
-         }
 
-         public AppTheme GetTheme(string applicationName, string name)
 
-         {
 
-             var themePath = GetThemePath(applicationName, name);
 
-             var file = Path.Combine(themePath, "theme.json");
 
-             var imagesPath = GetImagesPath(applicationName, name);
 
-             var theme = _json.DeserializeFromFile<AppTheme>(file);
 
-             theme.Images = new DirectoryInfo(imagesPath)
 
-                 .EnumerateFiles("*", SearchOption.TopDirectoryOnly)
 
-                 .Where(i => _supportedImageExtensions.Contains(i.Extension, StringComparer.OrdinalIgnoreCase))
 
-                 .Select(GetThemeImage)
 
-                 .ToList();
 
-             return theme;
 
-         }
 
-         private ThemeImage GetThemeImage(FileInfo file)
 
-         {
 
-             var dateModified = _fileSystem.GetLastWriteTimeUtc(file);
 
-             var cacheTag = (file.FullName + dateModified.Ticks).GetMD5().ToString("N");
 
-             return new ThemeImage
 
-             {
 
-                 CacheTag = cacheTag,
 
-                 Name = file.Name
 
-             };
 
-         }
 
-         public void SaveTheme(AppTheme theme)
 
-         {
 
-             var themePath = GetThemePath(theme.AppName, theme.Name);
 
-             var file = Path.Combine(themePath, "theme.json");
 
-             Directory.CreateDirectory(themePath);
 
-             // Clone it so that we don't serialize all the images - they're always dynamic
 
-             var clone = new AppTheme
 
-             {
 
-                 AppName = theme.AppName,
 
-                 Name = theme.Name,
 
-                 Options = theme.Options,
 
-                 Images = null
 
-             };
 
-             _json.SerializeToFile(clone, file);
 
-         }
 
-         public InternalThemeImage GetImageImageInfo(string applicationName, string themeName, string imageName)
 
-         {
 
-             var imagesPath = GetImagesPath(applicationName, themeName);
 
-             var file = new DirectoryInfo(imagesPath).EnumerateFiles("*", SearchOption.TopDirectoryOnly)
 
-                 .First(i => string.Equals(i.Name, imageName, StringComparison.OrdinalIgnoreCase));
 
-             var themeImage = GetThemeImage(file);
 
-             return new InternalThemeImage
 
-             {
 
-                 CacheTag = themeImage.CacheTag,
 
-                 Name = themeImage.Name,
 
-                 Path = file.FullName,
 
-                 DateModified = _fileSystem.GetLastWriteTimeUtc(file)
 
-             };
 
-         }
 
-     }
 
- }
 
 
  |