Files
spotify-recent-oauth/spotify-recent.php

141 lines
4.1 KiB
PHP

<?php
/*
Plugin Name: Spotify Recent Track
Description: Plugin som visar den senast spelade låten från Spotify med OAuth-autentisering.
Version: 1.0.0
Author: Christian Ohlsson
*/
if (!defined('ABSPATH')) exit;
require_once plugin_dir_path(__FILE__) . 'admin/settings.php';
require_once plugin_dir_path(__FILE__) . 'admin/oauth-handler.php';
/*
* Register the Gutenberg block
*/
function sro_register_block() {
wp_register_script(
'sro-block-js',
plugins_url('blocks/block.js', __FILE__),
array('wp-blocks', 'wp-element', 'wp-editor'),
filemtime(plugin_dir_path(__FILE__).'blocks/block.js')
);
register_block_type('sro/recent-track', array(
'editor_script' => 'sro-block-js',
'render_callback' => 'sro_render_block'
));
}
add_action('init', 'sro_register_block');
/*
* Fetch recent track 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');
// Refresh token if expired (Spotify tokens last 3600 sec)
$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;
$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];
}
/*
* Render the Gutenberg block
*/
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 );
$mins = intval( $mins );
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 $mins; ?> minuter sedan</div>
</div>
</div>
<?php
return ob_get_clean();
}
function sro_register_block() {
// Registrera blockets resurser
wp_register_script(
'sro-block-js',
plugins_url( 'blocks/block.js', __FILE__ ),
array( 'wp-blocks', 'wp-element', 'wp-editor' ),
filemtime( plugin_dir_path(__FILE__) . 'blocks/block.js' )
);
wp_register_style(
'sro-style',
plugins_url( 'blocks/style.css', __FILE__ ),
array(),
filemtime( plugin_dir_path(__FILE__) . 'blocks/style.css' )
);
wp_register_style(
'sro-editor-style',
plugins_url( 'blocks/editor.css', __FILE__ ),
array(),
filemtime( plugin_dir_path(__FILE__) . 'blocks/editor.css' )
);
// Registrera blocket (block.json sköter allt)
register_block_type( __DIR__ . '/blocks' );
}
add_action( 'init', 'sro_register_block' );