aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--MediaBrowser.Api/BaseApiService.cs128
-rw-r--r--MediaBrowser.Api/Images/ImageService.cs8
-rw-r--r--MediaBrowser.Api/UserLibrary/ArtistsService.cs6
-rw-r--r--MediaBrowser.Api/UserLibrary/GenresService.cs6
-rw-r--r--MediaBrowser.Api/UserLibrary/ItemByNameUserDataService.cs16
-rw-r--r--MediaBrowser.Api/UserLibrary/PersonsService.cs6
-rw-r--r--MediaBrowser.Api/UserLibrary/StudiosService.cs6
-rw-r--r--MediaBrowser.Controller/Providers/MediaInfo/BaseFFProbeProvider.cs62
-rw-r--r--MediaBrowser.Controller/Providers/MediaInfo/FFProbeAudioInfoProvider.cs12
-rw-r--r--MediaBrowser.Controller/Providers/MediaInfo/FFProbeVideoInfoProvider.cs31
-rw-r--r--MediaBrowser.WebDashboard/ApiClient.js4
-rw-r--r--MediaBrowser.WebDashboard/packages.config2
12 files changed, 163 insertions, 124 deletions
diff --git a/MediaBrowser.Api/BaseApiService.cs b/MediaBrowser.Api/BaseApiService.cs
index 23d9b0126..e8af6ab13 100644
--- a/MediaBrowser.Api/BaseApiService.cs
+++ b/MediaBrowser.Api/BaseApiService.cs
@@ -1,5 +1,8 @@
-using MediaBrowser.Common.Net;
+using System.Linq;
+using System.Threading.Tasks;
+using MediaBrowser.Common.Net;
using MediaBrowser.Controller.Entities;
+using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Library;
using MediaBrowser.Controller.Session;
using MediaBrowser.Model.Logging;
@@ -33,7 +36,7 @@ namespace MediaBrowser.Api
/// </summary>
/// <value>The request context.</value>
public IRequestContext RequestContext { get; set; }
-
+
/// <summary>
/// To the optimized result.
/// </summary>
@@ -88,6 +91,123 @@ namespace MediaBrowser.Api
{
return ResultFactory.GetStaticFileResult(RequestContext, path);
}
+
+ private readonly char[] _dashReplaceChars = new[] { '?', '/' };
+ private const char SlugChar = '-';
+
+ protected Task<Artist> GetArtist(string name, ILibraryManager libraryManager)
+ {
+ return libraryManager.GetArtist(DeSlugArtistName(name, libraryManager));
+ }
+
+ protected Task<Studio> GetStudio(string name, ILibraryManager libraryManager)
+ {
+ return libraryManager.GetStudio(DeSlugStudioName(name, libraryManager));
+ }
+
+ protected Task<Genre> GetGenre(string name, ILibraryManager libraryManager)
+ {
+ return libraryManager.GetGenre(DeSlugGenreName(name, libraryManager));
+ }
+
+ protected Task<Person> GetPerson(string name, ILibraryManager libraryManager)
+ {
+ return libraryManager.GetPerson(DeSlugPersonName(name, libraryManager));
+ }
+
+ /// <summary>
+ /// Deslugs an artist name by finding the correct entry in the library
+ /// </summary>
+ /// <param name="name"></param>
+ /// <param name="libraryManager"></param>
+ /// <returns></returns>
+ protected string DeSlugArtistName(string name, ILibraryManager libraryManager)
+ {
+ if (name.IndexOf(SlugChar) == -1)
+ {
+ return name;
+ }
+
+ return libraryManager.RootFolder.RecursiveChildren
+ .OfType<Audio>()
+ .SelectMany(i => new[] { i.Artist, i.AlbumArtist })
+ .Where(i => !string.IsNullOrEmpty(i))
+ .Distinct(StringComparer.OrdinalIgnoreCase)
+ .FirstOrDefault(i =>
+ {
+ i = _dashReplaceChars.Aggregate(i, (current, c) => current.Replace(c, SlugChar));
+
+ return string.Equals(i, name, StringComparison.OrdinalIgnoreCase);
+
+ }) ?? name;
+ }
+
+ /// <summary>
+ /// Deslugs a genre name by finding the correct entry in the library
+ /// </summary>
+ protected string DeSlugGenreName(string name, ILibraryManager libraryManager)
+ {
+ if (name.IndexOf(SlugChar) == -1)
+ {
+ return name;
+ }
+
+ return libraryManager.RootFolder.RecursiveChildren
+ .SelectMany(i => i.Genres)
+ .Distinct(StringComparer.OrdinalIgnoreCase)
+ .FirstOrDefault(i =>
+ {
+ i = _dashReplaceChars.Aggregate(i, (current, c) => current.Replace(c, SlugChar));
+
+ return string.Equals(i, name, StringComparison.OrdinalIgnoreCase);
+
+ }) ?? name;
+ }
+
+ /// <summary>
+ /// Deslugs a studio name by finding the correct entry in the library
+ /// </summary>
+ protected string DeSlugStudioName(string name, ILibraryManager libraryManager)
+ {
+ if (name.IndexOf(SlugChar) == -1)
+ {
+ return name;
+ }
+
+ return libraryManager.RootFolder.RecursiveChildren
+ .SelectMany(i => i.Studios)
+ .Distinct(StringComparer.OrdinalIgnoreCase)
+ .FirstOrDefault(i =>
+ {
+ i = _dashReplaceChars.Aggregate(i, (current, c) => current.Replace(c, SlugChar));
+
+ return string.Equals(i, name, StringComparison.OrdinalIgnoreCase);
+
+ }) ?? name;
+ }
+
+ /// <summary>
+ /// Deslugs a person name by finding the correct entry in the library
+ /// </summary>
+ protected string DeSlugPersonName(string name, ILibraryManager libraryManager)
+ {
+ if (name.IndexOf(SlugChar) == -1)
+ {
+ return name;
+ }
+
+ return libraryManager.RootFolder.RecursiveChildren
+ .SelectMany(i => i.People)
+ .Select(i => i.Name)
+ .Distinct(StringComparer.OrdinalIgnoreCase)
+ .FirstOrDefault(i =>
+ {
+ i = _dashReplaceChars.Aggregate(i, (current, c) => current.Replace(c, SlugChar));
+
+ return string.Equals(i, name, StringComparison.OrdinalIgnoreCase);
+
+ }) ?? name;
+ }
}
/// <summary>
@@ -109,7 +229,7 @@ namespace MediaBrowser.Api
/// </summary>
/// <value>The logger.</value>
public ILogger Logger { get; set; }
-
+
/// <summary>
/// The request filter is executed before the service.
/// </summary>
@@ -170,7 +290,7 @@ namespace MediaBrowser.Api
return GetAuthorization(auth);
}
-
+
/// <summary>
/// Gets the authorization.
/// </summary>
diff --git a/MediaBrowser.Api/Images/ImageService.cs b/MediaBrowser.Api/Images/ImageService.cs
index f23144987..081ba5612 100644
--- a/MediaBrowser.Api/Images/ImageService.cs
+++ b/MediaBrowser.Api/Images/ImageService.cs
@@ -464,7 +464,7 @@ namespace MediaBrowser.Api.Images
/// <returns>System.Object.</returns>
public object Get(GetStudioImage request)
{
- var item = _libraryManager.GetStudio(request.Name).Result;
+ var item = GetStudio(request.Name, _libraryManager).Result;
return GetImage(request, item);
}
@@ -476,7 +476,7 @@ namespace MediaBrowser.Api.Images
/// <returns>System.Object.</returns>
public object Get(GetPersonImage request)
{
- var item = _libraryManager.GetPerson(request.Name).Result;
+ var item = GetPerson(request.Name, _libraryManager).Result;
return GetImage(request, item);
}
@@ -488,7 +488,7 @@ namespace MediaBrowser.Api.Images
/// <returns>System.Object.</returns>
public object Get(GetArtistImage request)
{
- var item = _libraryManager.GetArtist(request.Name).Result;
+ var item = GetArtist(request.Name, _libraryManager).Result;
return GetImage(request, item);
}
@@ -500,7 +500,7 @@ namespace MediaBrowser.Api.Images
/// <returns>System.Object.</returns>
public object Get(GetGenreImage request)
{
- var item = _libraryManager.GetGenre(request.Name).Result;
+ var item = GetGenre(request.Name, _libraryManager).Result;
return GetImage(request, item);
}
diff --git a/MediaBrowser.Api/UserLibrary/ArtistsService.cs b/MediaBrowser.Api/UserLibrary/ArtistsService.cs
index ad1007a31..6cd4ba0b7 100644
--- a/MediaBrowser.Api/UserLibrary/ArtistsService.cs
+++ b/MediaBrowser.Api/UserLibrary/ArtistsService.cs
@@ -103,7 +103,7 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>Task{BaseItemDto}.</returns>
private async Task<BaseItemDto> GetItem(GetArtist request)
{
- var item = await LibraryManager.GetArtist(request.Name).ConfigureAwait(false);
+ var item = await GetArtist(request.Name, LibraryManager).ConfigureAwait(false);
// Get everything
var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true));
@@ -127,7 +127,9 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>System.Object.</returns>
public object Get(GetArtistsItemCounts request)
{
- var items = GetItems(request.UserId).OfType<Audio>().Where(i => i.HasArtist(request.Name)).ToList();
+ var name = DeSlugArtistName(request.Name, LibraryManager);
+
+ var items = GetItems(request.UserId).OfType<Audio>().Where(i => i.HasArtist(name)).ToList();
var counts = new ItemByNameCounts
{
diff --git a/MediaBrowser.Api/UserLibrary/GenresService.cs b/MediaBrowser.Api/UserLibrary/GenresService.cs
index 30094d4f3..53266571f 100644
--- a/MediaBrowser.Api/UserLibrary/GenresService.cs
+++ b/MediaBrowser.Api/UserLibrary/GenresService.cs
@@ -94,7 +94,7 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>Task{BaseItemDto}.</returns>
private async Task<BaseItemDto> GetItem(GetGenre request)
{
- var item = await LibraryManager.GetGenre(request.Name).ConfigureAwait(false);
+ var item = await GetGenre(request.Name, LibraryManager).ConfigureAwait(false);
// Get everything
var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true));
@@ -156,7 +156,9 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>System.Object.</returns>
public object Get(GetGenreItemCounts request)
{
- var items = GetItems(request.UserId).Where(i => i.Genres != null && i.Genres.Contains(request.Name, StringComparer.OrdinalIgnoreCase)).ToList();
+ var name = DeSlugGenreName(request.Name, LibraryManager);
+
+ var items = GetItems(request.UserId).Where(i => i.Genres != null && i.Genres.Contains(name, StringComparer.OrdinalIgnoreCase)).ToList();
var counts = new ItemByNameCounts
{
diff --git a/MediaBrowser.Api/UserLibrary/ItemByNameUserDataService.cs b/MediaBrowser.Api/UserLibrary/ItemByNameUserDataService.cs
index a3f36afe9..835db6a17 100644
--- a/MediaBrowser.Api/UserLibrary/ItemByNameUserDataService.cs
+++ b/MediaBrowser.Api/UserLibrary/ItemByNameUserDataService.cs
@@ -212,19 +212,19 @@ namespace MediaBrowser.Api.UserLibrary
if (string.Equals(type, "Persons"))
{
- item = await LibraryManager.GetPerson(name).ConfigureAwait(false);
+ item = await GetPerson(name, LibraryManager).ConfigureAwait(false);
}
else if (string.Equals(type, "Artists"))
{
- item = await LibraryManager.GetArtist(name).ConfigureAwait(false);
+ item = await GetArtist(name, LibraryManager).ConfigureAwait(false);
}
else if (string.Equals(type, "Genres"))
{
- item = await LibraryManager.GetGenre(name).ConfigureAwait(false);
+ item = await GetGenre(name, LibraryManager).ConfigureAwait(false);
}
else if (string.Equals(type, "Studios"))
{
- item = await LibraryManager.GetStudio(name).ConfigureAwait(false);
+ item = await GetStudio(name, LibraryManager).ConfigureAwait(false);
}
else
{
@@ -256,19 +256,19 @@ namespace MediaBrowser.Api.UserLibrary
if (string.Equals(type, "Persons"))
{
- item = await LibraryManager.GetPerson(name).ConfigureAwait(false);
+ item = await GetPerson(name, LibraryManager).ConfigureAwait(false);
}
else if (string.Equals(type, "Artists"))
{
- item = await LibraryManager.GetArtist(name).ConfigureAwait(false);
+ item = await GetArtist(name, LibraryManager).ConfigureAwait(false);
}
else if (string.Equals(type, "Genres"))
{
- item = await LibraryManager.GetGenre(name).ConfigureAwait(false);
+ item = await GetGenre(name, LibraryManager).ConfigureAwait(false);
}
else if (string.Equals(type, "Studios"))
{
- item = await LibraryManager.GetStudio(name).ConfigureAwait(false);
+ item = await GetStudio(name, LibraryManager).ConfigureAwait(false);
}
else
{
diff --git a/MediaBrowser.Api/UserLibrary/PersonsService.cs b/MediaBrowser.Api/UserLibrary/PersonsService.cs
index 837e56384..105406dc3 100644
--- a/MediaBrowser.Api/UserLibrary/PersonsService.cs
+++ b/MediaBrowser.Api/UserLibrary/PersonsService.cs
@@ -109,7 +109,7 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>Task{BaseItemDto}.</returns>
private async Task<BaseItemDto> GetItem(GetPerson request)
{
- var item = await LibraryManager.GetPerson(request.Name).ConfigureAwait(false);
+ var item = await GetPerson(request.Name, LibraryManager).ConfigureAwait(false);
// Get everything
var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true));
@@ -145,7 +145,9 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>System.Object.</returns>
public object Get(GetPersonItemCounts request)
{
- var items = GetItems(request.UserId).Where(i => i.People != null && i.People.Any(p => string.Equals(p.Name, request.Name, StringComparison.OrdinalIgnoreCase))).ToList();
+ var name = DeSlugPersonName(request.Name, LibraryManager);
+
+ var items = GetItems(request.UserId).Where(i => i.People != null && i.People.Any(p => string.Equals(p.Name, name, StringComparison.OrdinalIgnoreCase))).ToList();
var counts = new ItemByNameCounts
{
diff --git a/MediaBrowser.Api/UserLibrary/StudiosService.cs b/MediaBrowser.Api/UserLibrary/StudiosService.cs
index 4e3a2d42a..59f4e40c8 100644
--- a/MediaBrowser.Api/UserLibrary/StudiosService.cs
+++ b/MediaBrowser.Api/UserLibrary/StudiosService.cs
@@ -94,7 +94,7 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>Task{BaseItemDto}.</returns>
private async Task<BaseItemDto> GetItem(GetStudio request)
{
- var item = await LibraryManager.GetStudio(request.Name).ConfigureAwait(false);
+ var item = await GetStudio(request.Name, LibraryManager).ConfigureAwait(false);
// Get everything
var fields = Enum.GetNames(typeof(ItemFields)).Select(i => (ItemFields)Enum.Parse(typeof(ItemFields), i, true));
@@ -118,7 +118,9 @@ namespace MediaBrowser.Api.UserLibrary
/// <returns>System.Object.</returns>
public object Get(GetStudioItemCounts request)
{
- var items = GetItems(request.UserId).Where(i => i.Studios != null && i.Studios.Contains(request.Name, StringComparer.OrdinalIgnoreCase)).ToList();
+ var name = DeSlugStudioName(request.Name, LibraryManager);
+
+ var items = GetItems(request.UserId).Where(i => i.Studios != null && i.Studios.Contains(name, StringComparer.OrdinalIgnoreCase)).ToList();
var counts = new ItemByNameCounts
{
diff --git a/MediaBrowser.Controller/Providers/MediaInfo/BaseFFProbeProvider.cs b/MediaBrowser.Controller/Providers/MediaInfo/BaseFFProbeProvider.cs
index 4c86e909b..bcaf4d525 100644
--- a/MediaBrowser.Controller/Providers/MediaInfo/BaseFFProbeProvider.cs
+++ b/MediaBrowser.Controller/Providers/MediaInfo/BaseFFProbeProvider.cs
@@ -8,7 +8,6 @@ using MediaBrowser.Model.Serialization;
using System;
using System.Collections.Generic;
using System.Globalization;
-using System.IO;
using System.Threading;
using System.Threading.Tasks;
@@ -28,33 +27,6 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
}
protected readonly IJsonSerializer JsonSerializer;
-
- /// <summary>
- /// Gets or sets the FF probe cache.
- /// </summary>
- /// <value>The FF probe cache.</value>
- protected FileSystemRepository FFProbeCache { get; set; }
-
- /// <summary>
- /// Initializes this instance.
- /// </summary>
- protected override void Initialize()
- {
- base.Initialize();
- FFProbeCache = new FileSystemRepository(Path.Combine(ConfigurationManager.ApplicationPaths.CachePath, CacheDirectoryName));
- }
-
- /// <summary>
- /// Gets the name of the cache directory.
- /// </summary>
- /// <value>The name of the cache directory.</value>
- protected virtual string CacheDirectoryName
- {
- get
- {
- return "ffmpeg-video-info";
- }
- }
/// <summary>
/// Gets the priority.
@@ -86,7 +58,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
{
OnPreFetch(myItem, isoMount);
- var result = await GetMediaInfo(item, isoMount, item.DateModified, FFProbeCache, cancellationToken).ConfigureAwait(false);
+ var result = await GetMediaInfo(item, isoMount, cancellationToken).ConfigureAwait(false);
cancellationToken.ThrowIfCancellationRequested();
@@ -123,39 +95,15 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
/// </summary>
/// <param name="item">The item.</param>
/// <param name="isoMount">The iso mount.</param>
- /// <param name="lastDateModified">The last date modified.</param>
- /// <param name="cache">The cache.</param>
/// <param name="cancellationToken">The cancellation token.</param>
/// <returns>Task{MediaInfoResult}.</returns>
/// <exception cref="System.ArgumentNullException">inputPath
/// or
/// cache</exception>
- private async Task<MediaInfoResult> GetMediaInfo(BaseItem item, IIsoMount isoMount, DateTime lastDateModified, FileSystemRepository cache, CancellationToken cancellationToken)
+ private async Task<MediaInfoResult> GetMediaInfo(BaseItem item, IIsoMount isoMount, CancellationToken cancellationToken)
{
- if (cache == null)
- {
- throw new ArgumentNullException("cache");
- }
-
- // Put the ffmpeg version into the cache name so that it's unique per-version
- // We don't want to try and deserialize data based on an old version, which could potentially fail
- var resourceName = item.Id + "_" + lastDateModified.Ticks + "_" + MediaEncoder.Version;
-
- // Forumulate the cache file path
- var cacheFilePath = cache.GetResourcePath(resourceName, ".js");
-
cancellationToken.ThrowIfCancellationRequested();
- // Avoid File.Exists by just trying to deserialize
- try
- {
- return JsonSerializer.DeserializeFromFile<MediaInfoResult>(cacheFilePath);
- }
- catch (FileNotFoundException)
- {
- // Cache file doesn't exist
- }
-
var type = InputType.AudioFile;
var inputPath = isoMount == null ? new[] { item.Path } : new[] { isoMount.MountedPath };
@@ -166,11 +114,7 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
inputPath = MediaEncoderHelpers.GetInputArgument(video, isoMount, out type);
}
- var info = await MediaEncoder.GetMediaInfo(inputPath, type, cancellationToken).ConfigureAwait(false);
-
- JsonSerializer.SerializeToFile(info, cacheFilePath);
-
- return info;
+ return await MediaEncoder.GetMediaInfo(inputPath, type, cancellationToken).ConfigureAwait(false);
}
/// <summary>
diff --git a/MediaBrowser.Controller/Providers/MediaInfo/FFProbeAudioInfoProvider.cs b/MediaBrowser.Controller/Providers/MediaInfo/FFProbeAudioInfoProvider.cs
index 9bd1e2811..45ee732dd 100644
--- a/MediaBrowser.Controller/Providers/MediaInfo/FFProbeAudioInfoProvider.cs
+++ b/MediaBrowser.Controller/Providers/MediaInfo/FFProbeAudioInfoProvider.cs
@@ -24,18 +24,6 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
}
/// <summary>
- /// Gets the name of the cache directory.
- /// </summary>
- /// <value>The name of the cache directory.</value>
- protected override string CacheDirectoryName
- {
- get
- {
- return "ffmpeg-audio-info";
- }
- }
-
- /// <summary>
/// Fetches the specified audio.
/// </summary>
/// <param name="audio">The audio.</param>
diff --git a/MediaBrowser.Controller/Providers/MediaInfo/FFProbeVideoInfoProvider.cs b/MediaBrowser.Controller/Providers/MediaInfo/FFProbeVideoInfoProvider.cs
index 93533b4f0..15a9b08f0 100644
--- a/MediaBrowser.Controller/Providers/MediaInfo/FFProbeVideoInfoProvider.cs
+++ b/MediaBrowser.Controller/Providers/MediaInfo/FFProbeVideoInfoProvider.cs
@@ -35,17 +35,9 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
_blurayExaminer = blurayExaminer;
_isoManager = isoManager;
-
- BdInfoCache = new FileSystemRepository(Path.Combine(ConfigurationManager.ApplicationPaths.CachePath, "bdinfo"));
}
/// <summary>
- /// Gets or sets the bd info cache.
- /// </summary>
- /// <value>The bd info cache.</value>
- private FileSystemRepository BdInfoCache { get; set; }
-
- /// <summary>
/// Gets or sets the bluray examiner.
/// </summary>
/// <value>The bluray examiner.</value>
@@ -231,7 +223,7 @@ namespace MediaBrowser.Controller.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, inputPath, BdInfoCache, cancellationToken);
+ FetchBdInfo(video, inputPath, cancellationToken);
}
AddExternalSubtitles(video);
@@ -334,29 +326,12 @@ namespace MediaBrowser.Controller.Providers.MediaInfo
/// </summary>
/// <param name="item">The item.</param>
/// <param name="inputPath">The input path.</param>
- /// <param name="bdInfoCache">The bd info cache.</param>
/// <param name="cancellationToken">The cancellation token.</param>
- private void FetchBdInfo(BaseItem item, string inputPath, FileSystemRepository bdInfoCache, CancellationToken cancellationToken)
+ private void FetchBdInfo(BaseItem item, string inputPath, CancellationToken cancellationToken)
{
var video = (Video)item;
- // Get the path to the cache file
- var cacheName = item.Id + "_" + item.DateModified.Ticks;
-
- var cacheFile = bdInfoCache.GetResourcePath(cacheName, ".js");
-
- BlurayDiscInfo result;
-
- try
- {
- result = JsonSerializer.DeserializeFromFile<BlurayDiscInfo>(cacheFile);
- }
- catch (FileNotFoundException)
- {
- result = GetBDInfo(inputPath);
-
- JsonSerializer.SerializeToFile(result, cacheFile);
- }
+ var result = GetBDInfo(inputPath);
cancellationToken.ThrowIfCancellationRequested();
diff --git a/MediaBrowser.WebDashboard/ApiClient.js b/MediaBrowser.WebDashboard/ApiClient.js
index 17f70a1d9..a6422b525 100644
--- a/MediaBrowser.WebDashboard/ApiClient.js
+++ b/MediaBrowser.WebDashboard/ApiClient.js
@@ -97,6 +97,10 @@ MediaBrowser.ApiClient = function ($, navigator, JSON, WebSocket, setTimeout) {
self.encodeName = function (name) {
+ name = name.split('/').join('-');
+
+ name = name.split('?').join('-');
+
var val = $.param({ name: name });
return val.substring(val.indexOf('=') + 1).replace("'", '%27');
};
diff --git a/MediaBrowser.WebDashboard/packages.config b/MediaBrowser.WebDashboard/packages.config
index d1529864b..3dde6a51e 100644
--- a/MediaBrowser.WebDashboard/packages.config
+++ b/MediaBrowser.WebDashboard/packages.config
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
- <package id="MediaBrowser.ApiClient.Javascript" version="3.0.105" targetFramework="net45" />
+ <package id="MediaBrowser.ApiClient.Javascript" version="3.0.108" targetFramework="net45" />
<package id="ServiceStack.Common" version="3.9.44" targetFramework="net45" />
<package id="ServiceStack.Text" version="3.9.44" targetFramework="net45" />
</packages> \ No newline at end of file