diff options
| author | RblSb <msrblsb@gmail.com> | 2024-08-02 06:25:45 +0300 |
|---|---|---|
| committer | RblSb <msrblsb@gmail.com> | 2024-08-02 06:25:45 +0300 |
| commit | 7ee893a287c8992196b0b5f51124074fa7c47f4f (patch) | |
| tree | ec32c22b059727ecdd6b909870f97da12aceb097 /src/client | |
| parent | 4df711e1568fedcccb45cd86737d89be6a02e7ad (diff) | |
Streamable support
closes #49
Diffstat (limited to 'src/client')
| -rw-r--r-- | src/client/Buttons.hx | 2 | ||||
| -rw-r--r-- | src/client/JsApi.hx | 2 | ||||
| -rw-r--r-- | src/client/Main.hx | 1 | ||||
| -rw-r--r-- | src/client/Player.hx | 7 | ||||
| -rw-r--r-- | src/client/players/Raw.hx | 2 | ||||
| -rw-r--r-- | src/client/players/RawSubs.hx | 2 | ||||
| -rw-r--r-- | src/client/players/Streamable.hx | 66 | ||||
| -rw-r--r-- | src/client/players/Youtube.hx | 4 |
8 files changed, 70 insertions, 16 deletions
diff --git a/src/client/Buttons.hx b/src/client/Buttons.hx index 7152a31..de3aa27 100644 --- a/src/client/Buttons.hx +++ b/src/client/Buttons.hx @@ -10,8 +10,6 @@ import js.html.InputElement; import js.html.KeyboardEvent; import js.html.VisualViewport; -using StringTools; - class Buttons { static inline var CHAT_MIN_SIZE = 200; static var split:Split; diff --git a/src/client/JsApi.hx b/src/client/JsApi.hx index 09e6edb..1532231 100644 --- a/src/client/JsApi.hx +++ b/src/client/JsApi.hx @@ -7,8 +7,6 @@ import js.Browser.document; import js.Browser.window; import js.Syntax; -using StringTools; - private typedef VideoChangeFunc = (item:VideoItem) -> Void; private typedef OnceEventFunc = (event:WsEvent) -> Void; diff --git a/src/client/Main.hx b/src/client/Main.hx index 85db713..cb74ad8 100644 --- a/src/client/Main.hx +++ b/src/client/Main.hx @@ -23,7 +23,6 @@ import js.html.VideoElement; import js.html.WebSocket; using ClientTools; -using StringTools; class Main { static inline var SETTINGS_VERSION = 4; diff --git a/src/client/Player.hx b/src/client/Player.hx index c250a34..bc64053 100644 --- a/src/client/Player.hx +++ b/src/client/Player.hx @@ -6,14 +6,12 @@ import Types.VideoItem; import client.Main.ge; import client.players.Iframe; import client.players.Raw; +import client.players.Streamable; import client.players.Youtube; import haxe.Http; import haxe.Json; import js.html.Element; -using Lambda; -using StringTools; - class Player { final main:Main; final youtube:Youtube; @@ -32,7 +30,8 @@ class Player { this.main = main; youtube = new Youtube(main, this); players = [ - youtube + youtube, + new Streamable(main, this) ]; iframePlayer = new Iframe(main, this); rawPlayer = new Raw(main, this); diff --git a/src/client/players/Raw.hx b/src/client/players/Raw.hx index 08025eb..3f69958 100644 --- a/src/client/players/Raw.hx +++ b/src/client/players/Raw.hx @@ -13,8 +13,6 @@ import js.html.InputElement; import js.html.URL; import js.html.VideoElement; -using StringTools; - class Raw implements IPlayer { final main:Main; final player:Player; diff --git a/src/client/players/RawSubs.hx b/src/client/players/RawSubs.hx index 8448dfd..a4404b0 100644 --- a/src/client/players/RawSubs.hx +++ b/src/client/players/RawSubs.hx @@ -8,8 +8,6 @@ import js.Browser.window; import js.Browser; import js.html.VideoElement; -using StringTools; - private typedef Duration = { h:Int, m:Int, diff --git a/src/client/players/Streamable.hx b/src/client/players/Streamable.hx new file mode 100644 index 0000000..21ef0f0 --- /dev/null +++ b/src/client/players/Streamable.hx @@ -0,0 +1,66 @@ +package client.players; + +import Types.VideoData; +import Types.VideoDataRequest; +import haxe.DynamicAccess; +import haxe.Http; +import haxe.Json; + +class Streamable extends Raw { + final matchStreamable = ~/streamable\.com\/(.+)/g; + final matchBadStreamableId = ~/[^0-9A-z-_]/g; + + override function isSupportedLink(url:String):Bool { + if (!matchStreamable.match(url)) return false; + final id = matchStreamable.matched(1); + if (matchBadStreamableId.match(id)) return false; + return true; + } + + override function getVideoData(data:VideoDataRequest, callback:(data:VideoData) -> Void) { + getStreamableVideoData(data.url, info -> { + if (info == null) { + callback({duration: 0}); + return; + } + + getRawVideoData({url: info.url, atEnd: data.atEnd}, data -> { + // set new url instead of using input one to load video + data.url = info.url; + data.title = info.title; + callback(data); + }); + }); + } + + function getRawVideoData(data:VideoDataRequest, callback:(data:VideoData) -> Void):Void { + super.getVideoData(data, callback); + } + + function getStreamableVideoData(url:String, callback:(info:Null<{url:String, title:String}>) -> Void):Void { + if (!matchStreamable.match(url)) { + callback(null); + return; + } + final id = matchStreamable.matched(1); + final http = new Http('https://api.streamable.com/videos/$id'); + http.onData = text -> { + try { + final json:{title:String, ?files:DynamicAccess<Dynamic>} = Json.parse(text); + final files = json?.files; + var item = files["mp4"]; + if (item == null) { + final key = files.keys()[0]; + item = files[key]; + } + callback({ + url: item.url, + title: json.title + }); + } catch (e) { + callback(null); + } + } + http.request(); + } +} diff --git a/src/client/players/Youtube.hx b/src/client/players/Youtube.hx index 7c98b3f..cde2ef8 100644 --- a/src/client/players/Youtube.hx +++ b/src/client/players/Youtube.hx @@ -12,8 +12,6 @@ import js.youtube.Youtube as YtInit; import js.youtube.YoutubePlayer; import utils.YoutubeUtils; -using StringTools; - class Youtube implements IPlayer { final videosUrl = "https://www.googleapis.com/youtube/v3/videos"; final playlistUrl = "https://www.googleapis.com/youtube/v3/playlistItems"; @@ -133,7 +131,7 @@ class Youtube implements IPlayer { function loadNextItem():Void { final item = items.shift(); final id:String = item.snippet.resourceId.videoId; - final obj = { + final obj:VideoDataRequest = { url: 'https://youtu.be/$id', atEnd: data.atEnd }; |
