aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/Lang.hx3
-rw-r--r--src/PathTools.hx2
-rw-r--r--src/Types.hx14
-rw-r--r--src/VideoList.hx2
-rw-r--r--src/client/Buttons.hx2
-rw-r--r--src/client/JsApi.hx2
-rw-r--r--src/client/Main.hx1
-rw-r--r--src/client/Player.hx7
-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
-rw-r--r--src/import.hx2
-rw-r--r--src/server/ConsoleInput.hx2
-rw-r--r--src/server/HttpServer.hx2
-rw-r--r--src/server/Logger.hx3
-rw-r--r--src/server/Main.hx2
-rw-r--r--src/server/Utils.hx2
-rw-r--r--src/server/YoutubeFallback.hx2
19 files changed, 79 insertions, 43 deletions
diff --git a/src/Lang.hx b/src/Lang.hx
index a146e3d..597e4d9 100644
--- a/src/Lang.hx
+++ b/src/Lang.hx
@@ -2,9 +2,6 @@ package;
import haxe.Json;
import haxe.io.Path;
-
-using Lambda;
-
#if (sys || nodejs)
import sys.io.File;
#else
diff --git a/src/PathTools.hx b/src/PathTools.hx
index 69a0044..113715d 100644
--- a/src/PathTools.hx
+++ b/src/PathTools.hx
@@ -2,8 +2,6 @@ package;
import haxe.io.Path;
-using StringTools;
-
class PathTools {
public static function urlExtension(url:String) {
return Path.extension(~/[#?]/.split(url)[0]).trim().toLowerCase();
diff --git a/src/Types.hx b/src/Types.hx
index 27b2cce..a02b4a9 100644
--- a/src/Types.hx
+++ b/src/Types.hx
@@ -4,16 +4,16 @@ import Client.ClientData;
import utils.YoutubeUtils.YouTubeVideoInfo;
typedef VideoDataRequest = {
- url:String,
- atEnd:Bool
+ final url:String;
+ final atEnd:Bool;
}
typedef VideoData = {
- duration:Float,
- ?title:String,
- ?url:String,
- ?subs:String,
- ?isIframe:Bool
+ final duration:Float;
+ var ?title:String;
+ var ?url:String;
+ var ?subs:String;
+ var ?isIframe:Bool;
}
typedef Config = {
diff --git a/src/VideoList.hx b/src/VideoList.hx
index b677060..c5e92c8 100644
--- a/src/VideoList.hx
+++ b/src/VideoList.hx
@@ -2,8 +2,6 @@ package;
import Types.VideoItem;
-using Lambda;
-
class VideoList {
public var length(get, never):Int;
public var pos(default, null) = 0;
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
};
diff --git a/src/import.hx b/src/import.hx
new file mode 100644
index 0000000..5517d1e
--- /dev/null
+++ b/src/import.hx
@@ -0,0 +1,2 @@
+using Lambda;
+using StringTools;
diff --git a/src/server/ConsoleInput.hx b/src/server/ConsoleInput.hx
index 4ae729c..cf88df6 100644
--- a/src/server/ConsoleInput.hx
+++ b/src/server/ConsoleInput.hx
@@ -9,8 +9,6 @@ import js.node.Readline;
import sys.FileSystem;
import sys.io.File;
-using StringTools;
-
private typedef CommandData = {
args:Array<String>,
desc:String
diff --git a/src/server/HttpServer.hx b/src/server/HttpServer.hx
index 1a0c4d5..66668a7 100644
--- a/src/server/HttpServer.hx
+++ b/src/server/HttpServer.hx
@@ -12,8 +12,6 @@ import js.node.http.ServerResponse;
import js.node.url.URL;
import sys.FileSystem;
-using StringTools;
-
class HttpServer {
static final mimeTypes = [
"html" => "text/html",
diff --git a/src/server/Logger.hx b/src/server/Logger.hx
index b3ebf53..bf06968 100644
--- a/src/server/Logger.hx
+++ b/src/server/Logger.hx
@@ -6,9 +6,6 @@ import haxe.io.Path;
import sys.FileSystem;
import sys.io.File;
-using Lambda;
-using StringTools;
-
class Logger {
final folder:String;
final maxCount:Int;
diff --git a/src/server/Main.hx b/src/server/Main.hx
index 4f09108..1560f53 100644
--- a/src/server/Main.hx
+++ b/src/server/Main.hx
@@ -23,8 +23,6 @@ import sys.FileSystem;
import sys.io.File;
using ClientTools;
-using Lambda;
-using StringTools;
private typedef MainOptions = {
loadState:Bool
diff --git a/src/server/Utils.hx b/src/server/Utils.hx
index 43160e6..8fcc4c6 100644
--- a/src/server/Utils.hx
+++ b/src/server/Utils.hx
@@ -6,8 +6,6 @@ import js.node.Os;
import js.node.url.URL;
import sys.FileSystem;
-using StringTools;
-
class Utils {
public static function parseArgs(args:Array<String>, caseSensitive = true):Map<String,
String> {
diff --git a/src/server/YoutubeFallback.hx b/src/server/YoutubeFallback.hx
index 34ea8a9..5360283 100644
--- a/src/server/YoutubeFallback.hx
+++ b/src/server/YoutubeFallback.hx
@@ -9,8 +9,6 @@ import js.node.Https.HttpsRequestOptions;
import js.node.url.URLSearchParams;
import utils.YoutubeUtils;
-using Lambda;
-
class YoutubeFallback {
static function httpsGet(
url:String,
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage