Skip to content
Snippets Groups Projects
Select Git revision
  • cc298e0b75868f91c9fde9c9e2de0265ec1f78c2
  • master default protected
  • 61-upgrade-framework-and-dependencies
  • 42-add-allowed-categories-in-settings-page
  • 44-improve-app-metadata
  • 23-add-tip-response-on-clic-on-button
  • Release_1.11.0_55 protected
  • Release_1.10.2_54 protected
  • Release_1.10.1_53 protected
  • Release_1.10.0_52 protected
  • Release_1.9.0_51 protected
  • Release_1.8.0_50 protected
  • Release_1.7.0_49 protected
  • Release_1.6.2_48 protected
  • Release_1.6.1_47 protected
  • Release_1.6.0_46 protected
  • Release_1.5.1_45 protected
  • Release_1.5.0_44 protected
  • Release_1.4.1_43 protected
  • Release_1.4.0_42 protected
  • Release_1.3.1_41 protected
  • Release_1.3.0_40 protected
  • Release_1.2.33_39 protected
  • Release_1.2.32_38 protected
  • Release_1.2.31_37 protected
  • Release_1.2.30_36 protected
26 results

game_position_indicator.dart

Blame
  • PlaylistController.php 14.39 KiB
    <?php
    
    namespace App\Controller;
    
    use App\Service\SpotifyApiService;
    use App\Service\SpotifyPlaylistService;
    use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
    use Symfony\Component\HttpFoundation\JsonResponse;
    use Symfony\Component\HttpFoundation\RedirectResponse;
    use Symfony\Component\HttpFoundation\Request;
    use Symfony\Component\HttpFoundation\Response;
    use Symfony\Component\Routing\Annotation\Route;
    
    class PlaylistController extends AbstractController
    {
        /** @var SpotifyWebAPI */
        private $spotifyApi;
    
        /** @var SpotifyPlaylistService */
        private $spotifyPlaylistService;
    
        public function __construct(SpotifyApiService $spotifyApiService, SpotifyPlaylistService $spotifyPlaylistService)
        {
            // increase timeout limit
            set_time_limit(60);
    
            $this->spotifyApi = $spotifyApiService->createApi();
            $this->spotifyPlaylistService = $spotifyPlaylistService;
        }
    
        /**
         * @Route("/playlist-generator", name="playlist-generator")
         *
         * @return Response
         */
        public function playlistGeneratorIndex(): Response
        {
            $me = $this->spotifyApi->me();
    
            return $this->render('playlist-generator/index.html.twig', [
                'user' => $me,
            ]);
        }
    
        /**
         * @Route("/playlists/user", name="get-user-playlists")
         *
         * @return Response
         */
        public function getPlaylists(): Response
        {
            $me = $this->spotifyApi->me();
            $rawPlaylists = $this->spotifyApi->getUserPlaylists(
                $me->id,
                [
                    'limit' => SpotifyPlaylistService::PLAYLISTS_COUNT,
                ]
            )->items;
    
            $playlists = [];
            foreach ($rawPlaylists as $playlist) {
                $playlists[] = [
                    'id' => $playlist->id,
                    'name' => $playlist->name,
                    'imageUrl' => $playlist->images[\count($playlist->images) - 1]->url,
                ];
            }
    
            return new JsonResponse($playlists);
        }
    
        /**
         * @Route("/show-playlist-content/{playlistId}", name="show-playlist-content")
         *e
         * @return Response
         */
        public function showPlaylistContent(string $playlistId): Response
        {
            $this->spotifyPlaylistService->printLog('Get content of playlist');
            $playlist = $this->spotifyApi->getPlaylist($playlistId);
    
            return $this->render('playlist-generator/view.html.twig', [
                'user' => $this->spotifyApi->me(),
                'infos' => $this->spotifyPlaylistService->getPlaylistInformationMessage($playlist),
                'playlist' => $this->spotifyPlaylistService->createDisplayablePlaylist($playlist),
            ]);
        }
    
        /**
         * @Route("/generate-playlist-from-playlists", name="generate-playlist-from-playlists")
         *
         * @return Response
         */
        public function generatePlaylistFromPlaylists(Request $request): Response
        {
            /** @var array */
            $selectedPlaylists = $request->query->get('selected-playlist');
    
            $this->spotifyPlaylistService->printLog('Will create new playlist with recommendations from playlists: ' . join(', ', $selectedPlaylists) . '".');
            $recommendedTrackIds = [];
    
            $shouldFilterByArtists = (null !== $request->query->get('check-playlist-filter-artists'));
            $this->spotifyPlaylistService->printLog('Filter by artists in source playlists: ' . ($shouldFilterByArtists ? 'yes' : 'no'));
    
            $generateLongPlaylist = (null !== $request->query->get('check-playlist-long-playlist'));
            $this->spotifyPlaylistService->printLog('Generate long playlist: ' . ($generateLongPlaylist ? 'yes' : 'no'));
    
            $artistsInSourcePlaylists = [];
    
            foreach ($selectedPlaylists as $selectedPlaylistId) {
                $playlist = $this->spotifyApi->getPlaylist($selectedPlaylistId);
                $this->spotifyPlaylistService->printLog('Will get recommendations from tracks in playlist "' . $playlist->name . '".');
                $playlistTracks = $playlist->tracks->items;
                $this->spotifyPlaylistService->printLog('Found ' . count($playlistTracks) . ' tracks.');
                foreach ($playlistTracks as $track) {
                    $artists = [];
                    foreach ($track->track->artists as $artist) {
                        $artists[] = $artist->name;
                        $artistsInSourcePlaylists[$artist->id] = 1;
                    }
                    $this->spotifyPlaylistService->printLog('Track "' . $track->track->name . '" (' . join(', ', $artists) . ')');
    
                    $recommendations = $this->spotifyApi->getRecommendations([
                        'seed_tracks' => [$track->track->id],
                        'limit' => ($generateLongPlaylist ? 50 : 30)
                    ]);
                    $this->spotifyPlaylistService->printLog(' -> Got ' . count($recommendations->tracks) . ' recommendatations.');
                    foreach ($recommendations->tracks as $recommendedTrack) {
                        $recommendedTrackIds[$recommendedTrack->id] = $recommendedTrack;
                    }
                }
            }
    
            if ($shouldFilterByArtists) {
                $artistsInSourcePlaylists = array_keys($artistsInSourcePlaylists);
                $this->spotifyPlaylistService->printLog('Filter by artists found in source playlists (' . count($artistsInSourcePlaylists) . ')');
    
                $filteredTrackIds = [];
                foreach ($recommendedTrackIds as $track) {
                    foreach ($track->artists as $trackArtist) {
                        if (\in_array($trackArtist->id, $artistsInSourcePlaylists)) {
                            $filteredTrackIds[$track->id] = 1;
                        }
                    }
                }
                $recommendedTrackIds = $filteredTrackIds;
            }
    
            $newPlaylist = $this->spotifyPlaylistService->createPlaylistWithRandomTracks(
                $this->spotifyApi,
                $recommendedTrackIds,
                $generateLongPlaylist ? SpotifyPlaylistService::TRACKS_COUNT_IN_LONG_PLAYLIST : SpotifyPlaylistService::TRACKS_COUNT_IN_SHORT_PLAYLIST
            );
    
            $this->addFlash('infos', $this->spotifyPlaylistService->getCreatedPlaylistInformationMessage($newPlaylist));
    
            return new RedirectResponse($this->generateUrl('show-playlist-content', ['playlistId' => $newPlaylist->id]));
        }
    
        /**
         * @Route("/generate-playlist-from-top-artists", name="generate-playlist-from-top-artists")
         *
         * @return Response
         */
        public function generatePlaylistFromTopArtists(Request $request): Response
        {
            // Swith "random" or "selected"
            if (null !== $request->query->get('generate-playlist-random-top-artists')) {
                return $this->generatePlaylistFromRandomTopArtists($request);
            } elseif (null !== $request->query->get('generate-playlist-top-artists')) {
                return $this->generatePlaylistFromSelectedTopArtists($request);
            }
    
            return new RedirectResponse($this->generateUrl('playlist-generator'));
        }
    
        /**
         *
         * @return Response
         */
        private function generatePlaylistFromSelectedTopArtists(Request $request): Response
        {
            /** @var array */
            $selectedArtists = $request->query->get('selected-artist');
    
            $this->spotifyPlaylistService->printLog('Will create new playlist with filterted recommendations from artists: ' . join(', ', $selectedArtists) . '".');
            $recommendedTrackIds = [];
    
            $shouldFilterByArtists = (null !== $request->query->get('check-top-artist-filter-artists'));
            $this->spotifyPlaylistService->printLog('Filter by artists in selection: ' . ($shouldFilterByArtists ? 'yes' : 'no'));
    
            $generateLongPlaylist = (null !== $request->query->get('check-top-artist-long-playlist'));
            $this->spotifyPlaylistService->printLog('Generate long playlist: ' . ($generateLongPlaylist ? 'yes' : 'no'));
    
            foreach ($selectedArtists as $selectedArtist) {
                $this->spotifyPlaylistService->printLog('Get recommendations for artist ' . $selectedArtist . '');
                $recommendations = $this->spotifyApi->getRecommendations([
                    'seed_artists' => $selectedArtist,
                    'limit' => 100
                ]);
                $this->spotifyPlaylistService->printLog(' -> Got ' . count($recommendations->tracks) . ' recommendatations.');
    
                // Filter by artist if requested, remove duplicates
                foreach ($recommendations->tracks as $recommendedTrack) {
                    if ($shouldFilterByArtists) {
                        foreach ($recommendedTrack->artists as $trackArtist) {
                            if (\in_array($trackArtist->id, $selectedArtists)) {
                                $recommendedTrackIds[$recommendedTrack->id] = 1;
                            }
                        }
                    } else {
                        $recommendedTrackIds[$recommendedTrack->id] = 1;
                    }
                }
            }
    
            $newPlaylist = $this->spotifyPlaylistService->createPlaylistWithRandomTracks(
                $this->spotifyApi,
                $recommendedTrackIds,
                $generateLongPlaylist ? SpotifyPlaylistService::TRACKS_COUNT_IN_LONG_PLAYLIST : SpotifyPlaylistService::TRACKS_COUNT_IN_SHORT_PLAYLIST
            );
    
            $this->addFlash('infos', $this->spotifyPlaylistService->getCreatedPlaylistInformationMessage($newPlaylist));
    
            return new RedirectResponse($this->generateUrl('show-playlist-content', ['playlistId' => $newPlaylist->id]));
        }
    
        /**
         *
         * @return Response
         */
        private function generatePlaylistFromRandomTopArtists(Request $request): Response
        {
            $countInTopArtists = random_int(4, 6);
            $countInLessTopArtists = random_int(4, 6);
            $limitBetweenTopAndLessTop = SpotifyPlaylistService::TOP_ARTISTS_COUNT;
            $selectedArtists = $this->spotifyPlaylistService->getRandomArtistsFromTopArtists(
                $this->spotifyApi,
                $countInTopArtists,
                $countInLessTopArtists,
                $limitBetweenTopAndLessTop
            );
            $this->spotifyPlaylistService->printLog('Will create new playlist with filterted recommendations from random artists: ' . join(', ', $selectedArtists) . '".');
            $recommendedTrackIds = [];
    
            $shouldFilterByArtists = (null !== $request->query->get('check-top-artist-filter-artists'));
            $this->spotifyPlaylistService->printLog('Filter by artists in selection: ' . ($shouldFilterByArtists ? 'yes' : 'no'));
    
            $generateLongPlaylist = (null !== $request->query->get('check-top-artist-long-playlist'));
            $this->spotifyPlaylistService->printLog('Generate long playlist: ' . ($generateLongPlaylist ? 'yes' : 'no'));
    
            foreach ($selectedArtists as $selectedArtist) {
                $this->spotifyPlaylistService->printLog('Get recommendations for artist ' . $selectedArtist . '');
                $recommendations = $this->spotifyApi->getRecommendations([
                    'seed_artists' => $selectedArtist,
                    'limit' => 100
                ]);
                $this->spotifyPlaylistService->printLog(' -> Got ' . count($recommendations->tracks) . ' recommendations.');
    
                // Filter by artist if requested, remove duplicates
                foreach ($recommendations->tracks as $recommendedTrack) {
                    if ($shouldFilterByArtists) {
                        foreach ($recommendedTrack->artists as $trackArtist) {
                            if (\in_array($trackArtist->id, $selectedArtists)) {
                                $recommendedTrackIds[$recommendedTrack->id] = 1;
                            }
                        }
                    } else {
                        $recommendedTrackIds[$recommendedTrack->id] = 1;
                    }
                }
            }
    
            $newPlaylist = $this->spotifyPlaylistService->createPlaylistWithRandomTracks(
                $this->spotifyApi,
                $recommendedTrackIds,
                $generateLongPlaylist ? SpotifyPlaylistService::TRACKS_COUNT_IN_LONG_PLAYLIST : SpotifyPlaylistService::TRACKS_COUNT_IN_SHORT_PLAYLIST
            );
    
            $this->addFlash('infos', $this->spotifyPlaylistService->getCreatedPlaylistInformationMessage($newPlaylist));
    
            return new RedirectResponse($this->generateUrl('show-playlist-content', ['playlistId' => $newPlaylist->id]));
        }
    
        /**
         * @Route("/generate-quick-playlist", name="generate-quick-playlist")
         *
         * @return Response
         */
        public function generateQuickPlaylist(Request $request): Response
        {
            // Swith between "daily mixes" or "tambouille"
            if (null !== $request->query->get('generate-quick-playlist-from-daily-mixes')) {
                return $this->generatePlaylistFromDailyMixes($request);
            } elseif (null !== $request->query->get('generate-quick-playlist-tambouille-mix')) {
                return $this->generateplaylistTambouilleMix($request);
            }
    
            return new RedirectResponse($this->generateUrl('playlist-generator'));
        }
    
        /**
         *
         * @return Response
         */
        private function generatePlaylistFromDailyMixes(Request $request): Response
        {
            $generateLongPlaylist = (null !== $request->query->get('check-quick-create-long-playlist'));
    
            $this->spotifyPlaylistService->printLog('Generate playlist from Daily Mixes (long playlist :' . ($generateLongPlaylist ? 'yes' : 'no') . ')');
    
            $newPlaylist = $this->spotifyPlaylistService->createPlaylistFromDailyMixesTracks(
                $this->spotifyApi,
                $generateLongPlaylist ? SpotifyPlaylistService::TRACKS_COUNT_IN_LONG_PLAYLIST : SpotifyPlaylistService::TRACKS_COUNT_IN_SHORT_PLAYLIST
            );
    
            $this->addFlash('infos', $this->spotifyPlaylistService->getCreatedPlaylistInformationMessage($newPlaylist));
    
            return new RedirectResponse($this->generateUrl('show-playlist-content', ['playlistId' => $newPlaylist->id]));
        }
    
        /**
         *
         * @return Response
         */
        private function generateplaylistTambouilleMix(Request $request): Response
        {
            $generateLongPlaylist = (null !== $request->query->get('check-quick-create-long-playlist'));
    
            $this->spotifyPlaylistService->printLog('Generate tambouille mix playlist (long playlist :' . ($generateLongPlaylist ? 'yes' : 'no') . ')');
    
            $newPlaylist = $this->spotifyPlaylistService->createPlaylistTambouilleMix(
                $this->spotifyApi,
                $generateLongPlaylist ? SpotifyPlaylistService::TRACKS_COUNT_IN_LONG_PLAYLIST : SpotifyPlaylistService::TRACKS_COUNT_IN_SHORT_PLAYLIST
            );
    
            $this->addFlash('infos', $this->spotifyPlaylistService->getCreatedPlaylistInformationMessage($newPlaylist));
    
            return new RedirectResponse($this->generateUrl('show-playlist-content', ['playlistId' => $newPlaylist->id]));
        }
    }