Browse Source

Merge pull request #13977 from sususu98/fix/strm-local-subtitle-url

refactor(StreamInfo): reorganize subtitle URL logic and conditions
Niels van Velzen 1 week ago
parent
commit
a35ffbf17e
1 changed files with 27 additions and 20 deletions
  1. 27 20
      MediaBrowser.Model/Dlna/StreamInfo.cs

+ 27 - 20
MediaBrowser.Model/Dlna/StreamInfo.cs

@@ -1250,30 +1250,37 @@ 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;
             }
+
+            // 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;