aboutsummaryrefslogtreecommitdiffstats
path: root/src/client/players
diff options
context:
space:
mode:
Diffstat (limited to 'src/client/players')
-rw-r--r--src/client/players/Raw.hx2
-rw-r--r--src/client/players/RawSubs.hx2
-rw-r--r--src/client/players/Streamable.hx66
-rw-r--r--src/client/players/Youtube.hx4
4 files changed, 67 insertions, 7 deletions
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
};
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage