'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(); ?>
NOW PLAYING
-
by - from -
CURRENT SHOW
-
-
'; } // 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(); ?>

LISTEN NOW!