added album blacklist, support for PNG covers
This commit is contained in:
parent
23560bb1fc
commit
ed1b9fdb17
@ -24,7 +24,8 @@ class AlbumCollageGenerator {
|
|||||||
$this->text_color = $this->hex_to_rgb('#ececec');
|
$this->text_color = $this->hex_to_rgb('#ececec');
|
||||||
$this->western_font = plugin_dir_path(__FILE__) . 'assets/co1251n.ttf';
|
$this->western_font = plugin_dir_path(__FILE__) . 'assets/co1251n.ttf';
|
||||||
$this->japanese_font = plugin_dir_path(__FILE__) . 'assets/BIZUDPMincho-Regular.ttf';
|
$this->japanese_font = plugin_dir_path(__FILE__) . 'assets/BIZUDPMincho-Regular.ttf';
|
||||||
$this->blacklisted_artists = array('Drake', 'Mac Miller'); // placeholder values
|
$this->blacklisted_artists = array('Drake', 'Mac Miller', 'Kendrick Lamar');
|
||||||
|
$this->blacklisted_albums = array('OK Computer OKNOTOK 1997 2017');
|
||||||
}
|
}
|
||||||
|
|
||||||
public function register_endpoint() {
|
public function register_endpoint() {
|
||||||
@ -111,20 +112,39 @@ class AlbumCollageGenerator {
|
|||||||
|
|
||||||
private function get_top_albums($year, $month) {
|
private function get_top_albums($year, $month) {
|
||||||
// Prepare placeholders for blacklisted artists
|
// Prepare placeholders for blacklisted artists
|
||||||
$placeholders = array_fill(0, count($this->blacklisted_artists), '%s');
|
$artist_placeholders = array_fill(0, count($this->blacklisted_artists), '%s');
|
||||||
$placeholders_str = implode(', ', $placeholders);
|
$artist_placeholders_str = implode(', ', $artist_placeholders);
|
||||||
|
|
||||||
// Merge all parameters for $wpdb->prepare
|
// Prepare placeholders for blacklisted albums
|
||||||
|
$album_placeholders = array_fill(0, count($this->blacklisted_albums), '%s');
|
||||||
|
$album_placeholders_str = implode(', ', $album_placeholders);
|
||||||
|
|
||||||
|
// Initialize query parts
|
||||||
|
$artist_condition = '';
|
||||||
|
$album_condition = '';
|
||||||
$query_params = array($year, $month);
|
$query_params = array($year, $month);
|
||||||
$query_params = array_merge($query_params, $this->blacklisted_artists);
|
|
||||||
|
// Handle blacklisted artists
|
||||||
|
if (!empty($this->blacklisted_artists)) {
|
||||||
|
$artist_condition = "AND author NOT IN ($artist_placeholders_str)";
|
||||||
|
$query_params = array_merge($query_params, $this->blacklisted_artists);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Handle blacklisted albums
|
||||||
|
if (!empty($this->blacklisted_albums)) {
|
||||||
|
$album_condition = "AND album_name NOT IN ($album_placeholders_str)";
|
||||||
|
$query_params = array_merge($query_params, $this->blacklisted_albums);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prepare the SQL query with updated ORDER BY in ranked_covers
|
||||||
$query = $this->db->prepare(
|
$query = $this->db->prepare(
|
||||||
"WITH ranked_covers AS (
|
"WITH ranked_covers AS (
|
||||||
SELECT
|
SELECT
|
||||||
album_name,
|
album_name,
|
||||||
author,
|
author,
|
||||||
cover_url,
|
cover_url,
|
||||||
ROW_NUMBER() OVER (PARTITION BY album_name, author ORDER BY time DESC) as rn
|
id, -- Ensure id is selected for ordering
|
||||||
|
ROW_NUMBER() OVER (PARTITION BY album_name, author ORDER BY id DESC) as rn
|
||||||
FROM song_scrobbles
|
FROM song_scrobbles
|
||||||
WHERE cover_url != '' AND cover_url IS NOT NULL
|
WHERE cover_url != '' AND cover_url IS NOT NULL
|
||||||
),
|
),
|
||||||
@ -137,8 +157,8 @@ class AlbumCollageGenerator {
|
|||||||
FROM song_scrobbles
|
FROM song_scrobbles
|
||||||
WHERE YEAR(time) = %d AND MONTH(time) = %d
|
WHERE YEAR(time) = %d AND MONTH(time) = %d
|
||||||
AND album_name != '' AND album_name IS NOT NULL
|
AND album_name != '' AND album_name IS NOT NULL
|
||||||
-- Exclude blacklisted artists
|
$artist_condition
|
||||||
AND author NOT IN ($placeholders_str)
|
$album_condition
|
||||||
-- Exclude albums with '¥' symbol in album_name or author
|
-- Exclude albums with '¥' symbol in album_name or author
|
||||||
AND album_name NOT LIKE '%%¥%%'
|
AND album_name NOT LIKE '%%¥%%'
|
||||||
AND author NOT LIKE '%%¥%%'
|
AND author NOT LIKE '%%¥%%'
|
||||||
@ -179,7 +199,7 @@ class AlbumCollageGenerator {
|
|||||||
);
|
);
|
||||||
|
|
||||||
return $this->db->get_results($query);
|
return $this->db->get_results($query);
|
||||||
}
|
}
|
||||||
|
|
||||||
public function get_or_generate_image($request) {
|
public function get_or_generate_image($request) {
|
||||||
$month = $request->get_param('month');
|
$month = $request->get_param('month');
|
||||||
@ -306,16 +326,68 @@ class AlbumCollageGenerator {
|
|||||||
for ($i = 0; $i < min(count($albums), 25); $i++) {
|
for ($i = 0; $i < min(count($albums), 25); $i++) {
|
||||||
$row = floor($i / 5);
|
$row = floor($i / 5);
|
||||||
$col = $i % 5;
|
$col = $i % 5;
|
||||||
|
|
||||||
$x = $left_margin + $col * ($album_size + $gap);
|
$x = $left_margin + $col * ($album_size + $gap);
|
||||||
$y = $top_margin + $row * ($album_size + $gap);
|
$y = $top_margin + $row * ($album_size + $gap);
|
||||||
|
|
||||||
$album_cover = @imagecreatefromjpeg($albums[$i]->cover_url);
|
// Detect the image type
|
||||||
|
$image_type = @exif_imagetype($albums[$i]->cover_url);
|
||||||
|
$album_cover = false;
|
||||||
|
|
||||||
|
switch ($image_type) {
|
||||||
|
case IMAGETYPE_JPEG:
|
||||||
|
$album_cover = @imagecreatefromjpeg($albums[$i]->cover_url);
|
||||||
|
break;
|
||||||
|
case IMAGETYPE_PNG:
|
||||||
|
$album_cover = @imagecreatefrompng($albums[$i]->cover_url);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// Unsupported image type
|
||||||
|
$album_cover = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if ($album_cover !== false) {
|
if ($album_cover !== false) {
|
||||||
|
// If the image is PNG, preserve transparency
|
||||||
|
if ($image_type === IMAGETYPE_PNG) {
|
||||||
|
imagealphablending($album_cover, true);
|
||||||
|
imagesavealpha($album_cover, true);
|
||||||
|
}
|
||||||
|
|
||||||
$this->apply_retro_effects($album_cover);
|
$this->apply_retro_effects($album_cover);
|
||||||
imagecopyresampled($image, $album_cover, $x, $y, 0, 0, $album_size, $album_size, imagesx($album_cover), imagesy($album_cover));
|
|
||||||
|
// If the main image has transparency and the album cover is PNG, preserve it
|
||||||
|
if ($image_type === IMAGETYPE_PNG) {
|
||||||
|
imagecopyresampled(
|
||||||
|
$image,
|
||||||
|
$album_cover,
|
||||||
|
$x,
|
||||||
|
$y,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
$album_size,
|
||||||
|
$album_size,
|
||||||
|
imagesx($album_cover),
|
||||||
|
imagesy($album_cover)
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
imagecopyresampled(
|
||||||
|
$image,
|
||||||
|
$album_cover,
|
||||||
|
$x,
|
||||||
|
$y,
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
$album_size,
|
||||||
|
$album_size,
|
||||||
|
imagesx($album_cover),
|
||||||
|
imagesy($album_cover)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
imagedestroy($album_cover);
|
imagedestroy($album_cover);
|
||||||
} else {
|
} else {
|
||||||
|
// Draw placeholder rectangle
|
||||||
$placeholder_color = imagecolorallocate($image, 100, 100, 100);
|
$placeholder_color = imagecolorallocate($image, 100, 100, 100);
|
||||||
imagefilledrectangle($image, $x, $y, $x + $album_size, $y + $album_size, $placeholder_color);
|
imagefilledrectangle($image, $x, $y, $x + $album_size, $y + $album_size, $placeholder_color);
|
||||||
}
|
}
|
||||||
@ -552,6 +624,4 @@ class AlbumCollageGenerator {
|
|||||||
return preg_match('/[\x{4E00}-\x{9FBF}\x{3040}-\x{309F}\x{30A0}-\x{30FF}]/u', $text);
|
return preg_match('/[\x{4E00}-\x{9FBF}\x{3040}-\x{309F}\x{30A0}-\x{30FF}]/u', $text);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
new AlbumCollageGenerator();
|
|
Loading…
Reference in New Issue
Block a user