Skip to content

Commit b73d1fd

Browse files
committed
feat(stremio-core-protobuf): VideoDeepLinks for MetaDetails and Player
Signed-off-by: Lachezar Lechev <[email protected]>
1 parent b9fc79e commit b73d1fd

File tree

5 files changed

+159
-29
lines changed

5 files changed

+159
-29
lines changed

stremio-core-protobuf/proto/stremio/core/types/video.proto

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,28 @@ message Video {
1818
required bool upcoming = 8;
1919
required bool watched = 9;
2020
required bool current_video = 10;
21+
// Watch progress percentage
22+
optional double progress = 11;
23+
// scheduled: bool,
24+
25+
required VideoDeepLinks deep_links = 12;
2126

2227
message SeriesInfo {
2328
required int64 season = 1;
2429
required int64 episode = 2;
2530
}
31+
}
32+
33+
message VideoDeepLinks {
34+
required string meta_details_videos = 1;
35+
required string meta_details_streams = 2;
36+
// pub player: Option<String>,
37+
// pub external_player: Option<ExternalPlayerLink>,
38+
optional string player = 3;
39+
required ExternalPlayerLink external_player = 4;
40+
41+
message ExternalPlayerLink {
42+
optional string download = 1;
43+
optional string streaming = 2;
44+
}
2645
}

stremio-core-protobuf/src/bridge/loadable.rs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ use stremio_core::{
77
common::{Loadable, ResourceError},
88
ctx::{Ctx, CtxError},
99
link::LinkError,
10-
streaming_server::PlaybackDevice,
10+
streaming_server::{PlaybackDevice, StreamingServer},
1111
},
1212
runtime::EnvError,
1313
types::{
@@ -53,6 +53,8 @@ impl
5353
ToProtobuf<
5454
models::loadable_meta_item::Content,
5555
(
56+
&Ctx,
57+
&StreamingServer,
5658
Option<&LibraryItem>,
5759
Option<&WatchedBitField>,
5860
Option<&String>,
@@ -62,17 +64,26 @@ impl
6264
{
6365
fn to_protobuf<E: stremio_core::runtime::Env + 'static>(
6466
&self,
65-
(library_item, watched, addon_name, meta_request): &(
67+
(ctx, streaming_server, library_item, watched, addon_name, meta_request): &(
68+
&Ctx,
69+
&StreamingServer,
6670
Option<&LibraryItem>,
6771
Option<&WatchedBitField>,
6872
Option<&String>,
6973
&ResourceRequest,
7074
),
7175
) -> models::loadable_meta_item::Content {
7276
match &self {
73-
Loadable::Ready(ready) => models::loadable_meta_item::Content::Ready(
74-
ready.to_protobuf::<E>(&(*library_item, *watched, *addon_name, *meta_request)),
75-
),
77+
Loadable::Ready(ready) => {
78+
models::loadable_meta_item::Content::Ready(ready.to_protobuf::<E>(&(
79+
*ctx,
80+
*streaming_server,
81+
*library_item,
82+
*watched,
83+
*addon_name,
84+
*meta_request,
85+
)))
86+
}
7687
Loadable::Err(error) => models::loadable_meta_item::Content::Error(models::Error {
7788
message: error.to_string(),
7889
}),

stremio-core-protobuf/src/bridge/resource_loadable.rs

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use stremio_core::{
66
models::{
77
common::{DescriptorLoadable, ResourceLoadable},
88
ctx::Ctx,
9+
streaming_server::StreamingServer,
910
},
1011
types::{
1112
addon::{Descriptor, ResourceRequest},
@@ -60,18 +61,33 @@ impl ToProtobuf<models::LoadablePage, Ctx> for ResourceLoadable<Vec<MetaItemPrev
6061
}
6162
}
6263

63-
impl ToProtobuf<models::LoadableMetaItem, (&Ctx, Option<&LibraryItem>, Option<&WatchedBitField>)>
64-
for &ResourceLoadable<MetaItem>
64+
impl
65+
ToProtobuf<
66+
models::LoadableMetaItem,
67+
(
68+
&Ctx,
69+
&StreamingServer,
70+
Option<&LibraryItem>,
71+
Option<&WatchedBitField>,
72+
),
73+
> for &ResourceLoadable<MetaItem>
6574
{
6675
fn to_protobuf<E: stremio_core::runtime::Env + 'static>(
6776
&self,
68-
(ctx, library_item, watched): &(&Ctx, Option<&LibraryItem>, Option<&WatchedBitField>),
77+
(ctx, streming_server, library_item, watched): &(
78+
&Ctx,
79+
&StreamingServer,
80+
Option<&LibraryItem>,
81+
Option<&WatchedBitField>,
82+
),
6983
) -> models::LoadableMetaItem {
7084
let addon_name = get_addon_name(ctx, &self.request.base);
7185
models::LoadableMetaItem {
7286
title: addon_name.to_string(),
7387
request: self.request.to_protobuf::<E>(&()),
7488
content: self.content.to_protobuf::<E>(&(
89+
*ctx,
90+
*streming_server,
7591
*library_item,
7692
*watched,
7793
Some(&addon_name),

stremio-core-protobuf/src/model/fields/meta_details.rs

Lines changed: 73 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
use boolinator::Boolinator;
2-
use stremio_core::deep_links::MetaItemDeepLinks;
2+
3+
use stremio_core::deep_links::{MetaItemDeepLinks, VideoDeepLinks};
34
use stremio_core::models::ctx::Ctx;
4-
use stremio_core::models::meta_details::{MetaDetails, Selected};
5+
use stremio_core::models::{
6+
meta_details::{MetaDetails, Selected},
7+
streaming_server::StreamingServer,
8+
};
59
use stremio_core::runtime::Env;
610
use stremio_core::types::addon::ResourceRequest;
711
use stremio_core::types::library::LibraryItem;
812
use stremio_core::types::resource::{MetaItem, SeriesInfo, Video};
913
use stremio_core::types::watched_bitfield::WatchedBitField;
1014

15+
use url::Url;
16+
1117
use crate::bridge::{FromProtobuf, ToProtobuf};
1218
use crate::protobuf::stremio::core::{models, types};
1319

@@ -53,18 +59,25 @@ impl
5359
ToProtobuf<
5460
types::Video,
5561
(
62+
&Ctx,
63+
Option<&Url>,
64+
// &StreamingServer,
5665
Option<&LibraryItem>,
5766
Option<&WatchedBitField>,
5867
Option<&String>,
68+
&ResourceRequest,
5969
),
6070
> for Video
6171
{
6272
fn to_protobuf<E: Env + 'static>(
6373
&self,
64-
(library_item, watched, addon_name): &(
74+
(ctx, streaming_server_url, library_item, watched, addon_name, request): &(
75+
&Ctx,
76+
Option<&Url>,
6577
Option<&LibraryItem>,
6678
Option<&WatchedBitField>,
6779
Option<&String>,
80+
&ResourceRequest,
6881
),
6982
) -> types::Video {
7083
types::Video {
@@ -88,6 +101,23 @@ impl
88101
.and_then(|library_item| library_item.state.video_id.to_owned())
89102
.map(|current_video_id| current_video_id == self.id)
90103
.unwrap_or_default(),
104+
progress: library_item.and_then(|library_item| {
105+
ctx.library
106+
.items
107+
.get(&library_item.id)
108+
.filter(|library_item| Some(self.id.to_owned()) == library_item.state.video_id)
109+
.map(|library_item| library_item.progress())
110+
}),
111+
// scheduled: meta_item.preview.behavior_hints.has_scheduled_videos,
112+
deep_links: VideoDeepLinks::from((
113+
self,
114+
*request,
115+
// necessary because Core doesn't use the
116+
// preferred `Option<&Url>` format
117+
&streaming_server_url.map(Clone::clone),
118+
&ctx.profile.settings,
119+
))
120+
.to_protobuf::<E>(&()),
91121
}
92122
}
93123
}
@@ -109,10 +139,32 @@ impl FromProtobuf<Video> for types::Video {
109139
}
110140
}
111141

142+
impl ToProtobuf<types::VideoDeepLinks, ()> for VideoDeepLinks {
143+
fn to_protobuf<E: Env + 'static>(&self, _args: &()) -> types::VideoDeepLinks {
144+
types::VideoDeepLinks {
145+
meta_details_videos: self.meta_details_videos.clone(),
146+
meta_details_streams: self.meta_details_streams.clone(),
147+
player: self.player.clone(),
148+
external_player: types::video_deep_links::ExternalPlayerLink {
149+
download: self
150+
.external_player
151+
.as_ref()
152+
.and_then(|ep| ep.download.clone()),
153+
streaming: self
154+
.external_player
155+
.as_ref()
156+
.and_then(|ep| ep.streaming.clone()),
157+
},
158+
}
159+
}
160+
}
161+
112162
impl
113163
ToProtobuf<
114164
types::MetaItem,
115165
(
166+
&Ctx,
167+
&StreamingServer,
116168
Option<&LibraryItem>,
117169
Option<&WatchedBitField>,
118170
Option<&String>,
@@ -122,7 +174,9 @@ impl
122174
{
123175
fn to_protobuf<E: Env + 'static>(
124176
&self,
125-
(library_item, watched, addon_name, meta_request): &(
177+
(ctx, streaming_server, library_item, watched, addon_name, meta_request): &(
178+
&Ctx,
179+
&StreamingServer,
126180
Option<&LibraryItem>,
127181
Option<&WatchedBitField>,
128182
Option<&String>,
@@ -146,9 +200,15 @@ impl
146200
.preview
147201
.trailer_streams
148202
.to_protobuf::<E>(&(None, None, None, None)),
149-
videos: self
150-
.videos
151-
.to_protobuf::<E>(&(*library_item, *watched, *addon_name)),
203+
videos: self.videos.to_protobuf::<E>(&(
204+
*ctx,
205+
streaming_server.base_url.as_ref(),
206+
*library_item,
207+
*watched,
208+
*addon_name,
209+
*meta_request,
210+
)),
211+
152212
behavior_hints: self.preview.behavior_hints.to_protobuf::<E>(&()),
153213
deep_links: MetaItemDeepLinks::from((self, *meta_request)).to_protobuf::<E>(&()),
154214
progress: library_item.and_then(|item| {
@@ -166,8 +226,11 @@ impl
166226
}
167227
}
168228

169-
impl ToProtobuf<models::MetaDetails, Ctx> for MetaDetails {
170-
fn to_protobuf<E: Env + 'static>(&self, ctx: &Ctx) -> models::MetaDetails {
229+
impl ToProtobuf<models::MetaDetails, (&Ctx, &StreamingServer)> for MetaDetails {
230+
fn to_protobuf<E: Env + 'static>(
231+
&self,
232+
(ctx, streaming_server): &(&Ctx, &StreamingServer),
233+
) -> models::MetaDetails {
171234
let meta_item = self
172235
.meta_items
173236
.iter()
@@ -226,6 +289,7 @@ impl ToProtobuf<models::MetaDetails, Ctx> for MetaDetails {
226289
title,
227290
meta_item: meta_item.to_protobuf::<E>(&(
228291
ctx,
292+
streaming_server,
229293
self.library_item.as_ref(),
230294
self.watched.as_ref(),
231295
)),

stremio-core-protobuf/src/model/fields/player.rs

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1-
use stremio_core::models::ctx::Ctx;
2-
use stremio_core::models::player::{Player, Selected, VideoParams};
3-
use stremio_core::types::streams::{AudioTrack, StreamItemState, SubtitleTrack};
1+
use stremio_core::{
2+
models::{
3+
ctx::Ctx,
4+
player::{Player, Selected, VideoParams},
5+
streaming_server::StreamingServer,
6+
},
7+
types::streams::{AudioTrack, StreamItemState, SubtitleTrack},
8+
};
49

5-
use crate::bridge::{FromProtobuf, ToProtobuf};
6-
use crate::protobuf::stremio::core::models;
10+
use crate::{
11+
bridge::{FromProtobuf, ToProtobuf},
12+
protobuf::stremio::core::models,
13+
};
714

815
impl FromProtobuf<Selected> for models::player::Selected {
916
fn from_protobuf(&self) -> Selected {
@@ -139,22 +146,35 @@ impl ToProtobuf<models::player::Selected, Ctx> for Selected {
139146
}
140147
}
141148

142-
impl ToProtobuf<models::Player, Ctx> for Player {
143-
fn to_protobuf<E: stremio_core::runtime::Env + 'static>(&self, ctx: &Ctx) -> models::Player {
149+
impl ToProtobuf<models::Player, (Ctx, StreamingServer)> for Player {
150+
fn to_protobuf<E: stremio_core::runtime::Env + 'static>(
151+
&self,
152+
(ctx, streaming_server): &(Ctx, StreamingServer),
153+
) -> models::Player {
144154
models::Player {
145155
selected: self.selected.to_protobuf::<E>(ctx),
146156
video_params: self.video_params.to_protobuf::<E>(&()),
147157
meta_item: self.meta_item.as_ref().to_protobuf::<E>(&(
148158
ctx,
159+
streaming_server,
149160
self.library_item.as_ref(),
150161
self.watched.as_ref(),
151162
)),
152163
subtitles: self.subtitles.to_protobuf::<E>(ctx),
153-
next_video: self.next_video.to_protobuf::<E>(&(
154-
self.library_item.as_ref(),
155-
self.watched.as_ref(),
156-
None,
157-
)),
164+
next_video: self
165+
.selected
166+
.as_ref()
167+
.and_then(|selected| selected.meta_request.as_ref())
168+
.and_then(|meta_request| {
169+
self.next_video.to_protobuf::<E>(&(
170+
ctx,
171+
streaming_server.base_url.as_ref(),
172+
self.library_item.as_ref(),
173+
self.watched.as_ref(),
174+
None,
175+
meta_request,
176+
))
177+
}),
158178
series_info: self.series_info.to_protobuf::<E>(&()),
159179
library_item: self.library_item.to_protobuf::<E>(&(ctx, None)),
160180
stream_state: self.stream_state.to_protobuf::<E>(&()),

0 commit comments

Comments
 (0)