Browse Source

refactor(StreamInfo): reorganize subtitle URL logic and conditions

# Conflicts:
#	MediaBrowser.Model/Dlna/StreamInfo.cs
sususu98 7 months ago
parent
commit
22ce1f25d0
1 changed files with 30 additions and 23 deletions
  1. 30 23
      MediaBrowser.Model/Dlna/StreamInfo.cs

+ 30 - 23
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.