diff options
| -rw-r--r-- | res/client.js | 73 | ||||
| -rw-r--r-- | src/client/players/Youtube.hx | 69 |
2 files changed, 81 insertions, 61 deletions
diff --git a/res/client.js b/res/client.js index 5e4f8b3..df22653 100644 --- a/res/client.js +++ b/res/client.js @@ -2477,7 +2477,7 @@ var client_players_Youtube = function(main,player) { this.matchHours = new EReg("([0-9]+)H",""); this.isLoaded = false; this.playerEl = window.document.querySelector("#ytapiplayer"); - this.urlVideoId = "?part=snippet&fields=items(snippet/resourceId/videoId)"; + this.urlVideoId = "?part=snippet&fields=nextPageToken,items(snippet/resourceId/videoId)"; this.urlTitleDuration = "?part=snippet,contentDetails&fields=items(snippet/title,contentDetails/duration)"; this.playlistUrl = "https://www.googleapis.com/youtube/v3/playlistItems"; this.videosUrl = "https://www.googleapis.com/youtube/v3/videos"; @@ -2579,38 +2579,49 @@ client_players_Youtube.prototype = { var _gthis = this; var id = this.extractPlaylistId(data.url); var maxResults = this.main.getYoutubePlaylistLimit(); - var http = new haxe_http_HttpJs("" + this.playlistUrl + this.urlVideoId + "&maxResults=" + maxResults + "&playlistId=" + id + "&key=" + this.apiKey); - http.onData = function(text) { - var json = JSON.parse(text); - if(json.error != null) { - _gthis.youtubeApiError(json.error); - callback({ duration : 0}); - return; - } - var items = json.items; - if(items == null || items.length == 0) { + var dataUrl = "" + this.playlistUrl + this.urlVideoId + "&maxResults=" + maxResults + "&playlistId=" + id + "&key=" + this.apiKey; + var loadJson = null; + loadJson = function(url) { + var http = new haxe_http_HttpJs(url); + http.onData = function(text) { + var json = JSON.parse(text); + if(json.error != null) { + _gthis.youtubeApiError(json.error); + callback({ duration : 0}); + return; + } + var items = json.items; + if(items == null || items.length == 0) { + callback({ duration : 0}); + return; + } + if(!data.atEnd) { + _gthis.main.sortItemsForQueueNext(items); + } + var loadNextItem = null; + loadNextItem = function() { + var obj = { url : "https://youtu.be/" + items.shift().snippet.resourceId.videoId, atEnd : data.atEnd}; + _gthis.getVideoData(obj,function(data) { + callback(data); + maxResults -= 1; + if(maxResults <= 0) { + return; + } + if(items.length > 0) { + loadNextItem(); + } else if(json.nextPageToken != null) { + loadJson("" + dataUrl + "&pageToken=" + json.nextPageToken); + } + }); + }; + loadNextItem(); + }; + http.onError = function(msg) { callback({ duration : 0}); - return; - } - if(!data.atEnd) { - _gthis.main.sortItemsForQueueNext(items); - } - var loadNextItem = null; - loadNextItem = function() { - var obj = { url : "https://youtu.be/" + items.shift().snippet.resourceId.videoId, atEnd : data.atEnd}; - _gthis.getVideoData(obj,function(data) { - callback(data); - if(items.length > 0) { - loadNextItem(); - } - }); }; - loadNextItem(); - }; - http.onError = function(msg) { - callback({ duration : 0}); + http.request(); }; - http.request(); + loadJson(dataUrl); } ,youtubeApiError: function(error) { this.main.serverMessage(4,"Error " + error.code + ": " + error.message,false); @@ -2632,7 +2643,7 @@ client_players_Youtube.prototype = { } callback({ duration : _gthis.tempYoutube.getDuration()}); }, onError : function(e) { - haxe_Log.trace("Error " + e.data,{ fileName : "src/client/players/Youtube.hx", lineNumber : 192, className : "client.players.Youtube", methodName : "getRemoteDataFallback"}); + haxe_Log.trace("Error " + e.data,{ fileName : "src/client/players/Youtube.hx", lineNumber : 201, className : "client.players.Youtube", methodName : "getRemoteDataFallback"}); if(_gthis.playerEl.contains(video)) { _gthis.playerEl.removeChild(video); } diff --git a/src/client/players/Youtube.hx b/src/client/players/Youtube.hx index 2061585..10064b6 100644 --- a/src/client/players/Youtube.hx +++ b/src/client/players/Youtube.hx @@ -21,7 +21,7 @@ class Youtube implements IPlayer { final videosUrl = "https://www.googleapis.com/youtube/v3/videos"; final playlistUrl = "https://www.googleapis.com/youtube/v3/playlistItems"; final urlTitleDuration = "?part=snippet,contentDetails&fields=items(snippet/title,contentDetails/duration)"; - final urlVideoId = "?part=snippet&fields=items(snippet/resourceId/videoId)"; + final urlVideoId = "?part=snippet&fields=nextPageToken,items(snippet/resourceId/videoId)"; final main:Main; final player:Player; final playerEl:Element = ge("#ytapiplayer"); @@ -125,38 +125,47 @@ class Youtube implements IPlayer { function getPlaylistVideoData(data:VideoDataRequest, callback:(data:VideoData)->Void):Void { final url = data.url; final id = extractPlaylistId(url); - final maxResults = main.getYoutubePlaylistLimit(); + var maxResults = main.getYoutubePlaylistLimit(); final dataUrl = '$playlistUrl$urlVideoId&maxResults=$maxResults&playlistId=$id&key=$apiKey'; - final http = new Http(dataUrl); - http.onData = text -> { - final json = Json.parse(text); - if (json.error != null) { - youtubeApiError(json.error); - callback({duration: 0}); - return; - } - final items:Array<Dynamic> = json.items; - if (items == null || items.length == 0) { - callback({duration: 0}); - return; - } - if (!data.atEnd) main.sortItemsForQueueNext(items); - function loadNextItem():Void { - final item = items.shift(); - final id:String = item.snippet.resourceId.videoId; - final obj = { - url: 'https://youtu.be/$id', - atEnd: data.atEnd - }; - getVideoData(obj, data -> { - callback(data); - if (items.length > 0) loadNextItem(); - }); + + function loadJson(url:String):Void { + final http = new Http(url); + http.onData = text -> { + final json = Json.parse(text); + if (json.error != null) { + youtubeApiError(json.error); + callback({duration: 0}); + return; + } + final items:Array<Dynamic> = json.items; + if (items == null || items.length == 0) { + callback({duration: 0}); + return; + } + if (!data.atEnd) main.sortItemsForQueueNext(items); + function loadNextItem():Void { + final item = items.shift(); + final id:String = item.snippet.resourceId.videoId; + final obj = { + url: 'https://youtu.be/$id', + atEnd: data.atEnd + }; + getVideoData(obj, data -> { + callback(data); + maxResults--; + if (maxResults <= 0) return; + if (items.length > 0) loadNextItem(); + else if (json.nextPageToken != null) { + loadJson('$dataUrl&pageToken=${json.nextPageToken}'); + } + }); + } + loadNextItem(); } - loadNextItem(); + http.onError = msg -> callback({duration: 0}); + http.request(); } - http.onError = msg -> callback({duration: 0}); - http.request(); + loadJson(dataUrl); } function youtubeApiError(error:Dynamic):Void { |
