diff --git a/CHANGELOG.md b/CHANGELOG.md index 2346cee9..9e7ae664 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,10 +7,17 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## Unreleased +<<<<<<< HEAD ### Changed - Conviva - Bumped the Conviva SDK dependency to 4.2.4. +======= +### Fixed + +- SideloadedSubtitle + - Fixed an issue where the stream would not play if an invalid subtitle source is passed and activated. +>>>>>>> 22a7075 (add changelog) ## [10.4.0] - 2025-11-05 diff --git a/Code/Sideloaded-TextTracks/Sources/THEOplayerConnectorSideloadedSubtitle/Extensions/URL+Scheme.swift b/Code/Sideloaded-TextTracks/Sources/THEOplayerConnectorSideloadedSubtitle/Extensions/URL+Extensions.swift similarity index 57% rename from Code/Sideloaded-TextTracks/Sources/THEOplayerConnectorSideloadedSubtitle/Extensions/URL+Scheme.swift rename to Code/Sideloaded-TextTracks/Sources/THEOplayerConnectorSideloadedSubtitle/Extensions/URL+Extensions.swift index 15d403af..ae767e88 100644 --- a/Code/Sideloaded-TextTracks/Sources/THEOplayerConnectorSideloadedSubtitle/Extensions/URL+Scheme.swift +++ b/Code/Sideloaded-TextTracks/Sources/THEOplayerConnectorSideloadedSubtitle/Extensions/URL+Extensions.swift @@ -28,4 +28,25 @@ extension URL { } return URL(string: self.absoluteString.replacingCharacters(in: range, with: newScheme + "://")) } + + var isValid: Bool { + guard self.scheme != nil else { + print("[AVSubtitlesLoader] URL scheme is invalid or missing.") + return false + } + + guard let host = self.host, + !host.isEmpty else { + print("[AVSubtitlesLoader] URL host is invalid or missing.") + return false + } + + let disallowedCharacterSet = CharacterSet.urlQueryAllowed.inverted + guard self.absoluteString.rangeOfCharacter(from: disallowedCharacterSet) == nil else { + print("[AVSubtitlesLoader] URL contains invalid characters.") + return false + } + + return true + } } diff --git a/Code/Sideloaded-TextTracks/Sources/THEOplayerConnectorSideloadedSubtitle/Parsers/MasterPlaylistParser.swift b/Code/Sideloaded-TextTracks/Sources/THEOplayerConnectorSideloadedSubtitle/Parsers/MasterPlaylistParser.swift index d83af061..218aa558 100644 --- a/Code/Sideloaded-TextTracks/Sources/THEOplayerConnectorSideloadedSubtitle/Parsers/MasterPlaylistParser.swift +++ b/Code/Sideloaded-TextTracks/Sources/THEOplayerConnectorSideloadedSubtitle/Parsers/MasterPlaylistParser.swift @@ -12,6 +12,7 @@ class MasterPlaylistParser: PlaylistParser { var constructedManifestArray = [String]() fileprivate var lastMediaLine: Int? fileprivate let subtitlesGroupId = "THEOsubs" + override init(url: URL) { super.init(url: url) } @@ -58,7 +59,7 @@ class MasterPlaylistParser: PlaylistParser { case HLSKeywords.subtitles.rawValue: line.paramsObject[HLSKeywords.groupId.rawValue] = "\"\(self.subtitlesGroupId)\"" self.lastMediaLine = self.constructedManifestArray.count - + default: break } diff --git a/Code/Sideloaded-TextTracks/Sources/THEOplayerConnectorSideloadedSubtitle/Utils/SourceValidator.swift b/Code/Sideloaded-TextTracks/Sources/THEOplayerConnectorSideloadedSubtitle/Utils/SourceValidator.swift index 3df4fa60..e327cdb5 100644 --- a/Code/Sideloaded-TextTracks/Sources/THEOplayerConnectorSideloadedSubtitle/Utils/SourceValidator.swift +++ b/Code/Sideloaded-TextTracks/Sources/THEOplayerConnectorSideloadedSubtitle/Utils/SourceValidator.swift @@ -15,7 +15,14 @@ class SourceValidator { return nil } - let filteredTextTracks = sideLoadedTextTracks.filter { $0.kind == .subtitles } + let subtitlesTextTracks = sideLoadedTextTracks.filter { $0.kind == .subtitles } + let filteredTextTracks = subtitlesTextTracks.filter { subtitle in + guard subtitle.src.isValid == true else { + print("[AVSubtitlesLoader] The provided subtitle source \(subtitle.src.absoluteString) is invalid.") + return false + } + return true + } if filteredTextTracks.isEmpty { print("[AVSubtitlesLoader] Unable to find a valid TextTrackDescription for sideloading.") return nil