Skip to content
Snippets Groups Projects
Select Git revision
  • 3467804af89b831c4e9dbc87eea4759327fe48fc
  • master default protected
  • 60-display-last-tracks-and-some-dump-metadata
  • 58-create-api-for-main-routes
  • 40-add-more-default-playlists-in-quick-create-feature
  • 37-batch-update-recently-played-tracks
  • 11-improve-new-playlist-name-and-description
  • 15-add-a-play-now-button-on-created-playlist-message
  • 20-rename-playlist-with-artists-names
  • 30-save-spotify-personal-token-for-external-use
10 results

index.php

Blame
  • index.php 11.58 KiB
    <?php
    
    // increase timeout limit
    set_time_limit(60);
    
    require '../spotify/spotify.php';
    require '../spotify/lib.php';
    
    if (isset($_GET['logout'])) {
        $_SESSION['accessToken'] = '';
        $_SESSION['refreshToken'] = '';
    }
    
    $_SESSION['accessToken'] = isset($_SESSION['accessToken']) ? $_SESSION['accessToken'] : '';
    $_SESSION['refreshToken'] = isset($_SESSION['refreshToken']) ? $_SESSION['refreshToken'] : '';
    
    if (!$_SESSION['accessToken']) {
        header('Location: auth.php');
        die();
    }
    
    $session = new SpotifyWebAPI\Session($CLIENT_ID, $CLIENT_SECRET, $REDIRECT_URI);
    
    // Use previously requested tokens fetched from session
    if ($_SESSION['accessToken']) {
        $session->setAccessToken($_SESSION['accessToken']);
        $session->setRefreshToken($_SESSION['refreshToken']);
    } else {
        // Or request a new access token
        $session->refreshAccessToken($_SESSION['refreshToken']);
    }
    
    $options = [
        'scope' => $SPOTIFY_REQUIRED_SCOPES,
        'auto_refresh' => true,
    ];
    
    $api = new SpotifyWebAPI\SpotifyWebAPI($options, $session);
    
    // Save new tokens, they might have been updated
    $_SESSION['accessToken'] = $session->getAccessToken();
    $_SESSION['refreshToken'] = $session->getRefreshToken();
    
    // ################################################################
    
    $user = [
        'id' => '',
        'image_url' => '',
        'display_name' => '',
        'profile_url' => '',
    ];
    try {
        $me = $api->me();
    
        $user = [
            'id' => $me->id,
            'image_url' => \count($me->images) ? $me->images[0]->url : '',
            'display_name' => $me->display_name,
            'profile_url' => $me->external_urls->spotify,
        ];
    } catch (Exception $ex) {
    	error_log($ex->getMessage());
    }
    
    $topArtistsCount = 40;
    $playlistsCount = 24;
    
    $tracksCountInShortPlaylist = 50;
    $tracksCountInLongPlaylist = 100;
    
    $templateData = [
      'user' => $user,
      'playlists' => [],
      'topArtists' => [],
      'playlist' => null,
    
      'infos' => [],
      'errors' => [],
    ];
    
    $generatePlaylistFromPlaylist = isset($_GET['generate-playlist-from-playlist']);
    $generatePlaylistFromSelectedTopArtists = isset($_GET['generate-playlist-top-artists']);
    $generatePlaylistFromRandomTopArtists = isset($_GET['generate-playlist-random-top-artists']);
    $generateQuickPlaylistFromDailyMixes = isset($_GET['generate-quick-playlist-from-daily-mixes']);
    $generateQuickPlaylistTambouilleMix = isset($_GET['generate-quick-playlist-tambouille-mix']);
    $showPlaylistContent = isset($_GET['show-playlist']);
    
    $action = '';
    if ($generatePlaylistFromPlaylist) {
        $action = 'generate-playlist-from-playlist';
    } elseif ($generatePlaylistFromSelectedTopArtists) {
        $action = 'generate-playlist-from-selected-top-artists';
    } elseif ($generatePlaylistFromRandomTopArtists) {
        $action = 'generate-playlist-from-random-top-artists';
    } elseif ($generateQuickPlaylistFromDailyMixes) {
        $action = 'generate-playlist-from-daily-mixes';
    } elseif ($generateQuickPlaylistTambouilleMix) {
        $action = 'generate-playlist-tambouille-mix';
    } elseif ($showPlaylistContent) {
        $action = 'show-playlist-content';
    } else {
    }
    
    switch ($action) {
        case 'generate-playlist-from-playlist':
            $selectedPlaylists = $_GET['selected-playlist'];
            printLog('Will create new playlist with recommendations from playlists: '.join(', ', $selectedPlaylists).'".');
            $recommendedTrackIds = [];
    
            $shouldFilterByArtists = isset($_GET['check-playlist-filter-artists']);
            printLog('Filter by artists in source playlists: '.($shouldFilterByArtists ? 'yes' : 'no'));
    
            $generateLongPlaylist = isset($_GET['check-playlist-long-playlist']);
            printLog('Generate long playlist: '.($generateLongPlaylist ? 'yes' : 'no'));
    
            $artistsInSourcePlaylists = [];
    
            foreach ($selectedPlaylists as $selectedPlaylistId) {
                $playlist = $api->getPlaylist($selectedPlaylistId);
                printLog('Will get recommendations from tracks in playlist "'.$playlist->name.'".');
                $playlistTracks = $playlist->tracks->items;
                printLog('Found '.count($playlistTracks).' tracks.');
                foreach ($playlistTracks as $track) {
                    $artists = [];
                    foreach ($track->track->artists as $artist) {
                        $artists[] = $artist->name;
                        $artistsInSourcePlaylists[$artist->id] = 1;
                    }
                    printLog('Track "'.$track->track->name.'" ('.join(', ', $artists).')');
    
                    $recommendations = $api->getRecommendations([
                      'seed_tracks' => [$track->track->id],
                      'limit' => ($generateLongPlaylist ? 50 : 30)
                  ]);
                    printLog(' -> Got '.count($recommendations->tracks).' recommendatations.');
                    foreach ($recommendations->tracks as $recommendedTrack) {
                        $recommendedTrackIds[$recommendedTrack->id] = $recommendedTrack;
                    }
                }
            }
    
            if ($shouldFilterByArtists) {
                $artistsInSourcePlaylists = array_keys($artistsInSourcePlaylists);
                printLog('Filter by artists found in source playlists ('.count($artistsInSourcePlaylists).')');
    
                $filteredTrackIds = [];
                foreach ($recommendedTrackIds as $trackId => $track) {
                    $trackArtistInWantedArtists = false;
                    foreach ($track->artists as $trackArtist) {
                        if (\in_array($trackArtist->id, $artistsInSourcePlaylists)) {
                            $filteredTrackIds[$track->id] = 1;
                        }
                    }
                }
                $recommendedTrackIds = $filteredTrackIds;
            }
    
            $newPlaylist = createPlaylistWithRandomTracks(
                $api,
                $recommendedTrackIds,
                $generateLongPlaylist ? $tracksCountInLongPlaylist : $tracksCountInShortPlaylist
            );
            $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist);
            break;
    
        case 'generate-playlist-from-selected-top-artists':
            $selectedArtists = $_GET['selected-artist'];
            printLog('Will create new playlist with filterted recommendations from artists: '.join(', ', $selectedArtists).'".');
            $recommendedTrackIds = [];
    
            $shouldFilterByArtists = isset($_GET['check-top-artist-filter-artists']);
            printLog('Filter by artists in selection: '.($shouldFilterByArtists ? 'yes' : 'no'));
    
            $generateLongPlaylist = isset($_GET['check-top-artist-long-playlist']);
            printLog('Generate long playlist: '.($generateLongPlaylist ? 'yes' : 'no'));
    
            foreach ($selectedArtists as $selectedArtist) {
                printLog('Get recommendations for artist '.$selectedArtist.'');
                $recommendations = $api->getRecommendations([
                    'seed_artists' => $selectedArtist,
                    'limit' => 100
                ]);
                printLog(' -> Got '.count($recommendations->tracks).' recommendatations.');
    
                // Filter by artist if requested, remove duplicates
                foreach ($recommendations->tracks as $recommendedTrack) {
                    if ($shouldFilterByArtists) {
                        $trackArtistInWantedArtists = false;
                        foreach ($recommendedTrack->artists as $trackArtist) {
                            if (\in_array($trackArtist->id, $selectedArtists)) {
                                $recommendedTrackIds[$recommendedTrack->id] = 1;
                            }
                        }
                    } else {
                        $recommendedTrackIds[$recommendedTrack->id] = 1;
                    }
                }
            }
    
            $newPlaylist = createPlaylistWithRandomTracks(
                $api,
                $recommendedTrackIds,
                $generateLongPlaylist ? $tracksCountInLongPlaylist : $tracksCountInShortPlaylist
            );
            $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist);
            break;
    
        case 'generate-playlist-from-random-top-artists':
            $countInTopArtists = random_int(4, 6);
            $countInLessTopArtists = random_int(4, 6);
            $limitBetweenTopAndLessTop = $topArtistsCount;
            $selectedArtists = getRandomArtistsFromTopArtists(
                $api,
                $countInTopArtists,
                $countInLessTopArtists,
                $limitBetweenTopAndLessTop
            );
            printLog('Will create new playlist with filterted recommendations from random artists: '.join(', ', $selectedArtists).'".');
            $recommendedTrackIds = [];
    
            $shouldFilterByArtists = isset($_GET['check-top-artist-filter-artists']);
            printLog('Filter by artists in selection: '.($shouldFilterByArtists ? 'yes' : 'no'));
    
            $generateLongPlaylist = isset($_GET['check-top-artist-long-playlist']);
            printLog('Generate long playlist: '.($generateLongPlaylist ? 'yes' : 'no'));
    
            foreach ($selectedArtists as $selectedArtist) {
                printLog('Get recommendations for artist '.$selectedArtist.'');
                $recommendations = $api->getRecommendations([
                    'seed_artists' => $selectedArtist,
                    'limit' => 100
                ]);
                printLog(' -> Got '.count($recommendations->tracks).' recommendations.');
    
                // Filter by artist if requested, remove duplicates
                foreach ($recommendations->tracks as $recommendedTrack) {
                    if ($shouldFilterByArtists) {
                        $trackArtistInWantedArtists = false;
                        foreach ($recommendedTrack->artists as $trackArtist) {
                            if (\in_array($trackArtist->id, $selectedArtists)) {
                                $recommendedTrackIds[$recommendedTrack->id] = 1;
                            }
                        }
                    } else {
                        $recommendedTrackIds[$recommendedTrack->id] = 1;
                    }
                }
            }
    
            $newPlaylist = createPlaylistWithRandomTracks(
                $api,
                $recommendedTrackIds,
                $generateLongPlaylist ? $tracksCountInLongPlaylist : $tracksCountInShortPlaylist
            );
            $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist);
            break;
    
        case 'generate-playlist-from-daily-mixes':
            $generateLongPlaylist = isset($_GET['check-quick-create-long-playlist']);
    
            printLog('Generate playlist from Daily Mixes (long playlist :'.($generateLongPlaylist ? 'yes' : 'no').')');
    
            $newPlaylist = createPlaylistFromDailyMixesTracks(
                $api,
                $generateLongPlaylist ? $tracksCountInLongPlaylist : $tracksCountInShortPlaylist
            );
            $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist);
            break;
    
        case 'generate-playlist-tambouille-mix':
            $generateLongPlaylist = isset($_GET['check-quick-create-long-playlist']);
    
            printLog('Generate tambouille mix playlist (long playlist :'.($generateLongPlaylist ? 'yes' : 'no').')');
    
            $newPlaylist = createPlaylistTambouilleMix(
                $api,
                $generateLongPlaylist ? $tracksCountInLongPlaylist : $tracksCountInShortPlaylist
            );
            $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist);
            break;
    
        case 'show-playlist-content':
            printLog('Get content of playlist');
            $playlistId = $_GET['id'];
            $playlist = $api->getPlaylist($playlistId);
            $templateData['infos'][] = getPlaylistInformationMessage($api, $playlist);
            $templateData['playlist'] = createDisplayablePlaylist($playlist);
            break;
    
        default:
            $templateData['topArtists'] = $api->getMyTop('artists', ['limit' => $topArtistsCount, 'time_range' => 'short_term'])->items;
            $templateData['playlists'] = $api->getUserPlaylists($user['id'], ['limit' => $playlistsCount])->items;
            break;
    }
    
    require '../template.php';