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

refactor(StreamInfo): reorganize subtitle URL logic and conditions
This commit is contained in:
Niels van Velzen 2025-11-27 16:33:19 +01:00 committed by GitHub
commit a35ffbf17e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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);
// 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
if (!string.IsNullOrEmpty(accessToken))
{
info.Url += "?ApiKey=" + accessToken;
}
info.IsExternalUrl = false;
}
else
// 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;