Files
spotify-recent-oauth/spotify-recent-oauth.php
2026-04-03 12:54:51 +02:00

131 lines
3.8 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
/*
Plugin Name: Spotify Recent Oauth
Description: Gutenbergblock som visar den senast spelade låten från Spotify via OAuth.
Version: 1.1.0
Author: Christian Ohlsson
*/
if (!defined('ABSPATH')) exit;
// Inkludera adminfiler
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();
}