├── .gitignore ├── Gruntfile.js ├── LICENSE ├── README.md ├── bower.json ├── demo ├── index.html └── js │ └── app.js ├── dist ├── angular-youtube-api-factory.js └── angular-youtube-api-factory.min.js ├── package-lock.json ├── package.json └── src └── angular-youtube-api-factory.js /.gitignore: -------------------------------------------------------------------------------- 1 | /bower_components 2 | /.idea/ 3 | /.codekit-cache/ 4 | config.codekit 5 | /node_modules -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function(grunt) { 2 | 3 | var banner = '/**\n @name: <%= pkg.name %> \n @version: <%= pkg.version %> (<%= grunt.template.today("dd-mm-yyyy") %>) \n @author: <%= pkg.author %> \n @url: <%= pkg.homepage %> \n @license: <%= pkg.license %>\n*/\n'; 4 | 5 | grunt.initConfig({ 6 | pkg: grunt.file.readJSON('package.json'), 7 | uglify: { 8 | js: { 9 | files : { 10 | 'dist/angular-youtube-api-factory.min.js' : ['src/*.js'] 11 | } 12 | }, 13 | options: { 14 | banner: banner, 15 | } 16 | }, 17 | concat: { 18 | options: { 19 | separator: ';', 20 | banner: banner, 21 | }, 22 | dist: { 23 | files : { 24 | 'dist/angular-youtube-api-factory.js' : ['src/*.js'] 25 | } 26 | }, 27 | }, 28 | watch: { 29 | minifiyJs: { 30 | files: [ 31 | 'src/*.js' 32 | ], 33 | tasks: ['uglify', 'concat'], 34 | options: { 35 | spawn: true, 36 | }, 37 | }, 38 | }, 39 | }); 40 | 41 | grunt.loadNpmTasks('grunt-contrib-uglify'); 42 | grunt.loadNpmTasks('grunt-contrib-watch'); 43 | grunt.loadNpmTasks('grunt-contrib-concat'); 44 | 45 | grunt.registerTask('default', ['watch']); 46 | 47 | }; 48 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 Jonathan Hornung 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | **angular-youtube-api-factory** is an angularjs module with a youtube api factory. 2 | 3 | [![npm version](https://badge.fury.io/js/angular-youtube-api-factory.svg)](https://badge.fury.io/js/angular-youtube-api-factory) 4 | [![Bower version](https://badge.fury.io/bo/angular-youtube-api-factory.svg)](https://badge.fury.io/bo/angular-youtube-api-factory) 5 | 6 | Author: Jonathan Hornung ([JohnnyTheTank](https://github.com/JohnnyTheTank)) 7 | 8 | ## Usage 9 | 10 | 1. Install via either [bower](http://bower.io/), [npm](https://www.npmjs.com/) or downloaded files: 11 | 1. `bower install --save angular-youtube-api-factory` 12 | 2. `npm install --save angular-youtube-api-factory` 13 | 3. download [angular-youtube-api-factory.zip](https://github.com/JohnnyTheTank/angular-youtube-api-factory/zipball/master) 14 | 2. Include dependencies in your HTML. 15 | 1. When using bower: 16 | ```html 17 | 18 | ``` 19 | 2. When using npm: 20 | ```html 21 | 22 | ``` 23 | 3. when using downloaded files 24 | ```html 25 | 26 | ``` 27 | 3. Add **`jtt_youtube`** to your application's module dependencies 28 | 29 | ```JavaScript 30 | angular.module('app', ['jtt_youtube']); 31 | ``` 32 | 4. Use the factory `youtubeFactory` 33 | 34 | ```JavaScript 35 | angular.module('app') 36 | .controller('appController', function($scope, youtubeFactory){ 37 | 38 | youtubeFactory.getVideosFromSearchByParams({ 39 | q: 'fcbayern', 40 | key: '' 41 | }).then(function (data) { 42 | console.info('videos from search by query', data); 43 | }); 44 | 45 | }); 46 | ``` 47 | 48 | 49 | ### factory methods 50 | 51 | #### getVideo 52 | ```js 53 | //docs: https://developers.google.com/youtube/v3/docs/videos/list 54 | youtubeFactory.getVideoById({ 55 | videoId: "", 56 | part: "", // (optional) default: 'id,snippet,contentDetails,statistics' 57 | key: "", 58 | }).then(function (_data) { 59 | //on success 60 | }).catch(function (_data) { 61 | //on error 62 | }); 63 | ``` 64 | 65 | #### getVideos 66 | ```js 67 | //docs: https://developers.google.com/youtube/v3/docs/channels/list 68 | youtubeFactory.getVideosFromChannelById({ 69 | channelId: "", // converter: http://johnnythetank.github.io/youtube-channel-name-converter/ 70 | q: "", // (optional) search string 71 | location: "", // (optional) The parameter value is a string that specifies latitude/longitude coordinates e.g. '37.42307,-122.08427'. 72 | locationRadius: "", // (optional) valid values e.g. '1500m', '5km', '10000ft', and '0.75mi' | default: '5000m' 73 | order: "", // (optional) valid values: 'date', 'rating', 'relevance', 'title', 'videoCount', 'viewCount' | default: 'date' 74 | maxResults: "", // (optional) valid values: 0-50 | default: 5 75 | publishedAfter: "", // (optional) RFC 3339 formatted date-time value (1970-01-01T00:00:00Z) 76 | publishedBefore: "", // (optional) RFC 3339 formatted date-time value (1970-01-01T00:00:00Z) 77 | regionCode: "", // (optional) ISO 3166-1 alpha-2 country code 78 | relevanceLanguage: "", // (optional) ISO 639-1 two-letter language code 79 | safeSearch: "", // (optional) valid values: 'moderate','none','strict' | defaut: 'moderate' 80 | maxResults: "", // (optional) valid values: 0-50 | default: 5 81 | videoEmbeddable: "", // (optional) valid values: 'true', 'any' | default: 'true' 82 | videoLicense: "", // (optional) valid values: 'any','creativeCommon','youtube' 83 | videoSyndicated: "", // (optional) restrict a search to only videos that can be played outside youtube.com. valid values: 'any','true' | default: 'any' 84 | fields: "", // (optional) Selector specifying which fields to include in a partial response 85 | nextPageToken: "", // (optional) either 'nextPageToken' or 'prevPageToken' 86 | prevPageToken: "", // (optional) either 'nextPageToken' or 'prevPageToken' 87 | part: "", // (optional) default: 'id,snippet' 88 | key: "", 89 | }).then(function (_data) { 90 | //on success 91 | }).catch(function (_data) { 92 | //on error 93 | }); 94 | ``` 95 | 96 | ```js 97 | //docs: https://developers.google.com/youtube/v3/docs/search/list 98 | youtubeFactory.getVideosFromSearchByParams({ 99 | q: "", // (optional) search string 100 | location: "", // (optional) The parameter value is a string that specifies latitude/longitude coordinates e.g. '37.42307,-122.08427'. 101 | locationRadius: "", // (optional) valid values e.g. '1500m', '5km', '10000ft', and '0.75mi' | default: '5000m' 102 | order: "", // (optional) valid values: 'date', 'rating', 'relevance', 'title', 'videoCount', 'viewCount' | default: 'date' 103 | maxResults: "", // (optional) valid values: 0-50 | default: 5 104 | publishedAfter: "", // (optional) RFC 3339 formatted date-time value (1970-01-01T00:00:00Z) 105 | publishedBefore: "", // (optional) RFC 3339 formatted date-time value (1970-01-01T00:00:00Z) 106 | regionCode: "", // (optional) ISO 3166-1 alpha-2 country code 107 | relevanceLanguage: "", // (optional) ISO 639-1 two-letter language code 108 | safeSearch: "", // (optional) valid values: 'moderate','none','strict' | defaut: 'moderate' 109 | maxResults: "", // (optional) valid values: 0-50 | default: 5 110 | videoEmbeddable: "", // (optional) valid values: 'true', 'any' | default: 'true' 111 | videoLicense: "", // (optional) valid values: 'any','creativeCommon','youtube' 112 | videoSyndicated: "", // (optional) restrict a search to only videos that can be played outside youtube.com. valid values: 'any','true' | default: 'any' 113 | fields: "", // (optional) Selector specifying which fields to include in a partial response 114 | nextPageToken: "", // (optional) either 'nextPageToken' or 'prevPageToken' 115 | prevPageToken: "", // (optional) either 'nextPageToken' or 'prevPageToken' 116 | part: "", // (optional) default: 'id,snippet' 117 | key: "", 118 | }).then(function (_data) { 119 | //on success 120 | }).catch(function (_data) { 121 | //on error 122 | }); 123 | ``` 124 | 125 | ```js 126 | //docs: https://developers.google.com/youtube/v3/docs/playlists/list 127 | youtubeFactory.getVideosFromPlaylistById({ 128 | playlistId: "", 129 | maxResults: "", // (optional) valid values: 0-50 // default: 5 130 | nextPageToken: "", // (optional) either 'nextPageToken' or 'prevPageToken' 131 | prevPageToken: "", // (optional) either 'nextPageToken' or 'prevPageToken' 132 | part: "", // (optional) default: 'id,snippet' 133 | key: "", 134 | }).then(function (_data) { 135 | //on success 136 | }).catch(function (_data) { 137 | //on error 138 | }); 139 | ``` 140 | 141 | 142 | #### getChannel 143 | ```js 144 | // docs: https://developers.google.com/youtube/v3/docs/search/list 145 | youtubeFactory.getChannelById({ 146 | channelId: "", // converter: http://johnnythetank.github.io/youtube-channel-name-converter/ 147 | nextPageToken: "", // (optional) either 'nextPageToken' or 'prevPageToken' 148 | prevPageToken: "", // (optional) either 'nextPageToken' or 'prevPageToken' 149 | part: "", // (optional) default: 'id,snippet' 150 | key: "", 151 | }).then(function (_data) { 152 | //on success 153 | }).catch(function (_data) { 154 | //on error 155 | }); 156 | ``` 157 | 158 | 159 | ## Youtube Data JSON API 160 | * Docs: https://developers.google.com/youtube/v3/docs/ 161 | * API Explorer: https://developers.google.com/apis-explorer/#p/youtube/v3/ 162 | * Youtube Username to Channel ID Converter: http://johnnythetank.github.io/youtube-channel-name-converter/ 163 | 164 | ## More angular-api-factories 165 | [bandsintown](https://github.com/JohnnyTheTank/angular-bandsintown-api-factory) - [dailymotion](https://github.com/JohnnyTheTank/angular-dailymotion-api-factory) - [facebook](https://github.com/JohnnyTheTank/angular-facebook-api-factory) - [flickr](https://github.com/JohnnyTheTank/angular-flickr-api-factory) - [footballdata](https://github.com/JohnnyTheTank/angular-footballdata-api-factory) - [github](https://github.com/JohnnyTheTank/angular-github-api-factory) - [openweathermap](https://github.com/JohnnyTheTank/angular-openweathermap-api-factory) - [tumblr](https://github.com/JohnnyTheTank/angular-tumblr-api-factory) - [vimeo](https://github.com/JohnnyTheTank/angular-vimeo-api-factory) - [wikipedia](https://github.com/JohnnyTheTank/angular-wikipedia-api-factory) - **youtube** 166 | 167 | ## License 168 | MIT 169 | -------------------------------------------------------------------------------- /bower.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-youtube-api-factory", 3 | "homepage": "https://github.com/JohnnyTheTank/angular-youtube-api-factory", 4 | "authors": [ 5 | "Jonathan Hornung " 6 | ], 7 | "version": "0.6.2", 8 | "description": "angular factory for youtube rest api connection", 9 | "main": "dist/angular-youtube-api-factory.min.js", 10 | "moduleType": [], 11 | "keywords": [ 12 | "youtube", 13 | "angularjs", 14 | "rest", 15 | "api", 16 | "json" 17 | ], 18 | "license": "MIT", 19 | "ignore": [ 20 | "**/.*", 21 | "node_modules", 22 | "bower_components", 23 | "test", 24 | "tests" 25 | ], 26 | "dependencies": { 27 | "angular": "*" 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /demo/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | angular-youtube-api-factory 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | Look in your console 15 |
16 | 17 | 18 | -------------------------------------------------------------------------------- /demo/js/app.js: -------------------------------------------------------------------------------- 1 | var app = angular.module("app", ['jtt_youtube']); 2 | app.controller('controller', ['$scope', 'youtubeFactory', function($scope, youtubeFactory) { 3 | 4 | var _apiKey = ""; 5 | 6 | youtubeFactory.getVideosFromChannelById({ 7 | channelId: "UCVkXCOYluJvD6OPjX9HXj-A", 8 | maxResults: "50", 9 | key: _apiKey, 10 | }).then(function (_data) { 11 | console.info("videos from channel by id", _data); 12 | }); 13 | 14 | youtubeFactory.getVideosFromSearchByParams({ 15 | q: "fcbayern", 16 | maxResults: "50", 17 | key: _apiKey, 18 | }).then(function (_data) { 19 | console.info("videos from search by q", _data); 20 | }); 21 | 22 | youtubeFactory.getVideosFromSearchByParams({ 23 | location: "37.42307,-122.08427", 24 | locationRadius: "1000m", 25 | maxResults: "50", 26 | key: _apiKey, 27 | }).then(function (_data) { 28 | console.info("videos from search by location", _data); 29 | }); 30 | 31 | youtubeFactory.getVideosFromPlaylistById({ 32 | playlistId: "PLNLa2lbKPczGCueOYxjrwYDuNTBtQveK0", 33 | maxResults: "50", 34 | key: _apiKey, 35 | }).then(function (_data) { 36 | console.info("videos from playlist by id", _data); 37 | }); 38 | 39 | youtubeFactory.getVideoById({ 40 | videoId: "rG-haoIhH9o", 41 | key: _apiKey, 42 | }).then(function (_data) { 43 | console.info("video by id", _data); 44 | }); 45 | 46 | youtubeFactory.getChannelById({ 47 | channelId: "UCVkXCOYluJvD6OPjX9HXj-A", 48 | key: _apiKey, 49 | }).then(function (_data) { 50 | console.info("channel by id", _data); 51 | }); 52 | 53 | 54 | }]); 55 | -------------------------------------------------------------------------------- /dist/angular-youtube-api-factory.js: -------------------------------------------------------------------------------- 1 | /** 2 | @name: angular-youtube-api-factory 3 | @version: 0.6.2 (30-11-2017) 4 | @author: Jonathan Hornung 5 | @url: https://github.com/JohnnyTheTank/angular-youtube-api-factory#readme 6 | @license: MIT 7 | */ 8 | "use strict"; 9 | 10 | angular.module("jtt_youtube", []) 11 | .factory('youtubeFactory', ['$http', 'youtubeSearchDataService', function ($http, youtubeSearchDataService) { 12 | 13 | var youtubeFactory = {}; 14 | 15 | youtubeFactory.getVideosFromChannelById = function (_params) { 16 | var youtubeSearchData = youtubeSearchDataService.getNew("videosFromChannelById", _params); 17 | return $http({ 18 | method: 'GET', 19 | url: youtubeSearchData.url, 20 | params: youtubeSearchData.object, 21 | }); 22 | }; 23 | 24 | youtubeFactory.getVideosFromSearchByParams = function (_params) { 25 | var youtubeSearchData = youtubeSearchDataService.getNew("videosFromSearchByParams", _params); 26 | return $http({ 27 | method: 'GET', 28 | url: youtubeSearchData.url, 29 | params: youtubeSearchData.object, 30 | }); 31 | }; 32 | 33 | youtubeFactory.getVideosFromPlaylistById = function (_params) { 34 | var youtubeSearchData = youtubeSearchDataService.getNew("videosFromPlaylistById", _params); 35 | return $http({ 36 | method: 'GET', 37 | url: youtubeSearchData.url, 38 | params: youtubeSearchData.object, 39 | }); 40 | }; 41 | 42 | youtubeFactory.getChannelById = function (_params) { 43 | var youtubeSearchData = youtubeSearchDataService.getNew("channelById", _params); 44 | return $http({ 45 | method: 'GET', 46 | url: youtubeSearchData.url, 47 | params: youtubeSearchData.object, 48 | }); 49 | }; 50 | 51 | youtubeFactory.getChannelByUsername = function (_params) { 52 | var youtubeSearchData = youtubeSearchDataService.getNew("channelByUsername", _params); 53 | return $http({ 54 | method: 'GET', 55 | url: youtubeSearchData.url, 56 | params: youtubeSearchData.object, 57 | }); 58 | }; 59 | 60 | youtubeFactory.getVideoById = function (_params) { 61 | var youtubeSearchData = youtubeSearchDataService.getNew("videoById", _params); 62 | return $http({ 63 | method: 'GET', 64 | url: youtubeSearchData.url, 65 | params: youtubeSearchData.object, 66 | }); 67 | }; 68 | 69 | return youtubeFactory; 70 | }]) 71 | .service('youtubeSearchDataService', function () { 72 | this.getApiBaseUrl = function (_params) { 73 | return "https://content.googleapis.com/youtube/v3/"; 74 | }; 75 | 76 | this.fillDataInObjectByList = function (_object, _params, _list) { 77 | 78 | angular.forEach(_list, function (value, key) { 79 | if (typeof value !== "undefined" && value.constructor === Array) { 80 | if (angular.isDefined(_params[value[0]])) { 81 | _object.object[value[0]] = _params[value[0]]; 82 | } else { 83 | _object.object[value[0]] = value[1]; 84 | } 85 | } else { 86 | if (angular.isDefined(_params[value])) { 87 | _object.object[value] = _params[value]; 88 | } 89 | } 90 | }); 91 | 92 | return _object; 93 | }; 94 | 95 | this.getNew = function (_type, _params) { 96 | 97 | var youtubeSearchData = { 98 | object: { 99 | key: _params.key, 100 | }, 101 | url: '', 102 | }; 103 | 104 | switch (_type) { 105 | case 'videosFromChannelById': 106 | 107 | youtubeSearchData = this.fillDataInObjectByList(youtubeSearchData, _params, [ 108 | ['part', 'id,snippet'], 109 | ['type', 'video'], 110 | ['order', 'date'], 111 | ['videoEmbeddable', true], 112 | 'channelId', 113 | 'q', 114 | 'maxResults', 115 | 'publishedAfter', 116 | 'publishedBefore', 117 | 'regionCode', 118 | 'relevanceLanguage', 119 | 'safeSearch', 120 | 'videoLicense', 121 | 'videoSyndicated', 122 | 'fields' 123 | ]); 124 | 125 | youtubeSearchData.url = this.getApiBaseUrl() + 'search?'; 126 | 127 | if (_params.nextPageToken || _params.prevPageToken) { 128 | youtubeSearchData.url += 'pageToken=' + (_params.nextPageToken || _params.prevPageToken) + '&'; 129 | } 130 | break; 131 | 132 | case 'videosFromSearchByParams': 133 | 134 | youtubeSearchData = this.fillDataInObjectByList(youtubeSearchData, _params, [ 135 | ['part', 'id,snippet'], 136 | ['type', 'video'], 137 | ['order', 'date'], 138 | ['videoEmbeddable', true], 139 | 'location', 140 | 'q', 141 | 'maxResults', 142 | 'publishedAfter', 143 | 'publishedBefore', 144 | 'regionCode', 145 | 'relevanceLanguage', 146 | 'safeSearch', 147 | 'videoLicense', 148 | 'videoSyndicated', 149 | 'fields' 150 | ]); 151 | 152 | if (angular.isDefined(_params.locationRadius)) { 153 | youtubeSearchData.object.locationRadius = _params.locationRadius; 154 | } else { 155 | if (angular.isDefined(_params.location)) { 156 | youtubeSearchData.object.locationRadius = '5000m' 157 | } 158 | } 159 | 160 | youtubeSearchData.url = this.getApiBaseUrl() + 'search?'; 161 | if (_params.nextPageToken || _params.prevPageToken) { 162 | youtubeSearchData.url += 'pageToken=' + (_params.nextPageToken || _params.prevPageToken) + '&'; 163 | } 164 | break; 165 | 166 | case 'videosFromPlaylistById': 167 | 168 | youtubeSearchData = this.fillDataInObjectByList(youtubeSearchData, _params, [ 169 | ['part', 'id,snippet'], 170 | ['type', 'video'], 171 | 'playlistId', 172 | 'maxResults', 173 | 'fields' 174 | ]); 175 | 176 | youtubeSearchData.url = this.getApiBaseUrl() + 'playlistItems?'; 177 | if (_params.nextPageToken || _params.prevPageToken) { 178 | youtubeSearchData.url += 'pageToken=' + (_params.nextPageToken || _params.prevPageToken) + '&'; 179 | } 180 | break; 181 | 182 | case 'videoById': 183 | youtubeSearchData = this.fillDataInObjectByList(youtubeSearchData, _params, [ 184 | ['part', 'id,snippet,contentDetails,statistics'], 185 | ]); 186 | 187 | youtubeSearchData.object.id = _params.videoId; 188 | 189 | youtubeSearchData.url = this.getApiBaseUrl() + 'videos?'; 190 | if (_params.nextPageToken || _params.prevPageToken) { 191 | youtubeSearchData.url += 'pageToken=' + (_params.nextPageToken || _params.prevPageToken) + '&'; 192 | } 193 | break; 194 | 195 | case 'channelById': 196 | youtubeSearchData = this.fillDataInObjectByList(youtubeSearchData, _params, [ 197 | ['part', 'id,snippet'], 198 | ['type', 'channel'] 199 | ]); 200 | 201 | youtubeSearchData.url = this.getApiBaseUrl() + 'search?'; 202 | if (_params.nextPageToken || _params.prevPageToken) { 203 | youtubeSearchData.url += 'pageToken=' + (_params.nextPageToken || _params.prevPageToken) + '&'; 204 | } 205 | break; 206 | 207 | case 'channelByUsername': 208 | 209 | youtubeSearchData = this.fillDataInObjectByList(youtubeSearchData, _params, [ 210 | ['part', 'id,snippet'], 211 | 'forUsername' 212 | ]); 213 | 214 | youtubeSearchData.url = this.getApiBaseUrl() + 'channels?'; 215 | if (_params.nextPageToken || _params.prevPageToken) { 216 | youtubeSearchData.url += 'pageToken=' + (_params.nextPageToken || _params.prevPageToken) + '&'; 217 | } 218 | break; 219 | } 220 | 221 | return youtubeSearchData; 222 | }; 223 | }); 224 | -------------------------------------------------------------------------------- /dist/angular-youtube-api-factory.min.js: -------------------------------------------------------------------------------- 1 | /** 2 | @name: angular-youtube-api-factory 3 | @version: 0.6.2 (30-11-2017) 4 | @author: Jonathan Hornung 5 | @url: https://github.com/JohnnyTheTank/angular-youtube-api-factory#readme 6 | @license: MIT 7 | */ 8 | "use strict";angular.module("jtt_youtube",[]).factory("youtubeFactory",["$http","youtubeSearchDataService",function(a,b){var c={};return c.getVideosFromChannelById=function(c){var d=b.getNew("videosFromChannelById",c);return a({method:"GET",url:d.url,params:d.object})},c.getVideosFromSearchByParams=function(c){var d=b.getNew("videosFromSearchByParams",c);return a({method:"GET",url:d.url,params:d.object})},c.getVideosFromPlaylistById=function(c){var d=b.getNew("videosFromPlaylistById",c);return a({method:"GET",url:d.url,params:d.object})},c.getChannelById=function(c){var d=b.getNew("channelById",c);return a({method:"GET",url:d.url,params:d.object})},c.getChannelByUsername=function(c){var d=b.getNew("channelByUsername",c);return a({method:"GET",url:d.url,params:d.object})},c.getVideoById=function(c){var d=b.getNew("videoById",c);return a({method:"GET",url:d.url,params:d.object})},c}]).service("youtubeSearchDataService",function(){this.getApiBaseUrl=function(a){return"https://content.googleapis.com/youtube/v3/"},this.fillDataInObjectByList=function(a,b,c){return angular.forEach(c,function(c,d){"undefined"!=typeof c&&c.constructor===Array?angular.isDefined(b[c[0]])?a.object[c[0]]=b[c[0]]:a.object[c[0]]=c[1]:angular.isDefined(b[c])&&(a.object[c]=b[c])}),a},this.getNew=function(a,b){var c={object:{key:b.key},url:""};switch(a){case"videosFromChannelById":c=this.fillDataInObjectByList(c,b,[["part","id,snippet"],["type","video"],["order","date"],["videoEmbeddable",!0],"channelId","q","maxResults","publishedAfter","publishedBefore","regionCode","relevanceLanguage","safeSearch","videoLicense","videoSyndicated","fields"]),c.url=this.getApiBaseUrl()+"search?",(b.nextPageToken||b.prevPageToken)&&(c.url+="pageToken="+(b.nextPageToken||b.prevPageToken)+"&");break;case"videosFromSearchByParams":c=this.fillDataInObjectByList(c,b,[["part","id,snippet"],["type","video"],["order","date"],["videoEmbeddable",!0],"location","q","maxResults","publishedAfter","publishedBefore","regionCode","relevanceLanguage","safeSearch","videoLicense","videoSyndicated","fields"]),angular.isDefined(b.locationRadius)?c.object.locationRadius=b.locationRadius:angular.isDefined(b.location)&&(c.object.locationRadius="5000m"),c.url=this.getApiBaseUrl()+"search?",(b.nextPageToken||b.prevPageToken)&&(c.url+="pageToken="+(b.nextPageToken||b.prevPageToken)+"&");break;case"videosFromPlaylistById":c=this.fillDataInObjectByList(c,b,[["part","id,snippet"],["type","video"],"playlistId","maxResults","fields"]),c.url=this.getApiBaseUrl()+"playlistItems?",(b.nextPageToken||b.prevPageToken)&&(c.url+="pageToken="+(b.nextPageToken||b.prevPageToken)+"&");break;case"videoById":c=this.fillDataInObjectByList(c,b,[["part","id,snippet,contentDetails,statistics"]]),c.object.id=b.videoId,c.url=this.getApiBaseUrl()+"videos?",(b.nextPageToken||b.prevPageToken)&&(c.url+="pageToken="+(b.nextPageToken||b.prevPageToken)+"&");break;case"channelById":c=this.fillDataInObjectByList(c,b,[["part","id,snippet"],["type","channel"]]),c.url=this.getApiBaseUrl()+"search?",(b.nextPageToken||b.prevPageToken)&&(c.url+="pageToken="+(b.nextPageToken||b.prevPageToken)+"&");break;case"channelByUsername":c=this.fillDataInObjectByList(c,b,[["part","id,snippet"],"forUsername"]),c.url=this.getApiBaseUrl()+"channels?",(b.nextPageToken||b.prevPageToken)&&(c.url+="pageToken="+(b.nextPageToken||b.prevPageToken)+"&")}return c}}); -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-youtube-api-factory", 3 | "version": "0.6.2", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abbrev": { 8 | "version": "1.1.1", 9 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 10 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", 11 | "dev": true 12 | }, 13 | "align-text": { 14 | "version": "0.1.4", 15 | "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", 16 | "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", 17 | "dev": true, 18 | "requires": { 19 | "kind-of": "3.2.2", 20 | "longest": "1.0.1", 21 | "repeat-string": "1.6.1" 22 | } 23 | }, 24 | "amdefine": { 25 | "version": "1.0.1", 26 | "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", 27 | "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", 28 | "dev": true 29 | }, 30 | "angular": { 31 | "version": "1.6.7", 32 | "resolved": "https://registry.npmjs.org/angular/-/angular-1.6.7.tgz", 33 | "integrity": "sha1-D4mDfa4XdrAcyx+iCW2w2Tc9mJc=" 34 | }, 35 | "ansi-regex": { 36 | "version": "0.2.1", 37 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", 38 | "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", 39 | "dev": true 40 | }, 41 | "ansi-styles": { 42 | "version": "1.1.0", 43 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", 44 | "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", 45 | "dev": true 46 | }, 47 | "argparse": { 48 | "version": "0.1.16", 49 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", 50 | "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", 51 | "dev": true, 52 | "requires": { 53 | "underscore": "1.7.0", 54 | "underscore.string": "2.4.0" 55 | }, 56 | "dependencies": { 57 | "underscore.string": { 58 | "version": "2.4.0", 59 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", 60 | "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=", 61 | "dev": true 62 | } 63 | } 64 | }, 65 | "async": { 66 | "version": "0.1.22", 67 | "resolved": "https://registry.npmjs.org/async/-/async-0.1.22.tgz", 68 | "integrity": "sha1-D8GqoIig4+8Ovi2IMbqw3PiEUGE=", 69 | "dev": true 70 | }, 71 | "camelcase": { 72 | "version": "1.2.1", 73 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", 74 | "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", 75 | "dev": true 76 | }, 77 | "center-align": { 78 | "version": "0.1.3", 79 | "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", 80 | "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", 81 | "dev": true, 82 | "requires": { 83 | "align-text": "0.1.4", 84 | "lazy-cache": "1.0.4" 85 | } 86 | }, 87 | "chalk": { 88 | "version": "0.5.1", 89 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", 90 | "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", 91 | "dev": true, 92 | "requires": { 93 | "ansi-styles": "1.1.0", 94 | "escape-string-regexp": "1.0.5", 95 | "has-ansi": "0.1.0", 96 | "strip-ansi": "0.3.0", 97 | "supports-color": "0.2.0" 98 | } 99 | }, 100 | "cliui": { 101 | "version": "2.1.0", 102 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", 103 | "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", 104 | "dev": true, 105 | "requires": { 106 | "center-align": "0.1.3", 107 | "right-align": "0.1.3", 108 | "wordwrap": "0.0.2" 109 | } 110 | }, 111 | "coffee-script": { 112 | "version": "1.3.3", 113 | "resolved": "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz", 114 | "integrity": "sha1-FQ1rTLUiiUNp7+1qIQHCC8f0pPQ=", 115 | "dev": true 116 | }, 117 | "colors": { 118 | "version": "0.6.2", 119 | "resolved": "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz", 120 | "integrity": "sha1-JCP+ZnisDF2uiFLl0OW+CMmXq8w=", 121 | "dev": true 122 | }, 123 | "dateformat": { 124 | "version": "1.0.2-1.2.3", 125 | "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz", 126 | "integrity": "sha1-sCIMAt6YYXQztyhRz0fePfLNvuk=", 127 | "dev": true 128 | }, 129 | "debug": { 130 | "version": "0.7.4", 131 | "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", 132 | "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", 133 | "dev": true 134 | }, 135 | "decamelize": { 136 | "version": "1.2.0", 137 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 138 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", 139 | "dev": true 140 | }, 141 | "duplexer": { 142 | "version": "0.1.1", 143 | "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", 144 | "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", 145 | "dev": true 146 | }, 147 | "escape-string-regexp": { 148 | "version": "1.0.5", 149 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 150 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 151 | "dev": true 152 | }, 153 | "esprima": { 154 | "version": "1.0.4", 155 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz", 156 | "integrity": "sha1-n1V+CPw7TSbs6d00+Pv0drYlha0=", 157 | "dev": true 158 | }, 159 | "eventemitter2": { 160 | "version": "0.4.14", 161 | "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz", 162 | "integrity": "sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=", 163 | "dev": true 164 | }, 165 | "exit": { 166 | "version": "0.1.2", 167 | "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", 168 | "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", 169 | "dev": true 170 | }, 171 | "faye-websocket": { 172 | "version": "0.4.4", 173 | "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.4.4.tgz", 174 | "integrity": "sha1-wUxbO/FNdBf/v9mQwKdJXNnzN7w=", 175 | "dev": true 176 | }, 177 | "figures": { 178 | "version": "1.7.0", 179 | "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", 180 | "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", 181 | "dev": true, 182 | "requires": { 183 | "escape-string-regexp": "1.0.5", 184 | "object-assign": "4.1.1" 185 | } 186 | }, 187 | "findup-sync": { 188 | "version": "0.1.3", 189 | "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz", 190 | "integrity": "sha1-fz56l7gjksZTvwZYm9hRkOk8NoM=", 191 | "dev": true, 192 | "requires": { 193 | "glob": "3.2.11", 194 | "lodash": "2.4.2" 195 | }, 196 | "dependencies": { 197 | "glob": { 198 | "version": "3.2.11", 199 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", 200 | "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", 201 | "dev": true, 202 | "requires": { 203 | "inherits": "2.0.3", 204 | "minimatch": "0.3.0" 205 | } 206 | }, 207 | "lodash": { 208 | "version": "2.4.2", 209 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", 210 | "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", 211 | "dev": true 212 | }, 213 | "minimatch": { 214 | "version": "0.3.0", 215 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", 216 | "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", 217 | "dev": true, 218 | "requires": { 219 | "lru-cache": "2.7.3", 220 | "sigmund": "1.0.1" 221 | } 222 | } 223 | } 224 | }, 225 | "gaze": { 226 | "version": "0.5.2", 227 | "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", 228 | "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", 229 | "dev": true, 230 | "requires": { 231 | "globule": "0.1.0" 232 | } 233 | }, 234 | "getobject": { 235 | "version": "0.1.0", 236 | "resolved": "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz", 237 | "integrity": "sha1-BHpEl4n6Fg0Bj1SG7ZEyC27HiFw=", 238 | "dev": true 239 | }, 240 | "glob": { 241 | "version": "3.1.21", 242 | "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", 243 | "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", 244 | "dev": true, 245 | "requires": { 246 | "graceful-fs": "1.2.3", 247 | "inherits": "1.0.2", 248 | "minimatch": "0.2.14" 249 | }, 250 | "dependencies": { 251 | "inherits": { 252 | "version": "1.0.2", 253 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", 254 | "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", 255 | "dev": true 256 | } 257 | } 258 | }, 259 | "globule": { 260 | "version": "0.1.0", 261 | "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", 262 | "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", 263 | "dev": true, 264 | "requires": { 265 | "glob": "3.1.21", 266 | "lodash": "1.0.2", 267 | "minimatch": "0.2.14" 268 | }, 269 | "dependencies": { 270 | "lodash": { 271 | "version": "1.0.2", 272 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", 273 | "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", 274 | "dev": true 275 | } 276 | } 277 | }, 278 | "graceful-fs": { 279 | "version": "1.2.3", 280 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", 281 | "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", 282 | "dev": true 283 | }, 284 | "grunt": { 285 | "version": "0.4.5", 286 | "resolved": "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz", 287 | "integrity": "sha1-VpN81RlDJK3/bSB2MYMqnWuk5/A=", 288 | "dev": true, 289 | "requires": { 290 | "async": "0.1.22", 291 | "coffee-script": "1.3.3", 292 | "colors": "0.6.2", 293 | "dateformat": "1.0.2-1.2.3", 294 | "eventemitter2": "0.4.14", 295 | "exit": "0.1.2", 296 | "findup-sync": "0.1.3", 297 | "getobject": "0.1.0", 298 | "glob": "3.1.21", 299 | "grunt-legacy-log": "0.1.3", 300 | "grunt-legacy-util": "0.2.0", 301 | "hooker": "0.2.3", 302 | "iconv-lite": "0.2.11", 303 | "js-yaml": "2.0.5", 304 | "lodash": "0.9.2", 305 | "minimatch": "0.2.14", 306 | "nopt": "1.0.10", 307 | "rimraf": "2.2.8", 308 | "underscore.string": "2.2.1", 309 | "which": "1.0.9" 310 | } 311 | }, 312 | "grunt-contrib-concat": { 313 | "version": "0.5.1", 314 | "resolved": "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-0.5.1.tgz", 315 | "integrity": "sha1-lTxu/f39LBB6uchQd/LUsk0xzUk=", 316 | "dev": true, 317 | "requires": { 318 | "chalk": "0.5.1", 319 | "source-map": "0.3.0" 320 | } 321 | }, 322 | "grunt-contrib-uglify": { 323 | "version": "0.11.1", 324 | "resolved": "https://registry.npmjs.org/grunt-contrib-uglify/-/grunt-contrib-uglify-0.11.1.tgz", 325 | "integrity": "sha1-XiKi9nbNEdhx/CoPCKqbKXMEUyU=", 326 | "dev": true, 327 | "requires": { 328 | "chalk": "1.1.3", 329 | "lodash": "4.17.4", 330 | "maxmin": "2.1.0", 331 | "uglify-js": "2.6.4", 332 | "uri-path": "1.0.0" 333 | }, 334 | "dependencies": { 335 | "ansi-regex": { 336 | "version": "2.1.1", 337 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 338 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 339 | "dev": true 340 | }, 341 | "ansi-styles": { 342 | "version": "2.2.1", 343 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 344 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 345 | "dev": true 346 | }, 347 | "chalk": { 348 | "version": "1.1.3", 349 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 350 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 351 | "dev": true, 352 | "requires": { 353 | "ansi-styles": "2.2.1", 354 | "escape-string-regexp": "1.0.5", 355 | "has-ansi": "2.0.0", 356 | "strip-ansi": "3.0.1", 357 | "supports-color": "2.0.0" 358 | } 359 | }, 360 | "has-ansi": { 361 | "version": "2.0.0", 362 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 363 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 364 | "dev": true, 365 | "requires": { 366 | "ansi-regex": "2.1.1" 367 | } 368 | }, 369 | "lodash": { 370 | "version": "4.17.4", 371 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", 372 | "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", 373 | "dev": true 374 | }, 375 | "strip-ansi": { 376 | "version": "3.0.1", 377 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 378 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 379 | "dev": true, 380 | "requires": { 381 | "ansi-regex": "2.1.1" 382 | } 383 | }, 384 | "supports-color": { 385 | "version": "2.0.0", 386 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 387 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 388 | "dev": true 389 | } 390 | } 391 | }, 392 | "grunt-contrib-watch": { 393 | "version": "0.6.1", 394 | "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-0.6.1.tgz", 395 | "integrity": "sha1-ZP3LolpjX1tNobbOb5DaCutuPxU=", 396 | "dev": true, 397 | "requires": { 398 | "async": "0.2.10", 399 | "gaze": "0.5.2", 400 | "lodash": "2.4.2", 401 | "tiny-lr-fork": "0.0.5" 402 | }, 403 | "dependencies": { 404 | "async": { 405 | "version": "0.2.10", 406 | "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", 407 | "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", 408 | "dev": true 409 | }, 410 | "lodash": { 411 | "version": "2.4.2", 412 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", 413 | "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", 414 | "dev": true 415 | } 416 | } 417 | }, 418 | "grunt-legacy-log": { 419 | "version": "0.1.3", 420 | "resolved": "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz", 421 | "integrity": "sha1-7ClCboAwIa9ZAp+H0vnNczWgVTE=", 422 | "dev": true, 423 | "requires": { 424 | "colors": "0.6.2", 425 | "grunt-legacy-log-utils": "0.1.1", 426 | "hooker": "0.2.3", 427 | "lodash": "2.4.2", 428 | "underscore.string": "2.3.3" 429 | }, 430 | "dependencies": { 431 | "lodash": { 432 | "version": "2.4.2", 433 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", 434 | "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", 435 | "dev": true 436 | }, 437 | "underscore.string": { 438 | "version": "2.3.3", 439 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", 440 | "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", 441 | "dev": true 442 | } 443 | } 444 | }, 445 | "grunt-legacy-log-utils": { 446 | "version": "0.1.1", 447 | "resolved": "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz", 448 | "integrity": "sha1-wHBrndkGThFvNvI/5OawSGcsD34=", 449 | "dev": true, 450 | "requires": { 451 | "colors": "0.6.2", 452 | "lodash": "2.4.2", 453 | "underscore.string": "2.3.3" 454 | }, 455 | "dependencies": { 456 | "lodash": { 457 | "version": "2.4.2", 458 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz", 459 | "integrity": "sha1-+t2DS5aDBz2hebPq5tnA0VBT9z4=", 460 | "dev": true 461 | }, 462 | "underscore.string": { 463 | "version": "2.3.3", 464 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", 465 | "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=", 466 | "dev": true 467 | } 468 | } 469 | }, 470 | "grunt-legacy-util": { 471 | "version": "0.2.0", 472 | "resolved": "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz", 473 | "integrity": "sha1-kzJIhNv343qf98Am3/RR2UqeVUs=", 474 | "dev": true, 475 | "requires": { 476 | "async": "0.1.22", 477 | "exit": "0.1.2", 478 | "getobject": "0.1.0", 479 | "hooker": "0.2.3", 480 | "lodash": "0.9.2", 481 | "underscore.string": "2.2.1", 482 | "which": "1.0.9" 483 | } 484 | }, 485 | "gzip-size": { 486 | "version": "3.0.0", 487 | "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-3.0.0.tgz", 488 | "integrity": "sha1-VGGI6b3DN/Zzdy+BZgRks4nc5SA=", 489 | "dev": true, 490 | "requires": { 491 | "duplexer": "0.1.1" 492 | } 493 | }, 494 | "has-ansi": { 495 | "version": "0.1.0", 496 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", 497 | "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", 498 | "dev": true, 499 | "requires": { 500 | "ansi-regex": "0.2.1" 501 | } 502 | }, 503 | "hooker": { 504 | "version": "0.2.3", 505 | "resolved": "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz", 506 | "integrity": "sha1-uDT3I8xKJCqmWWNFnfbZhMXT2Vk=", 507 | "dev": true 508 | }, 509 | "iconv-lite": { 510 | "version": "0.2.11", 511 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz", 512 | "integrity": "sha1-HOYKOleGSiktEyH/RgnKS7llrcg=", 513 | "dev": true 514 | }, 515 | "inherits": { 516 | "version": "2.0.3", 517 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 518 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 519 | "dev": true 520 | }, 521 | "is-buffer": { 522 | "version": "1.1.6", 523 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", 524 | "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", 525 | "dev": true 526 | }, 527 | "js-yaml": { 528 | "version": "2.0.5", 529 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz", 530 | "integrity": "sha1-olrmUJmZ6X3yeMZxnaEb0Gh3Q6g=", 531 | "dev": true, 532 | "requires": { 533 | "argparse": "0.1.16", 534 | "esprima": "1.0.4" 535 | } 536 | }, 537 | "kind-of": { 538 | "version": "3.2.2", 539 | "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", 540 | "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", 541 | "dev": true, 542 | "requires": { 543 | "is-buffer": "1.1.6" 544 | } 545 | }, 546 | "lazy-cache": { 547 | "version": "1.0.4", 548 | "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", 549 | "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", 550 | "dev": true 551 | }, 552 | "lodash": { 553 | "version": "0.9.2", 554 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz", 555 | "integrity": "sha1-jzSZxSRdNG1oLlsNO0B2fgnxqSw=", 556 | "dev": true 557 | }, 558 | "longest": { 559 | "version": "1.0.1", 560 | "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", 561 | "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", 562 | "dev": true 563 | }, 564 | "lru-cache": { 565 | "version": "2.7.3", 566 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", 567 | "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", 568 | "dev": true 569 | }, 570 | "maxmin": { 571 | "version": "2.1.0", 572 | "resolved": "https://registry.npmjs.org/maxmin/-/maxmin-2.1.0.tgz", 573 | "integrity": "sha1-TTsiCQPZXu5+t6x/qGTnLcCaMWY=", 574 | "dev": true, 575 | "requires": { 576 | "chalk": "1.1.3", 577 | "figures": "1.7.0", 578 | "gzip-size": "3.0.0", 579 | "pretty-bytes": "3.0.1" 580 | }, 581 | "dependencies": { 582 | "ansi-regex": { 583 | "version": "2.1.1", 584 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 585 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 586 | "dev": true 587 | }, 588 | "ansi-styles": { 589 | "version": "2.2.1", 590 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 591 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 592 | "dev": true 593 | }, 594 | "chalk": { 595 | "version": "1.1.3", 596 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 597 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 598 | "dev": true, 599 | "requires": { 600 | "ansi-styles": "2.2.1", 601 | "escape-string-regexp": "1.0.5", 602 | "has-ansi": "2.0.0", 603 | "strip-ansi": "3.0.1", 604 | "supports-color": "2.0.0" 605 | } 606 | }, 607 | "has-ansi": { 608 | "version": "2.0.0", 609 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 610 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 611 | "dev": true, 612 | "requires": { 613 | "ansi-regex": "2.1.1" 614 | } 615 | }, 616 | "strip-ansi": { 617 | "version": "3.0.1", 618 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 619 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 620 | "dev": true, 621 | "requires": { 622 | "ansi-regex": "2.1.1" 623 | } 624 | }, 625 | "supports-color": { 626 | "version": "2.0.0", 627 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 628 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 629 | "dev": true 630 | } 631 | } 632 | }, 633 | "minimatch": { 634 | "version": "0.2.14", 635 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", 636 | "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", 637 | "dev": true, 638 | "requires": { 639 | "lru-cache": "2.7.3", 640 | "sigmund": "1.0.1" 641 | } 642 | }, 643 | "nopt": { 644 | "version": "1.0.10", 645 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", 646 | "integrity": "sha1-bd0hvSoxQXuScn3Vhfim83YI6+4=", 647 | "dev": true, 648 | "requires": { 649 | "abbrev": "1.1.1" 650 | } 651 | }, 652 | "noptify": { 653 | "version": "0.0.3", 654 | "resolved": "https://registry.npmjs.org/noptify/-/noptify-0.0.3.tgz", 655 | "integrity": "sha1-WPZUpz2XU98MUdlobckhBKZ/S7s=", 656 | "dev": true, 657 | "requires": { 658 | "nopt": "2.0.0" 659 | }, 660 | "dependencies": { 661 | "nopt": { 662 | "version": "2.0.0", 663 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.0.0.tgz", 664 | "integrity": "sha1-ynQW8gpeP5w7hhgPlilfo9C1Lg0=", 665 | "dev": true, 666 | "requires": { 667 | "abbrev": "1.1.1" 668 | } 669 | } 670 | } 671 | }, 672 | "number-is-nan": { 673 | "version": "1.0.1", 674 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 675 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", 676 | "dev": true 677 | }, 678 | "object-assign": { 679 | "version": "4.1.1", 680 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 681 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", 682 | "dev": true 683 | }, 684 | "pretty-bytes": { 685 | "version": "3.0.1", 686 | "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-3.0.1.tgz", 687 | "integrity": "sha1-J9AAjXeAY6C0gRuzXHnxvV1fvM8=", 688 | "dev": true, 689 | "requires": { 690 | "number-is-nan": "1.0.1" 691 | } 692 | }, 693 | "qs": { 694 | "version": "0.5.6", 695 | "resolved": "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz", 696 | "integrity": "sha1-MbGtBYVnZRxSaSFQa5qHk5EaA4Q=", 697 | "dev": true 698 | }, 699 | "repeat-string": { 700 | "version": "1.6.1", 701 | "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", 702 | "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", 703 | "dev": true 704 | }, 705 | "right-align": { 706 | "version": "0.1.3", 707 | "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", 708 | "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", 709 | "dev": true, 710 | "requires": { 711 | "align-text": "0.1.4" 712 | } 713 | }, 714 | "rimraf": { 715 | "version": "2.2.8", 716 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz", 717 | "integrity": "sha1-5Dm+Kq7jJzIZUnMPmaiSnk/FBYI=", 718 | "dev": true 719 | }, 720 | "sigmund": { 721 | "version": "1.0.1", 722 | "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", 723 | "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", 724 | "dev": true 725 | }, 726 | "source-map": { 727 | "version": "0.3.0", 728 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.3.0.tgz", 729 | "integrity": "sha1-hYb7mloAXltQHiHNGLbyG0V60fk=", 730 | "dev": true, 731 | "requires": { 732 | "amdefine": "1.0.1" 733 | } 734 | }, 735 | "strip-ansi": { 736 | "version": "0.3.0", 737 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", 738 | "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", 739 | "dev": true, 740 | "requires": { 741 | "ansi-regex": "0.2.1" 742 | } 743 | }, 744 | "supports-color": { 745 | "version": "0.2.0", 746 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", 747 | "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", 748 | "dev": true 749 | }, 750 | "tiny-lr-fork": { 751 | "version": "0.0.5", 752 | "resolved": "https://registry.npmjs.org/tiny-lr-fork/-/tiny-lr-fork-0.0.5.tgz", 753 | "integrity": "sha1-Hpnh4qhGm3NquX2X7vqYxx927Qo=", 754 | "dev": true, 755 | "requires": { 756 | "debug": "0.7.4", 757 | "faye-websocket": "0.4.4", 758 | "noptify": "0.0.3", 759 | "qs": "0.5.6" 760 | } 761 | }, 762 | "uglify-js": { 763 | "version": "2.6.4", 764 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.4.tgz", 765 | "integrity": "sha1-ZeovswWck5RpLxX+2HwrNsFrmt8=", 766 | "dev": true, 767 | "requires": { 768 | "async": "0.2.10", 769 | "source-map": "0.5.7", 770 | "uglify-to-browserify": "1.0.2", 771 | "yargs": "3.10.0" 772 | }, 773 | "dependencies": { 774 | "async": { 775 | "version": "0.2.10", 776 | "resolved": "https://registry.npmjs.org/async/-/async-0.2.10.tgz", 777 | "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=", 778 | "dev": true 779 | }, 780 | "source-map": { 781 | "version": "0.5.7", 782 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 783 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 784 | "dev": true 785 | } 786 | } 787 | }, 788 | "uglify-to-browserify": { 789 | "version": "1.0.2", 790 | "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", 791 | "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", 792 | "dev": true 793 | }, 794 | "underscore": { 795 | "version": "1.7.0", 796 | "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", 797 | "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=", 798 | "dev": true 799 | }, 800 | "underscore.string": { 801 | "version": "2.2.1", 802 | "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz", 803 | "integrity": "sha1-18D6KvXVoaZ/QlPa7pgTLnM/Dxk=", 804 | "dev": true 805 | }, 806 | "uri-path": { 807 | "version": "1.0.0", 808 | "resolved": "https://registry.npmjs.org/uri-path/-/uri-path-1.0.0.tgz", 809 | "integrity": "sha1-l0fwGDWJM8Md4PzP2C0TjmcmLjI=", 810 | "dev": true 811 | }, 812 | "which": { 813 | "version": "1.0.9", 814 | "resolved": "https://registry.npmjs.org/which/-/which-1.0.9.tgz", 815 | "integrity": "sha1-RgwdoPgQED0DIam2M6+eV15kSG8=", 816 | "dev": true 817 | }, 818 | "window-size": { 819 | "version": "0.1.0", 820 | "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", 821 | "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", 822 | "dev": true 823 | }, 824 | "wordwrap": { 825 | "version": "0.0.2", 826 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", 827 | "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", 828 | "dev": true 829 | }, 830 | "yargs": { 831 | "version": "3.10.0", 832 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", 833 | "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", 834 | "dev": true, 835 | "requires": { 836 | "camelcase": "1.2.1", 837 | "cliui": "2.1.0", 838 | "decamelize": "1.2.0", 839 | "window-size": "0.1.0" 840 | } 841 | } 842 | } 843 | } 844 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "angular-youtube-api-factory", 3 | "version": "0.6.2", 4 | "description": "angularjs factory for youtube json rest api requests", 5 | "main": "dist/angular-youtube-api-factory.min.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/JohnnyTheTank/angular-youtube-api-factory.git" 12 | }, 13 | "keywords": [ 14 | "angularjs", 15 | "angular", 16 | "youtube", 17 | "api", 18 | "factory" 19 | ], 20 | "author": "Jonathan Hornung", 21 | "license": "MIT", 22 | "bugs": { 23 | "url": "https://github.com/JohnnyTheTank/angular-youtube-api-factory/issues" 24 | }, 25 | "homepage": "https://github.com/JohnnyTheTank/angular-youtube-api-factory#readme", 26 | "devDependencies": { 27 | "grunt": "^0.4.5", 28 | "grunt-contrib-concat": "^0.5.1", 29 | "grunt-contrib-uglify": "^0.11.0", 30 | "grunt-contrib-watch": "^0.6.1" 31 | }, 32 | "dependencies": { 33 | "angular": "*" 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /src/angular-youtube-api-factory.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | angular.module("jtt_youtube", []) 4 | .factory('youtubeFactory', ['$http', 'youtubeSearchDataService', function ($http, youtubeSearchDataService) { 5 | 6 | var youtubeFactory = {}; 7 | 8 | youtubeFactory.getVideosFromChannelById = function (_params) { 9 | var youtubeSearchData = youtubeSearchDataService.getNew("videosFromChannelById", _params); 10 | return $http({ 11 | method: 'GET', 12 | url: youtubeSearchData.url, 13 | params: youtubeSearchData.object, 14 | }); 15 | }; 16 | 17 | youtubeFactory.getVideosFromSearchByParams = function (_params) { 18 | var youtubeSearchData = youtubeSearchDataService.getNew("videosFromSearchByParams", _params); 19 | return $http({ 20 | method: 'GET', 21 | url: youtubeSearchData.url, 22 | params: youtubeSearchData.object, 23 | }); 24 | }; 25 | 26 | youtubeFactory.getVideosFromPlaylistById = function (_params) { 27 | var youtubeSearchData = youtubeSearchDataService.getNew("videosFromPlaylistById", _params); 28 | return $http({ 29 | method: 'GET', 30 | url: youtubeSearchData.url, 31 | params: youtubeSearchData.object, 32 | }); 33 | }; 34 | 35 | youtubeFactory.getChannelById = function (_params) { 36 | var youtubeSearchData = youtubeSearchDataService.getNew("channelById", _params); 37 | return $http({ 38 | method: 'GET', 39 | url: youtubeSearchData.url, 40 | params: youtubeSearchData.object, 41 | }); 42 | }; 43 | 44 | youtubeFactory.getChannelByUsername = function (_params) { 45 | var youtubeSearchData = youtubeSearchDataService.getNew("channelByUsername", _params); 46 | return $http({ 47 | method: 'GET', 48 | url: youtubeSearchData.url, 49 | params: youtubeSearchData.object, 50 | }); 51 | }; 52 | 53 | youtubeFactory.getVideoById = function (_params) { 54 | var youtubeSearchData = youtubeSearchDataService.getNew("videoById", _params); 55 | return $http({ 56 | method: 'GET', 57 | url: youtubeSearchData.url, 58 | params: youtubeSearchData.object, 59 | }); 60 | }; 61 | 62 | return youtubeFactory; 63 | }]) 64 | .service('youtubeSearchDataService', function () { 65 | this.getApiBaseUrl = function (_params) { 66 | return "https://content.googleapis.com/youtube/v3/"; 67 | }; 68 | 69 | this.fillDataInObjectByList = function (_object, _params, _list) { 70 | 71 | angular.forEach(_list, function (value, key) { 72 | if (typeof value !== "undefined" && value.constructor === Array) { 73 | if (angular.isDefined(_params[value[0]])) { 74 | _object.object[value[0]] = _params[value[0]]; 75 | } else { 76 | _object.object[value[0]] = value[1]; 77 | } 78 | } else { 79 | if (angular.isDefined(_params[value])) { 80 | _object.object[value] = _params[value]; 81 | } 82 | } 83 | }); 84 | 85 | return _object; 86 | }; 87 | 88 | this.getNew = function (_type, _params) { 89 | 90 | var youtubeSearchData = { 91 | object: { 92 | key: _params.key, 93 | }, 94 | url: '', 95 | }; 96 | 97 | switch (_type) { 98 | case 'videosFromChannelById': 99 | 100 | youtubeSearchData = this.fillDataInObjectByList(youtubeSearchData, _params, [ 101 | ['part', 'id,snippet'], 102 | ['type', 'video'], 103 | ['order', 'date'], 104 | ['videoEmbeddable', true], 105 | 'channelId', 106 | 'q', 107 | 'maxResults', 108 | 'publishedAfter', 109 | 'publishedBefore', 110 | 'regionCode', 111 | 'relevanceLanguage', 112 | 'safeSearch', 113 | 'videoLicense', 114 | 'videoSyndicated', 115 | 'fields' 116 | ]); 117 | 118 | youtubeSearchData.url = this.getApiBaseUrl() + 'search?'; 119 | 120 | if (_params.nextPageToken || _params.prevPageToken) { 121 | youtubeSearchData.url += 'pageToken=' + (_params.nextPageToken || _params.prevPageToken) + '&'; 122 | } 123 | break; 124 | 125 | case 'videosFromSearchByParams': 126 | 127 | youtubeSearchData = this.fillDataInObjectByList(youtubeSearchData, _params, [ 128 | ['part', 'id,snippet'], 129 | ['type', 'video'], 130 | ['order', 'date'], 131 | ['videoEmbeddable', true], 132 | 'location', 133 | 'q', 134 | 'maxResults', 135 | 'publishedAfter', 136 | 'publishedBefore', 137 | 'regionCode', 138 | 'relevanceLanguage', 139 | 'safeSearch', 140 | 'videoLicense', 141 | 'videoSyndicated', 142 | 'fields' 143 | ]); 144 | 145 | if (angular.isDefined(_params.locationRadius)) { 146 | youtubeSearchData.object.locationRadius = _params.locationRadius; 147 | } else { 148 | if (angular.isDefined(_params.location)) { 149 | youtubeSearchData.object.locationRadius = '5000m' 150 | } 151 | } 152 | 153 | youtubeSearchData.url = this.getApiBaseUrl() + 'search?'; 154 | if (_params.nextPageToken || _params.prevPageToken) { 155 | youtubeSearchData.url += 'pageToken=' + (_params.nextPageToken || _params.prevPageToken) + '&'; 156 | } 157 | break; 158 | 159 | case 'videosFromPlaylistById': 160 | 161 | youtubeSearchData = this.fillDataInObjectByList(youtubeSearchData, _params, [ 162 | ['part', 'id,snippet'], 163 | ['type', 'video'], 164 | 'playlistId', 165 | 'maxResults', 166 | 'fields' 167 | ]); 168 | 169 | youtubeSearchData.url = this.getApiBaseUrl() + 'playlistItems?'; 170 | if (_params.nextPageToken || _params.prevPageToken) { 171 | youtubeSearchData.url += 'pageToken=' + (_params.nextPageToken || _params.prevPageToken) + '&'; 172 | } 173 | break; 174 | 175 | case 'videoById': 176 | youtubeSearchData = this.fillDataInObjectByList(youtubeSearchData, _params, [ 177 | ['part', 'id,snippet,contentDetails,statistics'], 178 | ]); 179 | 180 | youtubeSearchData.object.id = _params.videoId; 181 | 182 | youtubeSearchData.url = this.getApiBaseUrl() + 'videos?'; 183 | if (_params.nextPageToken || _params.prevPageToken) { 184 | youtubeSearchData.url += 'pageToken=' + (_params.nextPageToken || _params.prevPageToken) + '&'; 185 | } 186 | break; 187 | 188 | case 'channelById': 189 | youtubeSearchData = this.fillDataInObjectByList(youtubeSearchData, _params, [ 190 | ['part', 'id,snippet'], 191 | ['type', 'channel'] 192 | ]); 193 | 194 | youtubeSearchData.url = this.getApiBaseUrl() + 'search?'; 195 | if (_params.nextPageToken || _params.prevPageToken) { 196 | youtubeSearchData.url += 'pageToken=' + (_params.nextPageToken || _params.prevPageToken) + '&'; 197 | } 198 | break; 199 | 200 | case 'channelByUsername': 201 | 202 | youtubeSearchData = this.fillDataInObjectByList(youtubeSearchData, _params, [ 203 | ['part', 'id,snippet'], 204 | 'forUsername' 205 | ]); 206 | 207 | youtubeSearchData.url = this.getApiBaseUrl() + 'channels?'; 208 | if (_params.nextPageToken || _params.prevPageToken) { 209 | youtubeSearchData.url += 'pageToken=' + (_params.nextPageToken || _params.prevPageToken) + '&'; 210 | } 211 | break; 212 | } 213 | 214 | return youtubeSearchData; 215 | }; 216 | }); 217 | --------------------------------------------------------------------------------