Skip to content
Snippets Groups Projects
Select Git revision
  • 25745181c7f36685ba0f4197de55c093677facbd
  • 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 8.32 KiB
    <?php
    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 = $api->me();
    
    $topArtistsCount = 40;
    $playlistsCount = 24;
    
    $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']);
    
    if ($generatePlaylistFromPlaylist) {
        $selectedPlaylists = $_GET['selected-playlist'];
        error_log('Will create new playlist with recommendations from playlists: '.join(', ', $selectedPlaylists).'".');
        $recommendedTrackIds = [];
    
        $shouldFilterByArtists = isset($_GET['check-playlist-filter-artists']);
        error_log('Filter by artists in source playlists: '.($shouldFilterByArtists ? 'yes' : 'no'));
    
        $generateLongPlaylist = isset($_GET['check-playlist-long-playlist']);
        error_log('Generate long playlist: '.($generateLongPlaylist ? 'yes' : 'no'));
    
        $artistsInSourcePlaylists = [];
    
        foreach ($selectedPlaylists as $selectedPlaylistId) {
            $playlist = $api->getPlaylist($selectedPlaylistId);
            error_log('Will get recommendations from tracks in playlist "'.$playlist->name.'".');
            $playlistTracks = $playlist->tracks->items;
            error_log('Found '.count($playlistTracks).' tracks.');
            foreach ($playlistTracks as $track) {
                $artists = [];
                foreach ($track->track->artists as $artist) {
                    $artists[] = $artist->name;
                    $artistsInSourcePlaylists[$artist->id] = 1;
                }
                error_log('Track "'.$track->track->name.'" ('.join(', ', $artists).')');
    
                $recommendations = $api->getRecommendations([
                  'seed_tracks' => [$track->track->id],
                  'limit' => ($generateLongPlaylist ? 50 : 30)
              ]);
                error_log(' -> Got '.count($recommendations->tracks).' recommendatations.');
                foreach ($recommendations->tracks as $recommendedTrack) {
                    $recommendedTrackIds[$recommendedTrack->id] = $recommendedTrack;
                }
            }
        }
    
        if ($shouldFilterByArtists) {
            $artistsInSourcePlaylists = array_keys($artistsInSourcePlaylists);
            error_log('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 ? 100 : 50));
        $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist);
        $templateData['playlist'] = createDisplayablePlaylist($newPlaylist);
    
    } elseif ($generatePlaylistFromSelectedTopArtists) {
    
        $selectedArtists = $_GET['selected-artist'];
        error_log('Will create new playlist with filterted recommendations from artists: '.join(', ', $selectedArtists).'".');
        $recommendedTrackIds = [];
    
        $shouldFilterByArtists = isset($_GET['check-top-artist-filter-artists']);
        error_log('Filter by artists in selection: '.($shouldFilterByArtists ? 'yes' : 'no'));
    
        $generateLongPlaylist = isset($_GET['check-top-artist-long-playlist']);
        error_log('Generate long playlist: '.($generateLongPlaylist ? 'yes' : 'no'));
    
        foreach ($selectedArtists as $selectedArtist) {
            error_log('Get recommendations for artist '.$selectedArtist.'');
            $recommendations = $api->getRecommendations([
                'seed_artists' => $selectedArtist,
                'limit' => ($generateLongPlaylist ? 150 : 100)
            ]);
            error_log(' -> 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 ? 100 : 50));
        $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist);
        $templateData['playlist'] = createDisplayablePlaylist($newPlaylist);
    
    } elseif ($generatePlaylistFromRandomTopArtists) {
    
        $countInTopArtists = random_int(4, 6);
        $countInLessTopArtists = random_int(4, 6);
        $limitBetweenTopAndLessTop = $topArtistsCount;
        $selectedArtists = getRandomArtistsFromTopArtists($api, $countInTopArtists, $countInLessTopArtists, $limitBetweenTopAndLessTop);
        error_log('Will create new playlist with filterted recommendations from random artists: '.join(', ', $selectedArtists).'".');
        $recommendedTrackIds = [];
    
        $shouldFilterByArtists = isset($_GET['check-top-artist-filter-artists']);
        error_log('Filter by artists in selection: '.($shouldFilterByArtists ? 'yes' : 'no'));
    
        $generateLongPlaylist = isset($_GET['check-top-artist-long-playlist']);
        error_log('Generate long playlist: '.($generateLongPlaylist ? 'yes' : 'no'));
    
        foreach ($selectedArtists as $selectedArtist) {
            error_log('Get recommendations for artist '.$selectedArtist.'');
            $recommendations = $api->getRecommendations([
                'seed_artists' => $selectedArtist,
                'limit' => ($generateLongPlaylist ? 150 : 100)
            ]);
            error_log(' -> 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 ? 100 : 50));
        $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist);
        $templateData['playlist'] = createDisplayablePlaylist($newPlaylist);
    } else {
        $templateData['topArtists'] = $api->getMyTop('artists', ['limit' => $topArtistsCount, 'time_range' => 'short_term'])->items;
        $templateData['playlists'] = $api->getUserPlaylists($user->id, ['limit' => $playlistsCount])->items;
    }
    
    require '../template.php';