131 lines
3.8 KiB
PHP
131 lines
3.8 KiB
PHP
<?php
|
||
/*
|
||
Plugin Name: Spotify Recent Oauth
|
||
Description: Gutenberg‑block som visar den senast spelade låten från Spotify via OAuth.
|
||
Version: 1.1.0
|
||
Author: Christian Ohlsson
|
||
*/
|
||
|
||
if (!defined('ABSPATH')) exit;
|
||
|
||
// Inkludera admin‑filer
|
||
require_once plugin_dir_path(__FILE__) . 'admin/settings.php';
|
||
require_once plugin_dir_path(__FILE__) . 'admin/oauth-handler.php';
|
||
|
||
|
||
/*
|
||
* Registrera block, script och stilmallar
|
||
*/
|
||
function sro_register_block() {
|
||
|
||
// --- JS för blockeditorn ---
|
||
wp_register_script(
|
||
'sro-block-js',
|
||
plugins_url('blocks/block.js', __FILE__),
|
||
array('wp-blocks', 'wp-element', 'wp-i18n', 'wp-block-editor'),
|
||
filemtime(plugin_dir_path(__FILE__) . 'blocks/block.js')
|
||
);
|
||
|
||
// --- Frontend-stil ---
|
||
wp_register_style(
|
||
'sro-style',
|
||
plugins_url('blocks/style.css', __FILE__),
|
||
array(),
|
||
filemtime(plugin_dir_path(__FILE__) . 'blocks/style.css')
|
||
);
|
||
|
||
// --- Editor-stil ---
|
||
wp_register_style(
|
||
'sro-editor-style',
|
||
plugins_url('blocks/editor.css', __FILE__),
|
||
array(),
|
||
filemtime(plugin_dir_path(__FILE__) . 'blocks/editor.css')
|
||
);
|
||
|
||
// Registrera block via block.json
|
||
register_block_type(__DIR__ . '/blocks');
|
||
}
|
||
add_action('init', 'sro_register_block');
|
||
|
||
|
||
/*
|
||
* Hämta senast spelade låt via Spotify API
|
||
*/
|
||
function sro_fetch_recent_track() {
|
||
|
||
$access = get_option('sro_access_token');
|
||
$refresh = get_option('sro_refresh_token');
|
||
$client_id = get_option('sro_client_id');
|
||
$client_secret = get_option('sro_client_secret');
|
||
|
||
// Förnya token om den gått ut (Spotify token håller 3600 sek)
|
||
$expires = get_option('sro_token_expires');
|
||
if (time() > $expires && $refresh) {
|
||
$response = wp_remote_post("https://accounts.spotify.com/api/token", array(
|
||
'body' => array(
|
||
'grant_type' => 'refresh_token',
|
||
'refresh_token' => $refresh,
|
||
'client_id' => $client_id,
|
||
'client_secret' => $client_secret
|
||
)
|
||
));
|
||
|
||
if (!is_wp_error($response)) {
|
||
$data = json_decode(wp_remote_retrieve_body($response), true);
|
||
if (isset($data['access_token'])) {
|
||
$access = $data['access_token'];
|
||
update_option('sro_access_token', $access);
|
||
update_option('sro_token_expires', time() + 3500);
|
||
}
|
||
}
|
||
}
|
||
|
||
if (!$access) return false;
|
||
|
||
// Hämta senaste låten
|
||
$resp = wp_remote_get(
|
||
"https://api.spotify.com/v1/me/player/recently-played?limit=1",
|
||
array('headers' => array('Authorization' => "Bearer $access"))
|
||
);
|
||
|
||
if (is_wp_error($resp)) return false;
|
||
|
||
$data = json_decode(wp_remote_retrieve_body($resp), true);
|
||
|
||
if (!isset($data['items'][0])) return false;
|
||
|
||
return $data['items'][0];
|
||
}
|
||
|
||
|
||
/*
|
||
* Rendera blocket i frontend
|
||
*/
|
||
function sro_render_block() {
|
||
$item = sro_fetch_recent_track();
|
||
if ( ! $item ) {
|
||
return "<p>Spotify är inte anslutet eller så finns ingen nyligen spelad låt.</p>";
|
||
}
|
||
|
||
$track = esc_html($item['track']['name']);
|
||
$artist = esc_html($item['track']['artists'][0]['name']);
|
||
$img = esc_url($item['track']['album']['images'][0]['url']);
|
||
|
||
$played = strtotime($item['played_at']);
|
||
$mins = floor((time() - $played) / 60);
|
||
|
||
ob_start();
|
||
?>
|
||
<div class="sro-container">
|
||
<div class="sro-album">
|
||
<img src="<?php echo $img; ?>" alt="Albumomslag">
|
||
</div>
|
||
<div class="sro-info">
|
||
<div class="sro-track"><?php echo $track; ?></div>
|
||
<div class="sro-artist"><?php echo $artist; ?></div>
|
||
<div class="sro-time">Spelades för <?php echo intval($mins); ?> minuter sedan</div>
|
||
</div>
|
||
</div>
|
||
<?php
|
||
return ob_get_clean();
|
||
}
|