'sanitize_text_field',
) );
register_setting( 'spinitron', 'spinitron_cache_duration', array(
'sanitize_callback' => 'absint',
) );
register_setting( 'spinitron', 'spinitron_audio_stream_url', array(
'sanitize_callback' => 'esc_url_raw',
) );
add_settings_section(
'spinitron_section',
'API Settings',
'spinitron_section_callback',
'spinitron'
);
add_settings_field(
'spinitron_api_key',
'API Key',
'spinitron_api_key_render',
'spinitron',
'spinitron_section'
);
add_settings_field(
'spinitron_cache_duration',
'Cache Duration (seconds)',
'spinitron_cache_duration_render',
'spinitron',
'spinitron_section'
);
add_settings_field(
'spinitron_audio_stream_url',
'Audio Stream URL',
'spinitron_audio_stream_url_render',
'spinitron',
'spinitron_section'
);
}
function spinitron_api_key_render() {
$api_key = get_option( 'spinitron_api_key' );
echo '';
}
function spinitron_cache_duration_render() {
$cache_duration = get_option( 'spinitron_cache_duration', 60 );
echo '';
}
function spinitron_section_callback() {
echo '
Enter your Spinitron API credentials and cache settings below:
';
}
function spinitron_options_page_html() {
if ( ! current_user_can( 'manage_options' ) ) return;
?>
Spinitron Now Playing Settings
'GET',
'callback' => 'spinitron_now_playing_endpoint',
'permission_callback' => '__return_true'
) );
} );
function spinitron_now_playing_endpoint( $request ) {
$api_key = get_option( 'spinitron_api_key' );
$cache_duration = get_option( 'spinitron_cache_duration', 60 );
$cache_duration = max( 1, (int) $cache_duration );
// Check API key
if ( empty( $api_key ) ) {
return new WP_Error( 'api_key_missing', 'Spinitron API key is not configured.', array( 'status' => 500 ) );
}
// Check cache
$cached_data = get_transient( 'spinitron_now_playing_data' );
if ( $cached_data !== false ) {
return spinitron_create_response( $cached_data );
}
// Fetch new data
$spin_url = 'https://spinitron.com/api/spins?count=1&sort=start&direction=desc';
$args = array(
'headers' => array(
'Authorization' => 'Bearer ' . $api_key,
'Accept' => 'application/json',
'User-Agent' => 'WordPress Spinitron Now Playing',
),
'timeout' => 5,
);
// Fetch spin data
$spin_response = wp_remote_get( $spin_url, $args );
if ( is_wp_error( $spin_response ) ) {
$error_data = array(
'status' => 'error',
'error' => 'API request failed: ' . $spin_response->get_error_message(),
'last_updated' => time(),
);
set_transient( 'spinitron_now_playing_data', $error_data, $cache_duration );
return spinitron_create_response( $error_data );
}
$spin_body = wp_remote_retrieve_body( $spin_response );
$spin_data = json_decode( $spin_body, true );
if ( empty( $spin_data['items'] ) ) {
$error_data = array(
'status' => 'error',
'error' => 'No spins found in response',
'last_updated' => time(),
);
set_transient( 'spinitron_now_playing_data', $error_data, $cache_duration );
return spinitron_create_response( $error_data );
}
$spin_item = $spin_data['items'][0];
// Fetch playlist data
if ( empty( $spin_item['_links']['playlist']['href'] ) ) {
$error_data = array(
'status' => 'error',
'error' => 'Spin data missing playlist link',
'spin_data' => $spin_item,
'last_updated' => time(),
);
set_transient( 'spinitron_now_playing_data', $error_data, $cache_duration );
return spinitron_create_response( $error_data );
}
$playlist_url = $spin_item['_links']['playlist']['href'];
$playlist_response = wp_remote_get( $playlist_url, $args );
if ( is_wp_error( $playlist_response ) ) {
$error_data = array(
'status' => 'error',
'error' => 'Playlist request failed: ' . $playlist_response->get_error_message(),
'spin_data' => $spin_item,
'last_updated' => time(),
);
set_transient( 'spinitron_now_playing_data', $error_data, $cache_duration );
return spinitron_create_response( $error_data );
}
$playlist_body = wp_remote_retrieve_body( $playlist_response );
$playlist_data = json_decode( $playlist_body, true );
// Successful response
$result = array(
'status' => 'ok',
'spin_data' => $spin_item,
'playlist_data' => $playlist_data,
'error' => null,
'last_updated' => time(),
);
set_transient( 'spinitron_now_playing_data', $result, $cache_duration );
return spinitron_create_response( $result );
}
function spinitron_create_response( $data ) {
$response = new WP_REST_Response( $data );
$response->header( 'Access-Control-Allow-Origin', '*' );
$response->header( 'Cache-Control', 'no-cache, max-age=0' );
return $response;
}
// Add shortcode for player
add_shortcode('spinitron_player', 'spinitron_player_shortcode');
function spinitron_player_shortcode() {
$audio_url = get_option('spinitron_audio_stream_url');
ob_start(); ?>
';
}
// Enqueue assets
add_action('wp_enqueue_scripts', 'spinitron_enqueue_assets');
function spinitron_enqueue_assets() {
wp_enqueue_style('spinitron-player', plugins_url('player.css', __FILE__));
wp_enqueue_script('spinitron-player', plugins_url('player.js', __FILE__), array(), false, true);
wp_localize_script('spinitron-player', 'spinitronConfig', array(
'endpoint' => rest_url('spinitron/v1/now-playing'),
'cacheDuration' => get_option('spinitron_cache_duration', 60) * 1000
));
}
// Recently Played Marquee Shortcode
add_shortcode('spinitron_recently_played', 'spinitron_recently_played_shortcode');
function spinitron_recently_played_shortcode() {
ob_start(); ?>