Skip to content
Snippets Groups Projects
Select Git revision
  • f8f332e3e895e3f478eb687570ac8ec27ed209c0
  • master default protected
  • 70-improve-app-metadata
  • Release_0.9.1_78 protected
  • Release_0.9.0_77 protected
  • Release_0.8.2_76 protected
  • Release_0.8.1_75 protected
  • Release_0.8.0_74 protected
  • Release_0.7.0_73 protected
  • Release_0.6.0_72 protected
  • Release_0.5.0_71 protected
  • Release_0.4.2_70 protected
  • Release_0.4.1_69 protected
  • Release_0.4.0_68 protected
  • Release_0.3.1_67 protected
  • Release_0.3.0_66 protected
  • Release_0.2.1_65 protected
  • Release_0.2.0_64 protected
  • Release_0.1.1_63 protected
  • Release_0.1.0_62 protected
  • Release_0.0.61_61 protected
  • Release_0.0.60_60 protected
  • Release_0.0.59_59 protected
23 results

gradle.properties

Blame
  • lib.php 7.39 KiB
    <?php
    
    function printLog($message = '')
    {
        if (false) {
            error_log($message);
        }
    }
    
    function generateShowPlaylistUrl($playlistId) {
        return '/view-playlist-'.$playlistId;
    }
    
    function generatePlaylistName($prefix)
    {
        $now = new DateTime();
        $name = $prefix.' ['.$now->format('Y-m-d H:i:s').']';
    
        return $name;
    }
    
    function createEmptyPlaylist($api, $playlistName = 'Auto playlist')
    {
        $name = generatePlaylistName($playlistName);
        printLog('Create new playlist "'.$name.'".');
        $playlist = $api->createPlaylist([
            'name' => $name,
        ]);
    
        return $playlist;
    }
    
    function pickRandomTracksFromArray($trackIds, $count = 0)
    {
        $trackIds = \array_keys($trackIds);
        printLog('=> Got '.\count($trackIds).' unique tracks.');
        \shuffle($trackIds);
    
        if (!$count) {
            return $trackIds;
        }
    
        $pickedTrackIds = \array_slice($trackIds, 0, $count);
        printLog('Keep '.\count($pickedTrackIds).' random tracks.');
    
        return $pickedTrackIds;
    }
    
    function getRandomArtistsFromTopArtists($api, $countInTopArtists, $countInLessTopArtists, $limitBetweenTopAndLessTop)
    {
        $top = $api->getMyTop(
            'artists',
            [
              'limit' => $limitBetweenTopAndLessTop,
              'time_range' => 'short_term'
            ]
            )->items;
        shuffle($top);
        $pickedTop = array_slice($top, 0, $countInTopArtists);
    
        $lessTop = $api->getMyTop(
            'artists',
            [
              'limit' => $limitBetweenTopAndLessTop,
              'offset' => $limitBetweenTopAndLessTop,
              'time_range' => 'short_term'
            ]
            )->items;
        shuffle($lessTop);
        $pickedLessTop = array_slice($lessTop, 0, $countInLessTopArtists);
    
        $randomlySelected = [];
        foreach ($pickedTop as $artist) {
            $randomlySelected[] = $artist->id;
        }
        foreach ($pickedLessTop as $artist) {
            $randomlySelected[] = $artist->id;
        }
    
        return $randomlySelected;
    }
    
    function createPlaylistWithRandomTracks($api, $trackIds, $count = 50)
    {
        $playlist = createEmptyPlaylist($api, 'Fresh playlist');
        $pickedTrackIds = pickRandomTracksFromArray($trackIds, $count);
        $api->replacePlaylistTracks($playlist->id, $pickedTrackIds);
    
        return $api->getPlaylist($playlist->id);
    }
    
    function createPlaylistFromDailyMixesTracks($api, $count = 50)
    {
        // Get daily mix playlists from user library
        $userPlaylists = getAllPlaylistsFromUserId($api, $api->me()->id);
        $dailyMixPlaylistIds = [];
        foreach ($userPlaylists as $userPlaylist) {
          $regex = '/^Daily Mix [1-6]$/';
            if (\preg_match($regex, $userPlaylist->name)) {
                $dailyMixPlaylistIds[] = $userPlaylist->id;
            }
        }
    
        // Get all tracks in daily mix playlists
        $trackIds = [];
        foreach ($dailyMixPlaylistIds as $dailyMixPlaylistId) {
            $dailyMixPlaylist = $api->getPlaylist($dailyMixPlaylistId);
            $tracks = $dailyMixPlaylist->tracks->items;
            foreach ($tracks as $track) {
                $trackId = $track->track->id;
                $trackIds[$trackId] = $trackId;
            }
        }
    
        $pickedTrackIds = pickRandomTracksFromArray($trackIds, $count);
    
        $playlist = createEmptyPlaylist($api, 'Daily Mixes');
        $api->replacePlaylistTracks($playlist->id, $pickedTrackIds);
    
        return $api->getPlaylist($playlist->id);
    }
    
    function createPlaylistTambouilleMix($api, $count = 50)
    {
        // Get specific playlists
        $wantedPlaylistsNames = [
            'Daily Mix 1',
            'Daily Mix 2',
            'Radar des sorties',
            'Discover Weekly', # "Découvertes de la semaine"
            'Your Time Capsule', # "Votre Capsule Temporelle"
            'On Repeat', # "En boucle"
            'Repeat Rewind', # "En boucle : flashback"
        ];
    
        $userPlaylists = getAllPlaylistsFromUserId($api, $api->me()->id);
        $userPlaylistsByName = [];
        foreach ($userPlaylists as $userPlaylist) {
            $userPlaylistsByName[$userPlaylist->name] = $userPlaylist->id;
        }
    
        // Get all tracks, pick some and get recommandations from playlists
        $trackIds = [];
        foreach ($wantedPlaylistsNames as $playlistName) {
            if (\array_key_exists($playlistName, $userPlaylistsByName)) {
                $playlistId = $userPlaylistsByName[$playlistName];
                $selectedPlaylist = $api->getPlaylist($playlistId);
    
                $tracks = $selectedPlaylist->tracks->items;
                foreach ($tracks as $track) {
                    $trackId = $track->track->id;
                    $selectedPlaylistTracks[$trackId] = $trackId;
                }
    
                $tracksCount = \count($selectedPlaylistTracks);
    
                // Split playlist in two tracks lists
                $tracksList1 = pickRandomTracksFromArray($selectedPlaylistTracks, max(intval($count / 5), intval($tracksCount / 5)));
                $tracksList2 = pickRandomTracksFromArray($selectedPlaylistTracks, max(intval($count / 5), intval($tracksCount / 5)));
    
                // Directly pick first part of this playlist
                foreach ($tracksList1 as $trackId) {
                    $trackIds[$trackId] = $trackId;
                }
    
                // Get recommandations for other part
                $chunks = array_chunk($tracksList2, 5);
                foreach($chunks as $chunk) {
                    $recommendations = $api->getRecommendations([
                        'seed_tracks' => $chunk,
                        'limit' => \count($chunk)
                    ]);
                    foreach ($recommendations->tracks as $recommendedTrack) {
                        $trackIds[$recommendedTrack->id] = $recommendedTrack;
                    }
                }
            }
        }
    
        $pickedTrackIds = pickRandomTracksFromArray($trackIds, $count);
    
        $playlist = createEmptyPlaylist($api, 'Tambouille Mix');
        $api->replacePlaylistTracks($playlist->id, $pickedTrackIds);
    
        return $api->getPlaylist($playlist->id);
    }
    
    function getCreatedPlaylistInformationMessage($api, $playlist)
    {
        $link = '<a href="'.generateShowPlaylistUrl($playlist->id).'">'.$playlist->name.'</a>';
        $message = 'Ok created new playlist with '.count($playlist->tracks->items).' tracks:<br/>'.$link;
    
        return $message;
    }
    
    function getPlaylistInformationMessage($api, $playlist)
    {
        $link = '<a href="'.$playlist->external_urls->spotify.'">'.$playlist->name.'</a>';
        $message = 'Playlist with '.count($playlist->tracks->items).' tracks:<br/>'.$link;
    
        return $message;
    }
    
    function createDisplayablePlaylist($playlist)
    {
        $output = [
            'id' => $playlist->id,
            'name' => $playlist->name,
            'tracks' => [],
            'artists' => [],
        ];
    
        $artists = [];
    
        foreach ($playlist->tracks->items as $item) {
            $track = [
                'id' => $item->track->id,
                'name' => $item->track->name,
                'artists' => [],
            ];
    
            foreach ($item->track->artists as $artist) {
                $track['artists'][] = [
                    'id' => $artist->id,
                    'name' => $artist->name,
                ];
                $artists[$artist->id] = $artist->name;
            }
    
            $output['tracks'][] = $track;
        }
    
        $output['artists'] = array_values($artists);
    
        return $output;
    }
    
    function getAllPlaylistsFromUserId($api, $userId) {
        $playlists = [];
        $batchSize = 50;
        $offset = 0;
    
        while (($offset === 0) or (\count($batch->items) === $batchSize)) {
            $batch = $api->getUserPlaylists($userId, [
                'limit' => $batchSize,
                'offset' => $offset,
            ]);
    
            foreach ($batch->items as $playlist) {
                $playlists[] = $playlist;
            }
    
            $offset += $batchSize;
        }
    
        return $playlists;
    }