Merge pull request #2998 from MediaBrowser/beta

Beta
pull/1154/head
Luke 7 years ago committed by GitHub
commit 008cea6984

@ -63,8 +63,8 @@
<EmbeddedResource Include="fonts\robotoregular.ttf" /> <EmbeddedResource Include="fonts\robotoregular.ttf" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Reference Include="SkiaSharp, Version=1.58.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL"> <Reference Include="SkiaSharp, Version=1.59.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
<HintPath>..\packages\SkiaSharp.1.58.1\lib\portable-net45+win8+wpa81+wp8\SkiaSharp.dll</HintPath> <HintPath>..\packages\SkiaSharp.1.59.2\lib\portable-net45+win8+wpa81+wp8\SkiaSharp.dll</HintPath>
</Reference> </Reference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>

@ -10,22 +10,27 @@ using System.IO;
using System.Linq; using System.Linq;
using System.Reflection; using System.Reflection;
using System.Threading.Tasks; using System.Threading.Tasks;
using MediaBrowser.Controller.Extensions;
using System.Globalization;
using MediaBrowser.Model.Globalization;
namespace Emby.Drawing.Skia namespace Emby.Drawing.Skia
{ {
public class SkiaEncoder : IImageEncoder public class SkiaEncoder : IImageEncoder
{ {
private readonly ILogger _logger; private readonly ILogger _logger;
private readonly IApplicationPaths _appPaths; private static IApplicationPaths _appPaths;
private readonly Func<IHttpClient> _httpClientFactory; private readonly Func<IHttpClient> _httpClientFactory;
private readonly IFileSystem _fileSystem; private readonly IFileSystem _fileSystem;
private static ILocalizationManager _localizationManager;
public SkiaEncoder(ILogger logger, IApplicationPaths appPaths, Func<IHttpClient> httpClientFactory, IFileSystem fileSystem) public SkiaEncoder(ILogger logger, IApplicationPaths appPaths, Func<IHttpClient> httpClientFactory, IFileSystem fileSystem, ILocalizationManager localizationManager)
{ {
_logger = logger; _logger = logger;
_appPaths = appPaths; _appPaths = appPaths;
_httpClientFactory = httpClientFactory; _httpClientFactory = httpClientFactory;
_fileSystem = fileSystem; _fileSystem = fileSystem;
_localizationManager = localizationManager;
LogVersion(); LogVersion();
} }
@ -190,14 +195,53 @@ namespace Emby.Drawing.Skia
} }
} }
private static bool HasDiacritics(string text)
{
return !String.Equals(text, text.RemoveDiacritics(), StringComparison.Ordinal);
}
private static bool RequiresSpecialCharacterHack(string path)
{
if (_localizationManager.HasUnicodeCategory(path, UnicodeCategory.OtherLetter))
{
return true;
}
if (HasDiacritics(path))
{
return true;
}
return false;
}
private static string NormalizePath(string path, IFileSystem fileSystem)
{
if (!RequiresSpecialCharacterHack(path))
{
return path;
}
var tempPath = Path.Combine(_appPaths.TempDirectory, Guid.NewGuid() + Path.GetExtension(path) ?? string.Empty);
fileSystem.CopyFile(path, tempPath, true);
return tempPath;
}
private static string[] TransparentImageTypes = new string[] { ".png", ".gif", ".webp" }; private static string[] TransparentImageTypes = new string[] { ".png", ".gif", ".webp" };
internal static SKBitmap Decode(string path, bool forceCleanBitmap, out SKCodecOrigin origin) internal static SKBitmap Decode(string path, bool forceCleanBitmap, IFileSystem fileSystem, out SKCodecOrigin origin)
{ {
if (!fileSystem.FileExists(path))
{
throw new FileNotFoundException("File not found", path);
}
var requiresTransparencyHack = TransparentImageTypes.Contains(Path.GetExtension(path) ?? string.Empty); var requiresTransparencyHack = TransparentImageTypes.Contains(Path.GetExtension(path) ?? string.Empty);
if (requiresTransparencyHack || forceCleanBitmap) if (requiresTransparencyHack || forceCleanBitmap)
{ {
using (var stream = new SKFileStream(path)) using (var stream = new SKFileStream(NormalizePath(path, fileSystem)))
{ {
using (var codec = SKCodec.Create(stream)) using (var codec = SKCodec.Create(stream))
{ {
@ -227,11 +271,11 @@ namespace Emby.Drawing.Skia
} }
} }
var resultBitmap = SKBitmap.Decode(path); var resultBitmap = SKBitmap.Decode(NormalizePath(path, fileSystem));
if (resultBitmap == null) if (resultBitmap == null)
{ {
return Decode(path, true, out origin); return Decode(path, true, fileSystem, out origin);
} }
// If we have to resize these they often end up distorted // If we have to resize these they often end up distorted
@ -239,7 +283,7 @@ namespace Emby.Drawing.Skia
{ {
using (resultBitmap) using (resultBitmap)
{ {
return Decode(path, true, out origin); return Decode(path, true, fileSystem, out origin);
} }
} }
@ -251,13 +295,13 @@ namespace Emby.Drawing.Skia
{ {
if (cropWhitespace) if (cropWhitespace)
{ {
using (var bitmap = Decode(path, forceAnalyzeBitmap, out origin)) using (var bitmap = Decode(path, forceAnalyzeBitmap, _fileSystem, out origin))
{ {
return CropWhiteSpace(bitmap); return CropWhiteSpace(bitmap);
} }
} }
return Decode(path, forceAnalyzeBitmap, out origin); return Decode(path, forceAnalyzeBitmap, _fileSystem, out origin);
} }
private SKBitmap GetBitmap(string path, bool cropWhitespace, bool autoOrient) private SKBitmap GetBitmap(string path, bool cropWhitespace, bool autoOrient)

@ -83,7 +83,7 @@ namespace Emby.Drawing.Skia
for (int i = 0; i < 4; i++) for (int i = 0; i < 4; i++)
{ {
SKCodecOrigin origin; SKCodecOrigin origin;
using (var currentBitmap = SkiaEncoder.Decode(paths[imageIndex], false, out origin)) using (var currentBitmap = SkiaEncoder.Decode(paths[imageIndex], false, _fileSystem, out origin))
{ {
// resize to the same aspect as the original // resize to the same aspect as the original
int iWidth = (int)Math.Abs(iHeight * currentBitmap.Width / currentBitmap.Height); int iWidth = (int)Math.Abs(iHeight * currentBitmap.Width / currentBitmap.Height);
@ -165,7 +165,7 @@ namespace Emby.Drawing.Skia
for (var y = 0; y < 2; y++) for (var y = 0; y < 2; y++)
{ {
SKCodecOrigin origin; SKCodecOrigin origin;
using (var currentBitmap = SkiaEncoder.Decode(paths[imageIndex], false, out origin)) using (var currentBitmap = SkiaEncoder.Decode(paths[imageIndex], false, _fileSystem, out origin))
{ {
using (var resizedBitmap = new SKBitmap(cellWidth, cellHeight, currentBitmap.ColorType, currentBitmap.AlphaType)) using (var resizedBitmap = new SKBitmap(cellWidth, cellHeight, currentBitmap.ColorType, currentBitmap.AlphaType))
{ {

@ -1,4 +1,4 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="SkiaSharp" version="1.58.1" targetFramework="portable45-net45+win8" /> <package id="SkiaSharp" version="1.59.2" targetFramework="portable45-net45+win8" />
</packages> </packages>

@ -195,52 +195,49 @@ namespace Emby.Server.Implementations.Configuration
} }
} }
public void DisableMetadataService(string service) public bool SetOptimalValues()
{ {
DisableMetadataService(typeof(Movie), Configuration, service); var config = Configuration;
DisableMetadataService(typeof(Episode), Configuration, service);
DisableMetadataService(typeof(Series), Configuration, service);
DisableMetadataService(typeof(Season), Configuration, service);
DisableMetadataService(typeof(MusicArtist), Configuration, service);
DisableMetadataService(typeof(MusicAlbum), Configuration, service);
DisableMetadataService(typeof(MusicVideo), Configuration, service);
DisableMetadataService(typeof(Video), Configuration, service);
}
private void DisableMetadataService(Type type, ServerConfiguration config, string service) var changed = false;
{
var options = GetMetadataOptions(type, config);
if (!options.DisabledMetadataSavers.Contains(service, StringComparer.OrdinalIgnoreCase)) if (!config.EnableCaseSensitiveItemIds)
{ {
var list = options.DisabledMetadataSavers.ToList(); config.EnableCaseSensitiveItemIds = true;
changed = true;
list.Add(service);
options.DisabledMetadataSavers = list.ToArray(list.Count);
}
} }
private MetadataOptions GetMetadataOptions(Type type, ServerConfiguration config) if (!config.SkipDeserializationForBasicTypes)
{ {
var options = config.MetadataOptions config.SkipDeserializationForBasicTypes = true;
.FirstOrDefault(i => string.Equals(i.ItemType, type.Name, StringComparison.OrdinalIgnoreCase)); changed = true;
}
if (options == null) if (!config.EnableSimpleArtistDetection)
{ {
var list = config.MetadataOptions.ToList(); config.EnableSimpleArtistDetection = true;
changed = true;
}
options = new MetadataOptions if (!config.EnableNormalizedItemByNameIds)
{ {
ItemType = type.Name config.EnableNormalizedItemByNameIds = true;
}; changed = true;
}
list.Add(options); if (!config.DisableLiveTvChannelUserDataName)
{
config.DisableLiveTvChannelUserDataName = true;
changed = true;
}
config.MetadataOptions = list.ToArray(list.Count); if (!config.EnableNewOmdbSupport)
{
config.EnableNewOmdbSupport = true;
changed = true;
} }
return options; return changed;
} }
} }
} }

@ -5298,7 +5298,8 @@ where AncestorIdText not null and ItemValues.Value not null and ItemValues.Type
OfficialRatings = query.OfficialRatings, OfficialRatings = query.OfficialRatings,
GenreIds = query.GenreIds, GenreIds = query.GenreIds,
Genres = query.Genres, Genres = query.Genres,
Years = query.Years Years = query.Years,
NameContains = query.NameContains
}; };
var outerWhereClauses = GetWhereClauses(outerQuery, null); var outerWhereClauses = GetWhereClauses(outerQuery, null);

@ -651,8 +651,8 @@
<Reference Include="SharpCompress, Version=0.18.2.0, Culture=neutral, PublicKeyToken=afb0a02973931d96, processorArchitecture=MSIL"> <Reference Include="SharpCompress, Version=0.18.2.0, Culture=neutral, PublicKeyToken=afb0a02973931d96, processorArchitecture=MSIL">
<HintPath>..\packages\SharpCompress.0.18.2\lib\net45\SharpCompress.dll</HintPath> <HintPath>..\packages\SharpCompress.0.18.2\lib\net45\SharpCompress.dll</HintPath>
</Reference> </Reference>
<Reference Include="SimpleInjector, Version=4.0.8.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL"> <Reference Include="SimpleInjector, Version=4.0.12.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
<HintPath>..\packages\SimpleInjector.4.0.8\lib\net45\SimpleInjector.dll</HintPath> <HintPath>..\packages\SimpleInjector.4.0.12\lib\net45\SimpleInjector.dll</HintPath>
</Reference> </Reference>
<Reference Include="SQLitePCL.pretty, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL"> <Reference Include="SQLitePCL.pretty, Version=1.0.0.0, Culture=neutral, processorArchitecture=MSIL">
<HintPath>..\packages\SQLitePCL.pretty.1.1.0\lib\portable-net45+netcore45+wpa81+wp8\SQLitePCL.pretty.dll</HintPath> <HintPath>..\packages\SQLitePCL.pretty.1.1.0\lib\portable-net45+netcore45+wpa81+wp8\SQLitePCL.pretty.dll</HintPath>

@ -160,7 +160,7 @@ namespace Emby.Server.Implementations.Library.Resolvers.Movies
ProductionYear = video.Year, ProductionYear = video.Year,
Name = parseName ? Name = parseName ?
video.Name : video.Name :
Path.GetFileName(video.Files[0].Path), Path.GetFileNameWithoutExtension(video.Files[0].Path),
AdditionalParts = video.Files.Skip(1).Select(i => i.Path).ToArray(), AdditionalParts = video.Files.Skip(1).Select(i => i.Path).ToArray(),
LocalAlternateVersions = video.AlternateVersions.Select(i => i.Path).ToArray() LocalAlternateVersions = video.AlternateVersions.Select(i => i.Path).ToArray()
}; };

@ -99,8 +99,6 @@ namespace Emby.Server.Implementations.Library
var terms = GetWords(searchTerm); var terms = GetWords(searchTerm);
var hints = new List<Tuple<BaseItem, string, int>>();
var excludeItemTypes = query.ExcludeItemTypes.ToList(); var excludeItemTypes = query.ExcludeItemTypes.ToList();
var includeItemTypes = (query.IncludeItemTypes ?? new string[] { }).ToList(); var includeItemTypes = (query.IncludeItemTypes ?? new string[] { }).ToList();
@ -161,8 +159,15 @@ namespace Emby.Server.Implementations.Library
AddIfMissing(excludeItemTypes, typeof(CollectionFolder).Name); AddIfMissing(excludeItemTypes, typeof(CollectionFolder).Name);
AddIfMissing(excludeItemTypes, typeof(Folder).Name); AddIfMissing(excludeItemTypes, typeof(Folder).Name);
var mediaTypes = query.MediaTypes.ToList();
if (includeItemTypes.Count > 0)
{
excludeItemTypes.Clear();
mediaTypes.Clear();
}
var mediaItems = _libraryManager.GetItemList(new InternalItemsQuery(user) var searchQuery = new InternalItemsQuery(user)
{ {
NameContains = searchTerm, NameContains = searchTerm,
ExcludeItemTypes = excludeItemTypes.ToArray(excludeItemTypes.Count), ExcludeItemTypes = excludeItemTypes.ToArray(excludeItemTypes.Count),
@ -178,7 +183,7 @@ namespace Emby.Server.Implementations.Library
IsNews = query.IsNews, IsNews = query.IsNews,
IsSeries = query.IsSeries, IsSeries = query.IsSeries,
IsSports = query.IsSports, IsSports = query.IsSports,
MediaTypes = query.MediaTypes, MediaTypes = mediaTypes.ToArray(),
DtoOptions = new DtoOptions DtoOptions = new DtoOptions
{ {
@ -189,17 +194,33 @@ namespace Emby.Server.Implementations.Library
ItemFields.ChannelInfo ItemFields.ChannelInfo
} }
} }
}); };
List<BaseItem> mediaItems;
if (searchQuery.IncludeItemTypes.Length == 1 && string.Equals(searchQuery.IncludeItemTypes[0], "MusicArtist", StringComparison.OrdinalIgnoreCase))
{
if (searchQuery.ParentId.HasValue)
{
searchQuery.AncestorIds = new string[] { searchQuery.ParentId.Value.ToString("N") };
}
searchQuery.ParentId = null;
searchQuery.IncludeItemsByName = true;
searchQuery.IncludeItemTypes = new string[] { };
mediaItems = _libraryManager.GetArtists(searchQuery).Items.Select(i => i.Item1).ToList();
}
else
{
mediaItems = _libraryManager.GetItemList(searchQuery);
}
// Add search hints based on item name var returnValue = mediaItems.Select(item =>
hints.AddRange(mediaItems.Select(item =>
{ {
var index = GetIndex(item.Name, searchTerm, terms); var index = GetIndex(item.Name, searchTerm, terms);
return new Tuple<BaseItem, string, int>(item, index.Item1, index.Item2); return new Tuple<BaseItem, string, int>(item, index.Item1, index.Item2);
}));
var returnValue = hints.Where(i => i.Item3 >= 0).OrderBy(i => i.Item3).ThenBy(i => i.Item1.SortName).Select(i => new SearchHintInfo }).OrderBy(i => i.Item3).ThenBy(i => i.Item1.SortName).Select(i => new SearchHintInfo
{ {
Item = i.Item1, Item = i.Item1,
MatchedTerm = i.Item2 MatchedTerm = i.Item2

@ -44,7 +44,7 @@ namespace Emby.Server.Implementations.LiveTv.TunerHosts
EnableStreamSharing = true; EnableStreamSharing = true;
SharedStreamIds = new List<string>(); SharedStreamIds = new List<string>();
UniqueId = Guid.NewGuid().ToString("N"); UniqueId = Guid.NewGuid().ToString("N");
TempFilePath = Path.Combine(appPaths.TranscodingTempPath, UniqueId + ".ts"); TempFilePath = Path.Combine(appPaths.GetTranscodingTempPath(), UniqueId + ".ts");
} }
public virtual Task Open(CancellationToken openCancellationToken) public virtual Task Open(CancellationToken openCancellationToken)

@ -87,10 +87,5 @@
"User": "User", "User": "User",
"System": "System", "System": "System",
"Application": "Application", "Application": "Application",
"Plugin": "Plugin", "Plugin": "Plugin"
"LabelExit": "Exit",
"LabelVisitCommunity": "Visit Community",
"LabelBrowseLibrary": "Browse Library",
"LabelConfigureServer": "Configure Emby",
"LabelRestartServer": "Restart Server"
} }

@ -2,31 +2,31 @@
"Latest": "Leg\u00fajabb", "Latest": "Leg\u00fajabb",
"ValueSpecialEpisodeName": "Special - {0}", "ValueSpecialEpisodeName": "Special - {0}",
"Inherit": "Inherit", "Inherit": "Inherit",
"Books": "Books", "Books": "K\u00f6nyvek",
"Music": "Music", "Music": "Zene",
"Games": "Games", "Games": "J\u00e1t\u00e9kok",
"Photos": "Photos", "Photos": "F\u00e9nyk\u00e9pek",
"MixedContent": "Mixed content", "MixedContent": "Vegyes tartalom",
"MusicVideos": "Music videos", "MusicVideos": "Zenei Vide\u00f3k",
"HomeVideos": "Home videos", "HomeVideos": "H\u00e1zi vide\u00f3k",
"Playlists": "Playlists", "Playlists": "Lej\u00e1tsz\u00e1si list\u00e1k",
"HeaderRecordingGroups": "Recording Groups", "HeaderRecordingGroups": "Recording Groups",
"HeaderContinueWatching": "Vet\u00edt\u00e9s(ek) folytat\u00e1sa", "HeaderContinueWatching": "Vet\u00edt\u00e9s(ek) folytat\u00e1sa",
"HeaderFavoriteArtists": "Favorite Artists", "HeaderFavoriteArtists": "Kedvenc M\u0171v\u00e9szek",
"HeaderFavoriteSongs": "Favorite Songs", "HeaderFavoriteSongs": "Kedvenc Dalok",
"HeaderAlbumArtists": "Album Artists", "HeaderAlbumArtists": "Album El\u0151ad\u00f3k",
"HeaderFavoriteAlbums": "Favorite Albums", "HeaderFavoriteAlbums": "Kedvenc Albumok",
"HeaderFavoriteEpisodes": "Kedvenc Epiz\u00f3dok", "HeaderFavoriteEpisodes": "Kedvenc Epiz\u00f3dok",
"HeaderFavoriteShows": "Kedvenc M\u0171sorok", "HeaderFavoriteShows": "Kedvenc M\u0171sorok",
"HeaderNextUp": "K\u00f6vetkezik", "HeaderNextUp": "K\u00f6vetkezik",
"Favorites": "Favorites", "Favorites": "Kedvencek",
"Collections": "Gy\u0171jtem\u00e9nyek", "Collections": "Gy\u0171jtem\u00e9nyek",
"Channels": "Csatorn\u00e1k", "Channels": "Csatorn\u00e1k",
"Movies": "Movies", "Movies": "Filmek",
"Albums": "Albums", "Albums": "Albumok",
"Artists": "Artists", "Artists": "El\u0151ad\u00f3k",
"Folders": "Folders", "Folders": "K\u00f6nyvt\u00e1rak",
"Songs": "Songs", "Songs": "Dalok",
"TvShows": "TV Shows", "TvShows": "TV Shows",
"Shows": "Shows", "Shows": "Shows",
"Genres": "M\u0171fajok", "Genres": "M\u0171fajok",
@ -38,15 +38,15 @@
"ScheduledTaskFailedWithName": "{0} failed", "ScheduledTaskFailedWithName": "{0} failed",
"LabelRunningTimeValue": "Running time: {0}", "LabelRunningTimeValue": "Running time: {0}",
"ScheduledTaskStartedWithName": "{0} started", "ScheduledTaskStartedWithName": "{0} started",
"VersionNumber": "Version {0}", "VersionNumber": "Verzi\u00f3 {0}",
"PluginInstalledWithName": "{0} telep\u00edtve", "PluginInstalledWithName": "{0} telep\u00edtve",
"StartupEmbyServerIsLoading": "Emby Szerver bet\u00f6lt\u0151dik. K\u00e9rj\u00fck, pr\u00f3b\u00e1ld meg \u00fajra k\u00e9s\u0151bb.", "StartupEmbyServerIsLoading": "Emby Szerver bet\u00f6lt\u0151dik. K\u00e9rj\u00fck, pr\u00f3b\u00e1ld meg \u00fajra k\u00e9s\u0151bb.",
"PluginUpdatedWithName": "{0} was updated", "PluginUpdatedWithName": "{0} friss\u00edtve",
"PluginUninstalledWithName": "{0} elt\u00e1vol\u00edtva", "PluginUninstalledWithName": "{0} elt\u00e1vol\u00edtva",
"ItemAddedWithName": "{0} was added to the library", "ItemAddedWithName": "{0} was added to the library",
"ItemRemovedWithName": "{0} was removed from the library", "ItemRemovedWithName": "{0} was removed from the library",
"LabelIpAddressValue": "Ip address: {0}", "LabelIpAddressValue": "Ip c\u00edm: {0}",
"DeviceOnlineWithName": "{0} is connected", "DeviceOnlineWithName": "{0} bel\u00e9pett",
"UserOnlineFromDevice": "{0} is online from {1}", "UserOnlineFromDevice": "{0} is online from {1}",
"ProviderValue": "Provider: {0}", "ProviderValue": "Provider: {0}",
"SubtitlesDownloadedForItem": "Subtitles downloaded for {0}", "SubtitlesDownloadedForItem": "Subtitles downloaded for {0}",

@ -308,6 +308,19 @@ namespace Emby.Server.Implementations.Localization
return value == null ? (int?)null : value.Value; return value == null ? (int?)null : value.Value;
} }
public bool HasUnicodeCategory(string value, UnicodeCategory category)
{
foreach (var chr in value)
{
if (char.GetUnicodeCategory(chr) == category)
{
return true;
}
}
return false;
}
public string GetLocalizedString(string phrase) public string GetLocalizedString(string phrase)
{ {
return GetLocalizedString(phrase, _configurationManager.Configuration.UICulture); return GetLocalizedString(phrase, _configurationManager.Configuration.UICulture);

@ -206,6 +206,23 @@ namespace Emby.Server.Implementations
} }
} }
public string GetTranscodingTempPath()
{
var path = TranscodingTempPath;
try
{
Directory.CreateDirectory(path);
return path;
}
catch
{
path = Path.Combine(ProgramDataPath, "transcoding-temp");
Directory.CreateDirectory(path);
return path;
}
}
/// <summary> /// <summary>
/// Gets the game genre path. /// Gets the game genre path.
/// </summary> /// </summary>

@ -3,7 +3,7 @@
<package id="Emby.XmlTv" version="1.0.10" targetFramework="net46" /> <package id="Emby.XmlTv" version="1.0.10" targetFramework="net46" />
<package id="ServiceStack.Text" version="4.5.8" targetFramework="net46" /> <package id="ServiceStack.Text" version="4.5.8" targetFramework="net46" />
<package id="SharpCompress" version="0.18.2" targetFramework="net46" /> <package id="SharpCompress" version="0.18.2" targetFramework="net46" />
<package id="SimpleInjector" version="4.0.8" targetFramework="net46" /> <package id="SimpleInjector" version="4.0.12" targetFramework="net46" />
<package id="SQLitePCL.pretty" version="1.1.0" targetFramework="portable45-net45+win8" /> <package id="SQLitePCL.pretty" version="1.1.0" targetFramework="portable45-net45+win8" />
<package id="SQLitePCLRaw.core" version="1.1.8" targetFramework="net46" /> <package id="SQLitePCLRaw.core" version="1.1.8" targetFramework="net46" />
</packages> </packages>

@ -134,8 +134,6 @@ namespace MediaBrowser.Api
public void Post(AutoSetMetadataOptions request) public void Post(AutoSetMetadataOptions request)
{ {
_configurationManager.DisableMetadataService("Emby Xml");
_configurationManager.SaveConfiguration();
} }
/// <summary> /// <summary>

@ -63,7 +63,7 @@ namespace MediaBrowser.Api
public void Post(ReportStartupWizardComplete request) public void Post(ReportStartupWizardComplete request)
{ {
_config.Configuration.IsStartupWizardCompleted = true; _config.Configuration.IsStartupWizardCompleted = true;
SetWizardFinishValues(_config.Configuration); _config.SetOptimalValues();
_config.SaveConfiguration(); _config.SaveConfiguration();
} }
@ -87,16 +87,6 @@ namespace MediaBrowser.Api
return result; return result;
} }
private void SetWizardFinishValues(ServerConfiguration config)
{
config.EnableCaseSensitiveItemIds = true;
config.SkipDeserializationForBasicTypes = true;
config.EnableSimpleArtistDetection = true;
config.EnableNormalizedItemByNameIds = true;
config.DisableLiveTvChannelUserDataName = true;
config.EnableNewOmdbSupport = true;
}
public void Post(UpdateStartupConfiguration request) public void Post(UpdateStartupConfiguration request)
{ {
_config.Configuration.UICulture = request.UICulture; _config.Configuration.UICulture = request.UICulture;

@ -20,10 +20,6 @@ namespace MediaBrowser.Controller.Configuration
/// <value>The configuration.</value> /// <value>The configuration.</value>
ServerConfiguration Configuration { get; } ServerConfiguration Configuration { get; }
/// <summary> bool SetOptimalValues();
/// Sets the preferred metadata service.
/// </summary>
/// <param name="service">The service.</param>
void DisableMetadataService(string service);
} }
} }

@ -1987,6 +1987,10 @@ namespace MediaBrowser.Controller.Entities
image.Path = file.FullName; image.Path = file.FullName;
image.DateModified = imageInfo.DateModified; image.DateModified = imageInfo.DateModified;
// reset these values
image.Width = 0;
image.Height = 0;
} }
} }
@ -2137,6 +2141,7 @@ namespace MediaBrowser.Controller.Entities
var newImageList = new List<FileSystemMetadata>(); var newImageList = new List<FileSystemMetadata>();
var imageAdded = false; var imageAdded = false;
var imageUpdated = false;
foreach (var newImage in images) foreach (var newImage in images)
{ {
@ -2157,7 +2162,17 @@ namespace MediaBrowser.Controller.Entities
{ {
if (existing.IsLocalFile) if (existing.IsLocalFile)
{ {
existing.DateModified = FileSystem.GetLastWriteTimeUtc(newImage); var newDateModified = FileSystem.GetLastWriteTimeUtc(newImage);
// If date changed then we need to reset saved image dimensions
if (existing.DateModified != newDateModified && (existing.Width > 0 || existing.Height > 0))
{
existing.Width = 0;
existing.Height = 0;
imageUpdated = true;
}
existing.DateModified = newDateModified;
} }
} }
} }
@ -2190,7 +2205,7 @@ namespace MediaBrowser.Controller.Entities
ImageInfos = newList; ImageInfos = newList;
} }
return newImageList.Count > 0; return imageUpdated || newImageList.Count > 0;
} }
private ItemImageInfo GetImageInfo(FileSystemMetadata file, ImageType type) private ItemImageInfo GetImageInfo(FileSystemMetadata file, ImageType type)

@ -108,5 +108,7 @@ namespace MediaBrowser.Controller
string InternalMetadataPath { get; } string InternalMetadataPath { get; }
string ArtistsPath { get; } string ArtistsPath { get; }
string GetTranscodingTempPath();
} }
} }

@ -1,9 +0,0 @@
using System;
namespace MediaBrowser.Model.Dlna
{
public class PlaybackException : Exception
{
public PlaybackErrorCode ErrorCode { get; set;}
}
}

@ -965,15 +965,6 @@ namespace MediaBrowser.Model.Dlna
return new Tuple<PlayMethod?, List<TranscodeReason>>(PlayMethod.DirectStream, new List<TranscodeReason>()); return new Tuple<PlayMethod?, List<TranscodeReason>>(PlayMethod.DirectStream, new List<TranscodeReason>());
} }
if (videoStream == null)
{
_logger.Info("Profile: {0}, Cannot direct stream with no known video stream. Path: {1}",
profile.Name ?? "Unknown Profile",
mediaSource.Path ?? "Unknown path");
return new Tuple<PlayMethod?, List<TranscodeReason>>(null, new List<TranscodeReason> { TranscodeReason.UnknownVideoStreamInfo });
}
// See if it can be direct played // See if it can be direct played
DirectPlayProfile directPlay = null; DirectPlayProfile directPlay = null;
foreach (DirectPlayProfile i in profile.DirectPlayProfiles) foreach (DirectPlayProfile i in profile.DirectPlayProfiles)

@ -1,5 +1,6 @@
using System.Collections.Generic; using System.Collections.Generic;
using MediaBrowser.Model.Entities; using MediaBrowser.Model.Entities;
using System.Globalization;
namespace MediaBrowser.Model.Globalization namespace MediaBrowser.Model.Globalization
{ {
@ -54,5 +55,7 @@ namespace MediaBrowser.Model.Globalization
string RemoveDiacritics(string text); string RemoveDiacritics(string text);
string NormalizeFormKD(string text); string NormalizeFormKD(string text);
bool HasUnicodeCategory(string value, UnicodeCategory category);
} }
} }

@ -98,7 +98,6 @@
<Compile Include="Dlna\ResponseProfile.cs" /> <Compile Include="Dlna\ResponseProfile.cs" />
<Compile Include="Dlna\StreamInfoSorter.cs" /> <Compile Include="Dlna\StreamInfoSorter.cs" />
<Compile Include="Dlna\PlaybackErrorCode.cs" /> <Compile Include="Dlna\PlaybackErrorCode.cs" />
<Compile Include="Dlna\PlaybackException.cs" />
<Compile Include="Dlna\ResolutionConfiguration.cs" /> <Compile Include="Dlna\ResolutionConfiguration.cs" />
<Compile Include="Dlna\ResolutionNormalizer.cs" /> <Compile Include="Dlna\ResolutionNormalizer.cs" />
<Compile Include="Dlna\ResolutionOptions.cs" /> <Compile Include="Dlna\ResolutionOptions.cs" />

@ -412,7 +412,18 @@ namespace MediaBrowser.Providers.Manager
} }
else else
{ {
currentImage.DateModified = _fileSystem.GetLastWriteTimeUtc(image.FileInfo);
var newDateModified = _fileSystem.GetLastWriteTimeUtc(image.FileInfo);
// If date changed then we need to reset saved image dimensions
if (currentImage.DateModified != newDateModified && (currentImage.Width > 0 || currentImage.Height > 0))
{
currentImage.Width = 0;
currentImage.Height = 0;
changed = true;
}
currentImage.DateModified = newDateModified;
} }
} }
else else

@ -92,7 +92,11 @@ namespace MediaBrowser.Providers.MediaInfo
private string GetAudioImagePath(Audio item) private string GetAudioImagePath(Audio item)
{ {
var filename = item.Album ?? string.Empty; string filename;
if (item.GetType() == typeof(Audio))
{
filename = item.Album ?? string.Empty;
filename += string.Join(",", item.Artists); filename += string.Join(",", item.Artists);
if (!string.IsNullOrWhiteSpace(item.Album)) if (!string.IsNullOrWhiteSpace(item.Album))
@ -109,6 +113,12 @@ namespace MediaBrowser.Providers.MediaInfo
} }
filename = filename.GetMD5() + ".jpg"; filename = filename.GetMD5() + ".jpg";
}
else
{
// If it's an audio book or audio podcast, allow unique image per item
filename = item.Id.ToString("N") + ".jpg";
}
var prefix = filename.Substring(0, 1); var prefix = filename.Substring(0, 1);

@ -163,7 +163,11 @@ namespace MediaBrowser.Providers.MediaInfo
private void FetchShortcutInfo(Video video) private void FetchShortcutInfo(Video video)
{ {
video.ShortcutPath = _fileSystem.ReadAllText(video.Path); video.ShortcutPath = _fileSystem.ReadAllText(video.Path)
.Replace("\t", string.Empty)
.Replace("\r", string.Empty)
.Replace("\n", string.Empty)
.Trim();
} }
public Task<ItemUpdateType> FetchAudioInfo<T>(T item, CancellationToken cancellationToken) public Task<ItemUpdateType> FetchAudioInfo<T>(T item, CancellationToken cancellationToken)

@ -9,6 +9,7 @@ using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging; using MediaBrowser.Model.Logging;
using Emby.Drawing.Skia; using Emby.Drawing.Skia;
using MediaBrowser.Model.System; using MediaBrowser.Model.System;
using MediaBrowser.Model.Globalization;
namespace MediaBrowser.Server.Startup.Common namespace MediaBrowser.Server.Startup.Common
{ {
@ -20,13 +21,14 @@ namespace MediaBrowser.Server.Startup.Common
StartupOptions startupOptions, StartupOptions startupOptions,
Func<IHttpClient> httpClient, Func<IHttpClient> httpClient,
IApplicationPaths appPaths, IApplicationPaths appPaths,
IEnvironmentInfo environment) IEnvironmentInfo environment,
ILocalizationManager localizationManager)
{ {
if (!startupOptions.ContainsOption("-enablegdi")) if (!startupOptions.ContainsOption("-enablegdi"))
{ {
try try
{ {
return new SkiaEncoder(logManager.GetLogger("Skia"), appPaths, httpClient, fileSystem); return new SkiaEncoder(logManager.GetLogger("Skia"), appPaths, httpClient, fileSystem, localizationManager);
} }
catch (Exception ex) catch (Exception ex)
{ {

@ -58,11 +58,11 @@
<Reference Include="SharpCompress, Version=0.18.2.0, Culture=neutral, PublicKeyToken=afb0a02973931d96, processorArchitecture=MSIL"> <Reference Include="SharpCompress, Version=0.18.2.0, Culture=neutral, PublicKeyToken=afb0a02973931d96, processorArchitecture=MSIL">
<HintPath>..\packages\SharpCompress.0.18.2\lib\net45\SharpCompress.dll</HintPath> <HintPath>..\packages\SharpCompress.0.18.2\lib\net45\SharpCompress.dll</HintPath>
</Reference> </Reference>
<Reference Include="SimpleInjector, Version=4.0.8.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL"> <Reference Include="SimpleInjector, Version=4.0.12.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
<HintPath>..\packages\SimpleInjector.4.0.8\lib\net45\SimpleInjector.dll</HintPath> <HintPath>..\packages\SimpleInjector.4.0.12\lib\net45\SimpleInjector.dll</HintPath>
</Reference> </Reference>
<Reference Include="SkiaSharp, Version=1.58.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL"> <Reference Include="SkiaSharp, Version=1.59.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
<HintPath>..\packages\SkiaSharp.1.58.1\lib\net45\SkiaSharp.dll</HintPath> <HintPath>..\packages\SkiaSharp.1.59.2\lib\net45\SkiaSharp.dll</HintPath>
</Reference> </Reference>
<Reference Include="SQLitePCLRaw.core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1488e028ca7ab535, processorArchitecture=MSIL"> <Reference Include="SQLitePCLRaw.core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1488e028ca7ab535, processorArchitecture=MSIL">
<HintPath>..\packages\SQLitePCLRaw.core.1.1.8\lib\net45\SQLitePCLRaw.core.dll</HintPath> <HintPath>..\packages\SQLitePCLRaw.core.1.1.8\lib\net45\SQLitePCLRaw.core.dll</HintPath>

@ -127,7 +127,7 @@ namespace MediaBrowser.Server.Mono
Task.WaitAll(task); Task.WaitAll(task);
appHost.ImageProcessor.ImageEncoder = ImageEncoderHelper.GetImageEncoder(_logger, logManager, fileSystem, options, () => appHost.HttpClient, appPaths, environmentInfo); appHost.ImageProcessor.ImageEncoder = ImageEncoderHelper.GetImageEncoder(_logger, logManager, fileSystem, options, () => appHost.HttpClient, appPaths, environmentInfo, appHost.LocalizationManager);
Console.WriteLine("Running startup tasks"); Console.WriteLine("Running startup tasks");

@ -3,8 +3,8 @@
<package id="Mono.Posix" version="4.0.0.0" targetFramework="net45" /> <package id="Mono.Posix" version="4.0.0.0" targetFramework="net45" />
<package id="ServiceStack.Text" version="4.5.8" targetFramework="net46" /> <package id="ServiceStack.Text" version="4.5.8" targetFramework="net46" />
<package id="SharpCompress" version="0.18.2" targetFramework="net46" /> <package id="SharpCompress" version="0.18.2" targetFramework="net46" />
<package id="SimpleInjector" version="4.0.8" targetFramework="net46" /> <package id="SimpleInjector" version="4.0.12" targetFramework="net46" />
<package id="SkiaSharp" version="1.58.1" targetFramework="net46" /> <package id="SkiaSharp" version="1.59.2" targetFramework="net46" />
<package id="SQLitePCLRaw.core" version="1.1.8" targetFramework="net46" /> <package id="SQLitePCLRaw.core" version="1.1.8" targetFramework="net46" />
<package id="SQLitePCLRaw.provider.sqlite3.net45" version="1.1.8" targetFramework="net46" /> <package id="SQLitePCLRaw.provider.sqlite3.net45" version="1.1.8" targetFramework="net46" />
</packages> </packages>

@ -7,6 +7,7 @@ using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Drawing; using MediaBrowser.Controller.Drawing;
using MediaBrowser.Model.IO; using MediaBrowser.Model.IO;
using MediaBrowser.Model.Logging; using MediaBrowser.Model.Logging;
using MediaBrowser.Model.Globalization;
namespace MediaBrowser.Server.Startup.Common namespace MediaBrowser.Server.Startup.Common
{ {
@ -17,11 +18,12 @@ namespace MediaBrowser.Server.Startup.Common
IFileSystem fileSystem, IFileSystem fileSystem,
StartupOptions startupOptions, StartupOptions startupOptions,
Func<IHttpClient> httpClient, Func<IHttpClient> httpClient,
IApplicationPaths appPaths) IApplicationPaths appPaths,
ILocalizationManager localizationManager)
{ {
try try
{ {
return new SkiaEncoder(logManager.GetLogger("Skia"), appPaths, httpClient, fileSystem); return new SkiaEncoder(logManager.GetLogger("Skia"), appPaths, httpClient, fileSystem, localizationManager);
} }
catch catch
{ {

@ -304,6 +304,19 @@ namespace MediaBrowser.ServerApplication
} }
} }
private static string UpdatePackageFileName
{
get
{
if (Environment.Is64BitOperatingSystem)
{
return "embyserver-win-x64-{version}.zip";
}
return "embyserver-win-x86-{version}.zip";
}
}
/// <summary> /// <summary>
/// Runs the application. /// Runs the application.
/// </summary> /// </summary>
@ -324,7 +337,7 @@ namespace MediaBrowser.ServerApplication
options, options,
fileSystem, fileSystem,
new PowerManagement(), new PowerManagement(),
"emby.windows.zip", UpdatePackageFileName,
environmentInfo, environmentInfo,
new NullImageEncoder(), new NullImageEncoder(),
new SystemEvents(logManager.GetLogger("SystemEvents")), new SystemEvents(logManager.GetLogger("SystemEvents")),
@ -355,7 +368,7 @@ namespace MediaBrowser.ServerApplication
} }
// set image encoder here // set image encoder here
appHost.ImageProcessor.ImageEncoder = ImageEncoderHelper.GetImageEncoder(_logger, logManager, fileSystem, options, () => appHost.HttpClient, appPaths); appHost.ImageProcessor.ImageEncoder = ImageEncoderHelper.GetImageEncoder(_logger, logManager, fileSystem, options, () => appHost.HttpClient, appPaths, appHost.LocalizationManager);
task = task.ContinueWith(new Action<Task>(a => appHost.RunStartupTasks()), TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.AttachedToParent); task = task.ContinueWith(new Action<Task>(a => appHost.RunStartupTasks()), TaskContinuationOptions.OnlyOnRanToCompletion | TaskContinuationOptions.AttachedToParent);

@ -80,11 +80,11 @@
<Reference Include="SharpCompress, Version=0.18.2.0, Culture=neutral, PublicKeyToken=afb0a02973931d96, processorArchitecture=MSIL"> <Reference Include="SharpCompress, Version=0.18.2.0, Culture=neutral, PublicKeyToken=afb0a02973931d96, processorArchitecture=MSIL">
<HintPath>..\packages\SharpCompress.0.18.2\lib\net45\SharpCompress.dll</HintPath> <HintPath>..\packages\SharpCompress.0.18.2\lib\net45\SharpCompress.dll</HintPath>
</Reference> </Reference>
<Reference Include="SimpleInjector, Version=4.0.8.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL"> <Reference Include="SimpleInjector, Version=4.0.12.0, Culture=neutral, PublicKeyToken=984cb50dea722e99, processorArchitecture=MSIL">
<HintPath>..\packages\SimpleInjector.4.0.8\lib\net45\SimpleInjector.dll</HintPath> <HintPath>..\packages\SimpleInjector.4.0.12\lib\net45\SimpleInjector.dll</HintPath>
</Reference> </Reference>
<Reference Include="SkiaSharp, Version=1.58.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL"> <Reference Include="SkiaSharp, Version=1.59.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756, processorArchitecture=MSIL">
<HintPath>..\packages\SkiaSharp.1.58.1\lib\net45\SkiaSharp.dll</HintPath> <HintPath>..\packages\SkiaSharp.1.59.2\lib\net45\SkiaSharp.dll</HintPath>
</Reference> </Reference>
<Reference Include="SQLitePCLRaw.core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1488e028ca7ab535, processorArchitecture=MSIL"> <Reference Include="SQLitePCLRaw.core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=1488e028ca7ab535, processorArchitecture=MSIL">
<HintPath>..\packages\SQLitePCLRaw.core.1.1.8\lib\net45\SQLitePCLRaw.core.dll</HintPath> <HintPath>..\packages\SQLitePCLRaw.core.1.1.8\lib\net45\SQLitePCLRaw.core.dll</HintPath>
@ -161,11 +161,11 @@
</EmbeddedResource> </EmbeddedResource>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Content Include="..\packages\SkiaSharp.1.58.1\runtimes\win7-x64\native\libSkiaSharp.dll"> <Content Include="..\packages\SkiaSharp.1.59.2\runtimes\win7-x64\native\libSkiaSharp.dll">
<Link>x64\libSkiaSharp.dll</Link> <Link>x64\libSkiaSharp.dll</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>
<Content Include="..\packages\SkiaSharp.1.58.1\runtimes\win7-x86\native\libSkiaSharp.dll"> <Content Include="..\packages\SkiaSharp.1.59.2\runtimes\win7-x86\native\libSkiaSharp.dll">
<Link>x86\libSkiaSharp.dll</Link> <Link>x86\libSkiaSharp.dll</Link>
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content> </Content>

@ -144,12 +144,12 @@ namespace MediaBrowser.ServerApplication
{ {
_uiCulture = _configurationManager.Configuration.UICulture; _uiCulture = _configurationManager.Configuration.UICulture;
cmdExit.Text = _localization.GetLocalizedString("LabelExit"); cmdExit.Text = "Exit";
cmdCommunity.Text = _localization.GetLocalizedString("LabelVisitCommunity"); cmdCommunity.Text = "Visit Emby Community";
cmdPremiere.Text = _localization.GetLocalizedString("Emby Premiere"); cmdPremiere.Text = "Emby Premiere";
cmdBrowse.Text = _localization.GetLocalizedString("LabelBrowseLibrary"); cmdBrowse.Text = "Browse Library";
cmdConfigure.Text = _localization.GetLocalizedString("LabelConfigureServer"); cmdConfigure.Text = "Configure Emby Server";
cmdRestart.Text = _localization.GetLocalizedString("LabelRestartServer"); cmdRestart.Text = "Restart Emby Server";
} }
private string _uiCulture; private string _uiCulture;

@ -2,8 +2,8 @@
<packages> <packages>
<package id="ServiceStack.Text" version="4.5.8" targetFramework="net462" /> <package id="ServiceStack.Text" version="4.5.8" targetFramework="net462" />
<package id="SharpCompress" version="0.18.2" targetFramework="net462" /> <package id="SharpCompress" version="0.18.2" targetFramework="net462" />
<package id="SimpleInjector" version="4.0.8" targetFramework="net462" /> <package id="SimpleInjector" version="4.0.12" targetFramework="net462" />
<package id="SkiaSharp" version="1.58.1" targetFramework="net462" /> <package id="SkiaSharp" version="1.59.2" targetFramework="net462" />
<package id="SQLitePCLRaw.core" version="1.1.8" targetFramework="net462" /> <package id="SQLitePCLRaw.core" version="1.1.8" targetFramework="net462" />
<package id="SQLitePCLRaw.provider.sqlite3.net45" version="1.1.8" targetFramework="net462" /> <package id="SQLitePCLRaw.provider.sqlite3.net45" version="1.1.8" targetFramework="net462" />
</packages> </packages>
Loading…
Cancel
Save