Я работаю над проектом в Javascript, который включает в себя проигрыватель spotify.Все работает довольно хорошо, за исключением того факта, что песни перестают играть время от времени на 5 секунд.Когда я смотрю консоль, у меня появляется это сообщение об ошибке:
Blocage d’une requête multiorigines (Cross-Origin Request) : la politique « Same Origin » ne permet pas de consulter la ressource distante située sur https://audio-ak-spotify-com.akamaized.net/audio/78ba3ab093dbe2d394531690938ad31baabf72cb?__token__=exp=1558443850~hmac=4db742e9992ad26844a6a5ae2d0c1ed4f88e1ef008e3d0252413addf54b8d804. Raison : échec de la requête CORS.
Просматривая в сети, я обнаружил, что Spotify не позволяет соединиться (получить токен) с Ajax, и я избавился от этой проблемы с помощьюиспользуя бэкэнд для получения токена.Я использую их руководство по быстрому старту: https://developer.spotify.com/documentation/web-playback-sdk/quick-start/ Единственные запросы, которые я делаю вручную, это получить информацию из моего бэкэнда.
//Progress bar default information
let position = 0;
let duration = 0;
let paused = false;
let $element = $('#myProgress');
//Function to update the song progress bar state
function progress() {
var progressBarWidth = position * $element.width() / duration;
$element.find('div').animate({ width: progressBarWidth }, 500);
};
//Adding an interval of 500ms to update the progressbar data
setInterval(function(){
if (position < duration && !paused){
progress();
position = position + 0.5;
}
}, 500);
//Getting playlist next songs every 30 seconds
setInterval(function(){
getAjax("/party/s/{{party_slug}}/upcoming/" ,function(data){
dt.load(JSON.parse(data));
console.log(data);
})
}, 30000);
const iframe = document.querySelector('iframe[src="https://sdk.scdn.co/embedded/index.html"]');
window.onSpotifyWebPlaybackSDKReady = () => {
const token = '{{access_token}}';
const player = new Spotify.Player({
name: '{{party_name}}',
getOAuthToken: cb => { cb(token); }
});
// Error handling
player.addListener('initialization_error', ({ message }) => { console.log(message); });
player.addListener('authentication_error', ({ message }) => { console.log(message); });
player.addListener('account_error', ({ message }) => { console.log(message); });
player.addListener('playback_error', ({ message }) => { console.log(message); });
// Playback status updates
player.addListener('player_state_changed', state => {
//Updating graphical elements
//Showing album cover
document.getElementById("album_cover").src = state['track_window']['current_track']['album']['images'][0]['url'];
//Displaying song title
document.getElementById("song_title").innerHTML = state['track_window']['current_track']['name'];
var artists = '';
for (var i = state['track_window']['current_track']['artists'].length - 1; i >= 0; i--) {
artists = artists + ' ' + state['track_window']['current_track']['artists'][i]['name'];
if (i > 0){
artists = artists + ',';
}
}
//Displaying artists
document.getElementById("song_artists").innerHTML = artists;
//Calculating the progressbar data
paused = state['paused'];
position = 0;
duration = 0;
if (state['position'] != 0) {
position = Math.floor(state['position'] / 1000);
}
if (state['duration'] != 0) {
duration = Math.floor(state['duration'] / 1000);
}
//Updating the track state to the backend
postAjax("/party/s/{{party_slug}}/update/", { 'current' : state['track_window']['current_track']['id'] },
function(data){
});
console.log(state);
});
// Ready
player.addListener('ready', ({ device_id }) => {
//adding the support of Chrome
if (iframe) {
iframe.style.display = 'block';
iframe.style.position = 'absolute';
iframe.style.top = '-1000px';
iframe.style.left = '-1000px';
}
//Informing the backend of the device_id
postAjax('{{callback}}', { 'player_id' : device_id }, function(data){
console.log(data);
});
console.log('Ready with Device ID', device_id);
});
// Not Ready
player.addListener('not_ready', ({ device_id }) => {
console.log('Device ID has gone offline', device_id);
});
// Connect to the player!
player.connect();
};
Как я понял, ошибка CORS - это ошибка на стороне сервера, но, как яЯ ничего не могу сделать с бэкэндом Spotify API. Мне нужно найти решение в моем интерфейсе.Конечно, есть кое-что, чего я не понимаю.Спасибо за вашу драгоценную помощь
Редактировать: вот мои функции getAjax и postAjax, которые я использую для запроса моего бэкэнда
function getAjax(url, success) {
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');
xhr.open('GET', url);
xhr.onreadystatechange = function() {
if (xhr.readyState>3 && xhr.status==200) success(xhr.responseText);
};
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.send();
return xhr;
}
function postAjax(url, data, success) {
var params = typeof data == 'string' ? data : Object.keys(data).map(
function(k){ return encodeURIComponent(k) + '=' + encodeURIComponent(data[k]) }
).join('&');
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
xhr.open('POST', url);
xhr.onreadystatechange = function() {
if (xhr.readyState>3 && xhr.status==200) { success(xhr.responseText); }
};
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
xhr.send(params);
return xhr;
}