aboutsummaryrefslogtreecommitdiff
path: root/MediaBrowser.Model
diff options
context:
space:
mode:
Diffstat (limited to 'MediaBrowser.Model')
-rw-r--r--MediaBrowser.Model/Dlna/StreamInfo.cs53
1 files changed, 30 insertions, 23 deletions
diff --git a/MediaBrowser.Model/Dlna/StreamInfo.cs b/MediaBrowser.Model/Dlna/StreamInfo.cs
index 13acd15a3..e233797d7 100644
--- a/MediaBrowser.Model/Dlna/StreamInfo.cs
+++ b/MediaBrowser.Model/Dlna/StreamInfo.cs
@@ -1250,34 +1250,41 @@ public class StreamInfo
if (info.DeliveryMethod == SubtitleDeliveryMethod.External)
{
- if (MediaSource.Protocol == MediaProtocol.File || !string.Equals(stream.Codec, subtitleProfile.Format, StringComparison.OrdinalIgnoreCase) || !stream.IsExternal)
- {
- info.Url = string.Format(
- CultureInfo.InvariantCulture,
- "{0}/Videos/{1}/{2}/Subtitles/{3}/{4}/Stream.{5}",
- baseUrl,
- ItemId,
- MediaSourceId,
- stream.Index.ToString(CultureInfo.InvariantCulture),
- startPositionTicks.ToString(CultureInfo.InvariantCulture),
- subtitleProfile.Format);
-
- if (!string.IsNullOrEmpty(accessToken))
- {
- info.Url += "?ApiKey=" + accessToken;
- }
-
- info.IsExternalUrl = false;
- }
- else
+ // Default to using the API URL
+ info.Url = string.Format(
+ CultureInfo.InvariantCulture,
+ "{0}/Videos/{1}/{2}/Subtitles/{3}/{4}/Stream.{5}",
+ baseUrl,
+ ItemId,
+ MediaSourceId,
+ stream.Index.ToString(CultureInfo.InvariantCulture),
+ startPositionTicks.ToString(CultureInfo.InvariantCulture),
+ subtitleProfile.Format);
+ info.IsExternalUrl = false; // Default to API URL
+
+ // Check conditions for potentially using the direct path
+ if (stream.IsExternal // Must be external
+ && MediaSource?.Protocol != MediaProtocol.File // Main media must not be a local file
+ && string.Equals(stream.Codec, subtitleProfile.Format, StringComparison.OrdinalIgnoreCase) // Format must match (no conversion needed)
+ && !string.IsNullOrEmpty(stream.Path) // Path must exist
+ && Uri.TryCreate(stream.Path, UriKind.Absolute, out Uri? uriResult) // Path must be an absolute URI
+ && (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps)) // Scheme must be HTTP or HTTPS
{
+ // All conditions met, override with the direct path
info.Url = stream.Path;
info.IsExternalUrl = true;
}
- }
- return info;
- }
+ // Append ApiKey only if we are using the API URL
+ if (!info.IsExternalUrl && !string.IsNullOrEmpty(accessToken))
+ {
+ // Use "?ApiKey=" as seen in HEAD and other parts of the code
+ info.Url += "?ApiKey=" + accessToken;
+ }
+ }
+
+ return info;
+ }
/// <summary>
/// Gets the target video bit depth.