package client.players; import js.html.Element; import js.Browser.document; import client.Main.ge; import js.youtube.Youtube as YtInit; import js.youtube.YoutubePlayer; import Types.VideoItem; using StringTools; class Youtube implements IPlayer { static final matchId = ~/v=([A-z0-9_-]+)/; static final matchShort = ~/youtu.be\/([A-z0-9_-]+)/; static final matchEmbed = ~/embed\/([A-z0-9_-]+)/; final main:Main; final player:Player; final playerEl:Element = ge("#ytapiplayer"); var video:Element; var youtube:YoutubePlayer; var isLoaded = false; public function new(main:Main, player:Player) { this.main = main; this.player = player; } public static function isYoutube(url:String):Bool { if (url.contains("youtu.be/")) { return matchShort.match(url); } if (url.contains("youtube.com/embed/")) { return matchEmbed.match(url); } if (!url.contains("youtube.com/")) return false; return matchId.match(url); } function extractVideoId(url:String):String { if (url.contains("youtu.be/")) { matchShort.match(url); return matchShort.matched(1); } if (url.contains("youtube.com/embed/")) { matchEmbed.match(url); return matchEmbed.matched(1); } matchId.match(url); return matchId.matched(1); } public function getRemoteDuration(url:String, callback:(duration:Float)->Void):Void { if (!YtInit.isLoadedAPI) { YtInit.init(() -> getRemoteDuration(url, callback)); return; } final video = document.createDivElement(); video.id = "temp-videoplayer"; Utils.prepend(playerEl, video); youtube = new YoutubePlayer(video.id, { videoId: extractVideoId(url), playerVars: { modestbranding: 1, rel: 0, showinfo: 0 }, events: { onReady: e -> { if (playerEl.contains(video)) playerEl.removeChild(video); callback(youtube.getDuration()); }, onError: e -> { trace('Error ${e.data}'); if (playerEl.contains(video)) playerEl.removeChild(video); callback(0); } } }); } public function loadVideo(item:VideoItem):Void { if (!YtInit.isLoadedAPI) { YtInit.init(() -> loadVideo(item)); return; } video = document.createDivElement(); video.id = "videoplayer"; playerEl.appendChild(video); youtube = new YoutubePlayer(video.id, { videoId: extractVideoId(item.url), playerVars: { autoplay: 1, modestbranding: 1, rel: 0, showinfo: 0, }, events: { // onReady: e -> player.onCanBePlayed(), onStateChange: e -> { switch (e.data) { case UNSTARTED: isLoaded = true; player.onCanBePlayed(); case ENDED: case PLAYING: player.onPlay(); case PAUSED: player.onPause(); case BUFFERING: player.onSetTime(); case CUED: } } } }); } public function removeVideo():Void { if (video == null) return; playerEl.removeChild(video); video = null; } public function play():Void { if (!isLoaded) return; youtube.playVideo(); } public function pause():Void { if (!isLoaded) return; youtube.pauseVideo(); } public function getTime():Float { if (!isLoaded) return 0; return youtube.getCurrentTime(); } public function setTime(time:Float):Void { if (!isLoaded) return; youtube.seekTo((time : Any), true); } }