diff --git a/MediaBrowser.Api/LibraryService.cs b/MediaBrowser.Api/LibraryService.cs
index 7dc8301fe..d9442b63d 100644
--- a/MediaBrowser.Api/LibraryService.cs
+++ b/MediaBrowser.Api/LibraryService.cs
@@ -1,4 +1,5 @@
-using MediaBrowser.Controller.Dto;
+using MediaBrowser.Common.Extensions;
+using MediaBrowser.Controller.Dto;
using MediaBrowser.Controller.Entities;
using MediaBrowser.Controller.Entities.Audio;
using MediaBrowser.Controller.Entities.Movies;
@@ -32,6 +33,21 @@ namespace MediaBrowser.Api
public string Id { get; set; }
}
+ [Route("/Videos/{Id}/Subtitle/{Index}", "GET")]
+ [Api(Description = "Gets an external subtitle file")]
+ public class GetSubtitle
+ {
+ ///
+ /// Gets or sets the id.
+ ///
+ /// The id.
+ [ApiMember(Name = "Id", Description = "Item Id", IsRequired = true, DataType = "string", ParameterType = "path", Verb = "GET")]
+ public string Id { get; set; }
+
+ [ApiMember(Name = "Index", Description = "The subtitle stream index", IsRequired = true, DataType = "int", ParameterType = "path", Verb = "GET")]
+ public int Index { get; set; }
+ }
+
///
/// Class GetCriticReviews
///
@@ -240,6 +256,25 @@ namespace MediaBrowser.Api
return ToStaticFileResult(item.Path);
}
+ public object Get(GetSubtitle request)
+ {
+ var subtitleStream = _itemRepo.GetMediaStreams(new MediaStreamQuery
+ {
+
+ Index = request.Index,
+ ItemId = new Guid(request.Id),
+ Type = MediaStreamType.Subtitle
+
+ }).FirstOrDefault();
+
+ if (subtitleStream == null)
+ {
+ throw new ResourceNotFoundException();
+ }
+
+ return ToStaticFileResult(subtitleStream.Path);
+ }
+
///
/// Gets the specified request.
///
diff --git a/MediaBrowser.Common/Net/MimeTypes.cs b/MediaBrowser.Common/Net/MimeTypes.cs
index c11ff59d5..47536a341 100644
--- a/MediaBrowser.Common/Net/MimeTypes.cs
+++ b/MediaBrowser.Common/Net/MimeTypes.cs
@@ -218,6 +218,11 @@ namespace MediaBrowser.Common.Net
return "image/svg+xml";
}
+ if (ext.Equals(".srt", StringComparison.OrdinalIgnoreCase))
+ {
+ return "text/plain";
+ }
+
throw new ArgumentException("Argument not supported: " + path);
}
}
diff --git a/MediaBrowser.Server.Implementations/Roku/RokuSessionController.cs b/MediaBrowser.Server.Implementations/Roku/RokuSessionController.cs
index ffe33d763..b9e8b7950 100644
--- a/MediaBrowser.Server.Implementations/Roku/RokuSessionController.cs
+++ b/MediaBrowser.Server.Implementations/Roku/RokuSessionController.cs
@@ -139,7 +139,7 @@ namespace MediaBrowser.Server.Implementations.Roku
return _httpClient.Post(new HttpRequestOptions
{
- Url = "mb/remotecontrol",
+ Url = "http://" + Session.RemoteEndPoint + "/mb/remotecontrol",
CancellationToken = cancellationToken,
RequestContent = json,
RequestContentType = "application/json"
diff --git a/MediaBrowser.WebDashboard/Api/DashboardService.cs b/MediaBrowser.WebDashboard/Api/DashboardService.cs
index 20284cb3d..e68abd23e 100644
--- a/MediaBrowser.WebDashboard/Api/DashboardService.cs
+++ b/MediaBrowser.WebDashboard/Api/DashboardService.cs
@@ -474,7 +474,8 @@ namespace MediaBrowser.WebDashboard.Api
"advancedconfigurationpage.js",
"advancedmetadataconfigurationpage.js",
"boxsets.js",
- "clientsettings.js",
+ "appsplayback.js",
+ "appsweather.js",
"dashboardpage.js",
"directorybrowser.js",
"edititemmetadata.js",
diff --git a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
index 5beaa133c..d441abfeb 100644
--- a/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
+++ b/MediaBrowser.WebDashboard/MediaBrowser.WebDashboard.csproj
@@ -85,6 +85,9 @@
+
+ PreserveNewest
+
PreserveNewest
@@ -406,6 +409,9 @@
PreserveNewest
+
+ PreserveNewest
+
PreserveNewest
@@ -1415,7 +1421,7 @@
-
+
PreserveNewest
@@ -1486,7 +1492,7 @@
-
+
PreserveNewest