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 = [
];
$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) {
$selectedPlaylists = $_GET['selected-playlist'];
......@@ -109,7 +110,9 @@ if ($generatePlaylistFromPlaylist) {
$newPlaylist = createPlaylistWithRandomTracks($api, $recommendedTrackIds);
$templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist);
$templateData['playlist'] = createDisplayablePlaylist($newPlaylist);
} elseif ($generatePlaylistFromArtists) {
} elseif ($generatePlaylistFromSelectedTopArtists) {
$selectedArtists = $_GET['selected-artist'];
error_log('Will create new playlist with filterted recommendations from artists: '.join(', ', $selectedArtists).'".');
$recommendedTrackIds = [];
......@@ -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);
$templateData['infos'][] = getCreatedPlaylistInformationMessage($api, $newPlaylist);
$templateData['playlist'] = createDisplayablePlaylist($newPlaylist);
......
......@@ -30,6 +30,40 @@ function pickRandomTrackFromArray($recommendedTrackIds, $count = 50)
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);
......
......@@ -53,8 +53,17 @@
<?php } ?>
<?php if (count($templateData['topArtists'])) { ?>
<form class="clearfix">
<legend>Generate playlist from artists:</legend>
<form class="clearfix mt-2">
<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">
<?php foreach ($templateData['topArtists'] as $artist) { ?>
<li class="col">
......@@ -92,8 +101,8 @@
</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-secondary" onclick="pickRandomArtists()">🎲 Pick random artists</button>
<button name="generate-playlist-top-artists" type="submit" class="btn btn-primary float-end">🎶 Generate!</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">🎶 Generate!</button>
</div>
</div>
</div>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment