Youtube api v3 search

418
25 ноября 2017, 12:01

Использую youtube api v3, и не понимаю, что я делаю. Есть метод buildApiRequest в котором получается запросить некоторые данные, но стоит выйти чуть шаг влево\вправо, все прекращает работать. Это не считая того, что некоторые видео по запросу приходят с idVideo === undefined.

Курил документацию, к сожалению мой английский не до конца позволяет понять всю картину, что и куда идёт, зачем столько формальностей и лишнего кода(опять же, на мой взгляд - более опытные ребята, вероятно, понимают: почему и зачем так, но в моем понимании - это как минимум, странно).

Приведу пример того, как это работает у меня (90% кода взято из офф документации, из моих действий было лишь удаление jQuery, переписал на нативный js и добавил es6 синтаксиса).

Код:

 /***** START BOILERPLATE CODE: Load client library, authorize user. *****/
// Global variables for GoogleAuth object, auth status. 
let GoogleAuth;
/** 
 * Load the API's client and auth2 modules. 
 * Call the initClient function after the modules load. 
 */
function handleClientLoad() {
    gapi.load('client:auth2', initClient);
}
function initClient() {
    // Initialize the gapi.client object, which app uses to make API requests. 
    // Get API key and client ID from API Console. 
    // 'scope' field specifies space-delimited list of access scopes 
    gapi.client.init({
        'clientId': '_тут мой айди_',
        'discoveryDocs': ['https://www.googleapis.com/discovery/v1/apis/youtube/v3/rest'],
        'scope': 'https://www.googleapis.com/auth/youtube.force-ssl https://www.googleapis.com/auth/youtubepartner',
    }).then(function() {
        GoogleAuth = gapi.auth2.getAuthInstance();
        // Listen for sign-in state changes. 
        GoogleAuth.isSignedIn.listen(updateSigninStatus);
        // Handle initial sign-in state. (Determine if user is already signed in.) 
        setSigninStatus();
        // Call handleAuthClick function when user clicks on "Authorize" button. 
        let authorizeButton = document.getElementById("execute-request-button");
        authorizeButton.onclick = () => handleAuthClick(event);
    });
}
function handleAuthClick(event) {
    // Sign user in after click on auth button. 
    GoogleAuth.signIn();
}
function setSigninStatus() {
    var user = GoogleAuth.currentUser.get();
    isAuthorized = user.hasGrantedScopes('https://www.googleapis.com/auth/youtube.force-ssl https://www.googleapis.com/auth/youtubepartner');
    // Toggle button text and displayed statement based on current auth status. 
}
function updateSigninStatus(isSignedIn) {
    setSigninStatus();
}
function createResource(properties) {
    console.log(properties, "проперти");
    var resource = {};
    var normalizedProps = properties;
    for (var p in properties) {
        var value = properties[p];
        if (p && p.substr(-2, 2) == '[]') {
            var adjustedName = p.replace('[]', '');
            if (value) {
                normalizedProps[adjustedName] = value.split(',');
            }
            delete normalizedProps[p];
        }
    }
    for (var p in normalizedProps) {
        // Leave properties that don't have values out of inserted resource. 
        if (normalizedProps.hasOwnProperty(p) && normalizedProps[p]) {
            var propArray = p.split('.');
            var ref = resource;
            for (var pa = 0; pa < propArray.length; pa++) {
                var key = propArray[pa];
                if (pa == propArray.length - 1) {
                    ref[key] = normalizedProps[p];
                } else {
                    ref = ref[key] = ref[key] || {};
                }
            }
        };
    }
    return resource;
}
function removeEmptyParams(params) {
    for (var p in params) {
        if (!params[p] || params[p] == 'undefined') {
            delete params[p];
        }
    }
    return params;
}
function executeRequest(request, callback) {
    request.execute(function(response) {
        console.log(response);
        if (callback) {
            callback(response);
        }
    });
}
function buildApiRequest(requestMethod, path, params, properties, callback) {
    params = removeEmptyParams(params);
    var request;
    if (properties) {
        var resource = createResource(properties);
        request = gapi.client.request({
            'body': resource,
            'method': requestMethod,
            'path': path,
            'params': params
        });
    } else {
        request = gapi.client.request({
            'method': requestMethod,
            'path': path,
            'params': params
        });
    }
    executeRequest(request, callback);
}
/***** END BOILERPLATE CODE *****/

Если у кого-то будет настроение\желание написать краткий гайд по тому, что здесь происходит, то я был бы очень благодарен.

Что из себя представляет gapi и что с его помощью можно делать? DiscoveryDocs - для чего это нужно? Scope - что это? Как работать с next\prev pageToken'ами?

READ ALSO
Книги по JS/React/Angular

Книги по JS/React/Angular

Ребята подскажите где можно скачать литературу по JS/React/Angular/ на русском бесплатноПо JS хотелось бы что нить про OOP JS,паттерны

373
Не учитывать клик, при выделении

Не учитывать клик, при выделении

Обработчик висит на элементе mainПри клике по элементам внутри main, если элемент (цель клика) является потомком блока message, к соответствующему...

378
как сделать UNIT тесты

как сделать UNIT тесты

Готовлюсь к собеседованию, помогите плиз разобраться с тестамиНапример как можно протестить эту функцию

262
Аккордеон в обратную сторону

Аккордеон в обратную сторону

Все аккордеоны открывают контент вниз методом next(), как мне сделать чтобы кнопка всегда была внизу, а текст скрытый аккордеоном открывался...

371