From 1d97ceeae19befdb68bc249dab017d79b8a9d06e Mon Sep 17 00:00:00 2001 From: RblSb Date: Fri, 18 Dec 2020 00:15:42 +0300 Subject: Use page token on requests --- src/client/players/Youtube.hx | 69 ++++++++++++++++++++++++------------------- 1 file changed, 39 insertions(+), 30 deletions(-) (limited to 'src/client/players') 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 = 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 = 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 { -- cgit v1.2.3