Skip to content
Snippets Groups Projects
Commit a7a77bb1 authored by Benoît Harrault's avatar Benoît Harrault
Browse files

Merge branch '26-add-a-generate-playlist-from-almost-top-played-artists' into 'master'

Resolve "Add a generate playlist from "almost top played artists""

Closes #26

See merge request !20
parents ccfc50e7 5bdfc3ef
No related branches found
No related tags found
1 merge request!20Resolve "Add a generate playlist from "almost top played artists""
...@@ -55,7 +55,8 @@ $templateData = [ ...@@ -55,7 +55,8 @@ $templateData = [
]; ];
$generatePlaylistFromPlaylist = isset($_GET['generate-playlist-from-playlist']); $generatePlaylistFromPlaylist = isset($_GET['generate-playlist-from-playlist']);
$generatePlaylistFromArtists = isset($_GET['generate-playlist-top-artists']); $generatePlaylistFromSelectedTopArtists = isset($_GET['generate-playlist-top-artists']);
$generatePlaylistFromRandomTopArtists = isset($_GET['generate-playlist-random-top-artists']);
if ($generatePlaylistFromPlaylist) { if ($generatePlaylistFromPlaylist) {
$selectedPlaylists = $_GET['selected-playlist']; $selectedPlaylists = $_GET['selected-playlist'];
...@@ -109,7 +110,9 @@ if ($generatePlaylistFromPlaylist) { ...@@ -109,7 +110,9 @@ if ($generatePlaylistFromPlaylist) {
$newPlaylist = createPlaylistWithRandomTracks($api, $recommendedTrackIds); $newPlaylist = createPlaylistWithRandomTracks($api, $recommendedTrackIds);
$templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist); $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist);
$templateData['playlist'] = createDisplayablePlaylist($newPlaylist); $templateData['playlist'] = createDisplayablePlaylist($newPlaylist);
} elseif ($generatePlaylistFromArtists) {
} elseif ($generatePlaylistFromSelectedTopArtists) {
$selectedArtists = $_GET['selected-artist']; $selectedArtists = $_GET['selected-artist'];
error_log('Will create new playlist with filterted recommendations from artists: '.join(', ', $selectedArtists).'".'); error_log('Will create new playlist with filterted recommendations from artists: '.join(', ', $selectedArtists).'".');
$recommendedTrackIds = []; $recommendedTrackIds = [];
...@@ -140,6 +143,45 @@ if ($generatePlaylistFromPlaylist) { ...@@ -140,6 +143,45 @@ if ($generatePlaylistFromPlaylist) {
} }
} }
$newPlaylist = createPlaylistWithRandomTracks($api, $recommendedTrackIds);
$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'));
foreach ($selectedArtists as $selectedArtist) {
error_log('Get recommendations for artist '.$selectedArtist.'');
$recommendations = $api->getRecommendations([
'seed_artists' => $selectedArtist,
'limit' => 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); $newPlaylist = createPlaylistWithRandomTracks($api, $recommendedTrackIds);
$templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist); $templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist);
$templateData['playlist'] = createDisplayablePlaylist($newPlaylist); $templateData['playlist'] = createDisplayablePlaylist($newPlaylist);
......
...@@ -30,6 +30,40 @@ function pickRandomTrackFromArray($recommendedTrackIds, $count = 50) ...@@ -30,6 +30,40 @@ function pickRandomTrackFromArray($recommendedTrackIds, $count = 50)
return $pickedTrackIds; 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) function createPlaylistWithRandomTracks($api, $trackIds, $count = 50)
{ {
$playlist = createEmptyPlaylist($api); $playlist = createEmptyPlaylist($api);
......
...@@ -53,8 +53,17 @@ ...@@ -53,8 +53,17 @@
<?php } ?> <?php } ?>
<?php if (count($templateData['topArtists'])) { ?> <?php if (count($templateData['topArtists'])) { ?>
<form class="clearfix"> <form class="clearfix mt-2">
<legend>Generate playlist from artists:</legend> <div class="row">
<div class="col-md-8 col-sm-12">
<legend>Generate playlist from artists:</legend>
</div>
<div class="col-md-4 col-sm-12">
<div class="btn-group float-end" role="group" aria-label="Action buttons">
<button name="pick-random-artist" type="button" class="btn btn-link" onclick="pickRandomArtists()">🎲 Pick random artists</button>
</div>
</div>
</div>
<ul class="list-unstyled row row-cols-md-4 row-cols-2"> <ul class="list-unstyled row row-cols-md-4 row-cols-2">
<?php foreach ($templateData['topArtists'] as $artist) { ?> <?php foreach ($templateData['topArtists'] as $artist) { ?>
<li class="col"> <li class="col">
...@@ -92,8 +101,8 @@ ...@@ -92,8 +101,8 @@
</div> </div>
<div class="col-md-4 col-sm-12"> <div class="col-md-4 col-sm-12">
<div class="btn-group float-end" role="group" aria-label="Action buttons"> <div class="btn-group float-end" role="group" aria-label="Action buttons">
<button name="pick-random-artist" type="button" class="btn btn-secondary" onclick="pickRandomArtists()">🎲 Pick random artists</button> <button name="generate-playlist-random-top-artists" type="submit" class="btn btn-secondary">🎲 Random!</button>
<button name="generate-playlist-top-artists" type="submit" class="btn btn-primary float-end">🎶 Generate!</button> <button name="generate-playlist-top-artists" type="submit" class="btn btn-primary">🎶 Generate!</button>
</div> </div>
</div> </div>
</div> </div>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment