Skip to content

Commit

Permalink
Merge pull request #598 from Stremio/fix/external-player-link
Browse files Browse the repository at this point in the history
Fix external player link
  • Loading branch information
tymmesyde authored Dec 20, 2023
2 parents bcd0378 + d5cacc0 commit 93c3e66
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 29 deletions.
31 changes: 20 additions & 11 deletions src/deep_links/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -39,14 +39,21 @@ pub struct OpenPlayerLink {
#[derive(Default, Serialize, Debug, PartialEq, Eq)]
#[serde(rename_all = "camelCase")]
pub struct ExternalPlayerLink {
pub href: Option<String>,
pub download: Option<String>,
pub streaming: Option<String>,
/// m3u data URI
pub playlist: Option<String>,
/// Filename of the playlist
pub file_name: Option<String>,
pub open_player: Option<OpenPlayerLink>,
pub android_tv: Option<String>,
/// External URL for Web
pub web: Option<Url>,
/// External URI for Android TV
pub android_tv: Option<Url>,
/// External payload for Tizen
pub tizen: Option<String>,
/// External payload for webOS
pub webos: Option<String>,
pub file_name: Option<String>,
}

/// Using `&Option<Url>` is not encouraged, use `.as_ref()` to get an `Option<&Url>` instead!
Expand All @@ -69,9 +76,8 @@ impl From<(&Stream, Option<&Url>, &Settings)> for ExternalPlayerLink {
let http_regex = Regex::new(r"https?://").unwrap();
let download = stream.download_url();
let streaming = stream.streaming_url(streaming_server_url);
let m3u_uri = stream.m3u_data_uri(streaming_server_url);
let file_name = m3u_uri.as_ref().map(|_| "playlist.m3u".to_owned());
let href = m3u_uri.or_else(|| download.to_owned());
let playlist = stream.m3u_data_uri(streaming_server_url);
let file_name = playlist.as_ref().map(|_| "playlist.m3u".to_owned());
let open_player = match &streaming {
Some(url) => match settings.player_type.as_ref() {
Some(player_type) => match player_type.as_str() {
Expand Down Expand Up @@ -126,28 +132,31 @@ impl From<(&Stream, Option<&Url>, &Settings)> for ExternalPlayerLink {
},
None => None,
};
let (android_tv, tizen, webos) = match &stream.source {
let (web, android_tv, tizen, webos) = match &stream.source {
StreamSource::External {
external_url,
android_tv_url,
tizen_url,
webos_url,
..
} => (
android_tv_url.as_ref().map(|url| url.to_string()),
external_url.to_owned(),
android_tv_url.to_owned(),
tizen_url.to_owned(),
webos_url.to_owned(),
),
_ => (None, None, None),
_ => (None, None, None, None),
};
ExternalPlayerLink {
href,
download,
streaming,
playlist,
file_name,
open_player,
web,
android_tv,
tizen,
webos,
file_name,
}
}
}
Expand Down
11 changes: 8 additions & 3 deletions src/types/resource/stream.rs
Original file line number Diff line number Diff line change
Expand Up @@ -136,9 +136,14 @@ impl Stream {
}
pub fn streaming_url(&self, streaming_server_url: Option<&Url>) -> Option<String> {
match (&self.source, streaming_server_url) {
(StreamSource::Url { url }, Some(streaming_server_url)) if url.scheme() != "magnet" => {
match &self.behavior_hints.proxy_headers {
Some(StreamProxyHeaders { request, response }) => {
(StreamSource::Url { url }, streaming_server_url) if url.scheme() != "magnet" => {
// If proxy headers are set and streaming server is available, build the proxied streaming url from streaming server url
// Otherwise return the url
match (&self.behavior_hints.proxy_headers, streaming_server_url) {
(
Some(StreamProxyHeaders { request, response }),
Some(streaming_server_url),
) => {
let mut streaming_url = streaming_server_url.to_owned();
let mut proxy_query = form_urlencoded::Serializer::new(String::new());
let origin = format!("{}://{}", url.scheme(), url.authority());
Expand Down
12 changes: 6 additions & 6 deletions src/unit_tests/deep_links/external_player_link.rs
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ fn external_player_link_magnet() {
let streaming_server_url = Some(Url::parse(STREAMING_SERVER_URL).unwrap());
let settings = Settings::default();
let epl = ExternalPlayerLink::try_from((&stream, &streaming_server_url, &settings)).unwrap();
assert_eq!(epl.href, Some(MAGNET_STR_URL.to_owned()));
assert_eq!(epl.download, Some(MAGNET_STR_URL.to_owned()));
assert_eq!(epl.file_name, None);
}

Expand All @@ -47,7 +47,7 @@ fn external_player_link_http() {
let streaming_server_url = Some(Url::parse(STREAMING_SERVER_URL).unwrap());
let settings = Settings::default();
let epl = ExternalPlayerLink::try_from((&stream, &streaming_server_url, &settings)).unwrap();
assert_eq!(epl.href, Some(BASE64_HTTP_URL.to_owned()));
assert_eq!(epl.playlist, Some(BASE64_HTTP_URL.to_owned()));
assert_eq!(epl.file_name, Some("playlist.m3u".to_string()));
}

Expand Down Expand Up @@ -75,7 +75,7 @@ fn external_player_link_torrent() {
let settings = Settings::default();
let epl = ExternalPlayerLink::try_from((&stream, &streaming_server_url, &settings)).unwrap();
assert_eq!(
epl.href,
epl.playlist,
Some(format!(
"data:application/octet-stream;charset=utf-8;base64,{}",
BASE64.encode(format!(
Expand Down Expand Up @@ -115,7 +115,7 @@ fn external_player_link_external() {
let streaming_server_url = Some(Url::parse(STREAMING_SERVER_URL).unwrap());
let settings = Settings::default();
let epl = ExternalPlayerLink::try_from((&stream, &streaming_server_url, &settings)).unwrap();
assert_eq!(epl.href, Some(HTTP_STR_URL.to_owned()));
assert_eq!(epl.web, Some(Url::from_str(HTTP_STR_URL).unwrap()));
assert_eq!(epl.file_name, None);
}

Expand All @@ -136,7 +136,7 @@ fn external_player_link_youtube() {
let settings = Settings::default();
let epl = ExternalPlayerLink::try_from((&stream, &streaming_server_url, &settings)).unwrap();
assert_eq!(
epl.href,
epl.playlist,
Some(format!(
"data:application/octet-stream;charset=utf-8;base64,{}",
BASE64.encode(format!(
Expand All @@ -163,6 +163,6 @@ fn external_player_link_player_frame() {
let streaming_server_url = Some(Url::parse(STREAMING_SERVER_URL).unwrap());
let settings = Settings::default();
let epl = ExternalPlayerLink::try_from((&stream, &streaming_server_url, &settings)).unwrap();
assert_eq!(epl.href, Some(HTTP_STR_URL.to_owned()));
assert_eq!(epl.playlist, None);
assert_eq!(epl.file_name, None);
}
25 changes: 17 additions & 8 deletions src/unit_tests/deep_links/stream_deep_links.rs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,10 @@ fn stream_deep_links_magnet() {
let settings = Settings::default();
let sdl = StreamDeepLinks::try_from((&stream, &streaming_server_url, &settings)).unwrap();
assert_eq!(sdl.player, "stremio:///player/eAEBRgC5%2F3sidXJsIjoibWFnbmV0Oj94dD11cm46YnRpaDpkZDgyNTVlY2RjN2NhNTVmYjBiYmY4MTMyM2Q4NzA2MmRiMWY2ZDFjIn0%2BMhZF".to_string());
assert_eq!(sdl.external_player.href, Some(MAGNET_STR_URL.to_owned()));
assert_eq!(
sdl.external_player.download,
Some(MAGNET_STR_URL.to_owned()),
);
assert_eq!(sdl.external_player.file_name, None);
}

Expand All @@ -57,7 +60,10 @@ fn stream_deep_links_http() {
"stremio:///player/eAEBIQDe%2F3sidXJsIjoiaHR0cDovL2RvbWFpbi5yb290L3BhdGgifcEEC6w%3D"
.to_string()
);
assert_eq!(sdl.external_player.href, Some(BASE64_HTTP_URL.to_owned()));
assert_eq!(
sdl.external_player.playlist,
Some(BASE64_HTTP_URL.to_owned()),
);
assert_eq!(sdl.external_player.streaming, Some(HTTP_STR_URL.to_owned()));
assert_eq!(
sdl.external_player.file_name,
Expand Down Expand Up @@ -163,7 +169,7 @@ fn stream_deep_links_torrent() {
let sdl = StreamDeepLinks::try_from((&stream, &streaming_server_url, &settings)).unwrap();
assert_eq!(sdl.player, "stremio:///player/eAEBdwCI%2F3siaW5mb0hhc2giOiJkZDgyNTVlY2RjN2NhNTVmYjBiYmY4MTMyM2Q4NzA2MmRiMWY2ZDFjIiwiZmlsZUlkeCI6MCwiYW5ub3VuY2UiOlsiaHR0cDovL2J0MS5hcmNoaXZlLm9yZzo2OTY5L2Fubm91bmNlIl19ndAlsw%3D%3D".to_string());
assert_eq!(
sdl.external_player.href,
sdl.external_player.playlist,
Some(format!(
"data:application/octet-stream;charset=utf-8;base64,{}",
BASE64.encode(format!(
Expand Down Expand Up @@ -224,7 +230,7 @@ fn stream_deep_links_torrent_without_file_index() {
let sdl = StreamDeepLinks::try_from((&stream, &streaming_server_url, &settings)).unwrap();
assert_eq!(sdl.player, "stremio:///player/eAEBegCF%2F3siaW5mb0hhc2giOiJkZDgyNTVlY2RjN2NhNTVmYjBiYmY4MTMyM2Q4NzA2MmRiMWY2ZDFjIiwiZmlsZUlkeCI6bnVsbCwiYW5ub3VuY2UiOlsiaHR0cDovL2J0MS5hcmNoaXZlLm9yZzo2OTY5L2Fubm91bmNlIl19LmMnPg%3D%3D".to_string());
assert_eq!(
sdl.external_player.href,
sdl.external_player.playlist,
Some(format!(
"data:application/octet-stream;charset=utf-8;base64,{}",
BASE64.encode(format!(
Expand Down Expand Up @@ -280,7 +286,10 @@ fn stream_deep_links_external() {
let settings = Settings::default();
let sdl = StreamDeepLinks::try_from((&stream, &streaming_server_url, &settings)).unwrap();
assert_eq!(sdl.player, "stremio:///player/eAEBKQDW%2F3siZXh0ZXJuYWxVcmwiOiJodHRwOi8vZG9tYWluLnJvb3QvcGF0aCJ9OoEO7w%3D%3D".to_string());
assert_eq!(sdl.external_player.href, Some(HTTP_STR_URL.to_owned()));
assert_eq!(
sdl.external_player.web,
Some(Url::from_str(HTTP_STR_URL).unwrap()),
);
assert_eq!(sdl.external_player.file_name, None);
}

Expand All @@ -304,7 +313,7 @@ fn stream_deep_links_youtube() {
"stremio:///player/eAEBFgDp%2F3sieXRJZCI6ImFxei1LRS1icEtRIn1RRQb5".to_string()
);
assert_eq!(
sdl.external_player.href,
sdl.external_player.playlist,
Some(format!(
"data:application/octet-stream;charset=utf-8;base64,{}",
BASE64.encode(format!(
Expand Down Expand Up @@ -335,7 +344,7 @@ fn stream_deep_links_player_frame() {
let settings = Settings::default();
let sdl = StreamDeepLinks::try_from((&stream, &streaming_server_url, &settings)).unwrap();
assert_eq!(sdl.player, "stremio:///player/eAEBLADT%2F3sicGxheWVyRnJhbWVVcmwiOiJodHRwOi8vZG9tYWluLnJvb3QvcGF0aCJ9abUQBA%3D%3D".to_string());
assert_eq!(sdl.external_player.href, Some(HTTP_STR_URL.to_owned()));
assert_eq!(sdl.external_player.playlist, None);
assert_eq!(sdl.external_player.file_name, None);
}

Expand Down Expand Up @@ -375,7 +384,7 @@ fn stream_deep_links_requests() {
YT_ID, YT_ID
));
assert_eq!(
sdl.external_player.href,
sdl.external_player.playlist,
Some(format!(
"data:application/octet-stream;charset=utf-8;base64,{}",
BASE64.encode(format!(
Expand Down
2 changes: 1 addition & 1 deletion src/unit_tests/deep_links/video_deep_links.rs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ fn video_deep_links() {
assert_eq!(
vdl.external_player,
Some(ExternalPlayerLink {
href: Some(format!(
playlist: Some(format!(
"data:application/octet-stream;charset=utf-8;base64,{}",
BASE64.encode(format!(
"#EXTM3U\n#EXTINF:0\n{}yt/{}",
Expand Down

0 comments on commit 93c3e66

Please sign in to comment.