diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/Lang.hx | 3 | ||||
| -rw-r--r-- | src/PathTools.hx | 2 | ||||
| -rw-r--r-- | src/Types.hx | 14 | ||||
| -rw-r--r-- | src/VideoList.hx | 2 | ||||
| -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 | ||||
| -rw-r--r-- | src/import.hx | 2 | ||||
| -rw-r--r-- | src/server/ConsoleInput.hx | 2 | ||||
| -rw-r--r-- | src/server/HttpServer.hx | 2 | ||||
| -rw-r--r-- | src/server/Logger.hx | 3 | ||||
| -rw-r--r-- | src/server/Main.hx | 2 | ||||
| -rw-r--r-- | src/server/Utils.hx | 2 | ||||
| -rw-r--r-- | src/server/YoutubeFallback.hx | 2 |
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, |
