aboutsummaryrefslogtreecommitdiffstats
path: root/playlist_generator
diff options
context:
space:
mode:
authorPinapelz <yukais@pinapelz.com>2026-06-23 13:46:01 -0700
committerPinapelz <yukais@pinapelz.com>2026-06-23 13:46:01 -0700
commitd5e5de44acdad962d0943dbb42e060a4600f9362 (patch)
treedd2dba62b057a1ed2896ca7865e591a1e881286b /playlist_generator
parent51b7fca52585944a12ca74a2281f3f47068870c9 (diff)
change playlist_generator to merge with existing songs.ts by default
Diffstat (limited to 'playlist_generator')
-rw-r--r--playlist_generator/generate_daily.py2
-rw-r--r--playlist_generator/playlist_generator.py31
-rw-r--r--playlist_generator/pyproject.toml1
-rw-r--r--playlist_generator/uv.lock11
4 files changed, 37 insertions, 8 deletions
diff --git a/playlist_generator/generate_daily.py b/playlist_generator/generate_daily.py
index 56e9103..508871c 100644
--- a/playlist_generator/generate_daily.py
+++ b/playlist_generator/generate_daily.py
@@ -166,7 +166,7 @@ def main():
send_notification(f"K-HEARDLE: Failed to upload clip for {date}")
return
write_json("save.json", daily_data)
- send_notification(f"K-HEARDLE: Successfully generated daily playlist for {date}")
+ send_notification(f"K-HEARDLE: Successfully generated daily track for {date} UTC")
three_days_ago = (datetime.now() - timedelta(days=3)).strftime("%Y-%m-%d")
delete_from_r2(f"kheardle/{three_days_ago}.mp3")
send_notification(f"K-HEARDLE: Deleted old clip for {three_days_ago}")
diff --git a/playlist_generator/playlist_generator.py b/playlist_generator/playlist_generator.py
index 1bcc0b7..a02881a 100644
--- a/playlist_generator/playlist_generator.py
+++ b/playlist_generator/playlist_generator.py
@@ -1,10 +1,15 @@
#!/usr/bin/python3
import argparse
-from random import shuffle
import yt_dlp
-
+import json5
+import re
class PlaylistGenerator:
+
+ def __init__(self, song_db: list[dict]):
+ self.song_db = song_db
+ self.known_ids = set()
+
def get_urls_from_file(self, path: str) -> list[str]:
with open(path) as f:
lines = f.readlines()
@@ -30,11 +35,21 @@ class PlaylistGenerator:
return list(info.values())
def build_playlist_string(self, video_info: list[dict[str]]) -> str:
- output = ""
+ output = "export const songs = [\n"
for info in video_info:
+ video_id = info["id"]
+ if video_id in self.known_ids:
+ continue
+ self.known_ids.add(video_id)
artist = self.escape_quotes(self.get_artist(info))
title = self.escape_quotes(self.get_title(info))
output += f'{{ artist: "{artist}", name: "{title}", youtubeId: "{info["id"]}" }},\n'
+ for song in self.song_db:
+ if song["youtubeId"] in self.known_ids:
+ continue
+ output += f'{{ artist: "{song["artist"]}", name: "{song["name"]}", youtubeId: "{song["youtubeId"]}" }},\n'
+ self.known_ids.add(song["youtubeId"])
+ output += "]"
return output
def get_artist(self, info):
@@ -64,13 +79,15 @@ class PlaylistGenerator:
def main():
parser = argparse.ArgumentParser()
parser.add_argument("urls_file")
- parser.add_argument("output_file")
+ parser.add_argument("output_file", default="../server/data/songs.ts")
args = parser.parse_args()
-
- generator = PlaylistGenerator()
+ with open(args.output_file, "r", encoding="utf-8") as f:
+ text = f.read()
+ array_text = re.search(r"\[.*\]", text, re.S).group(0)
+ songs = json5.loads(array_text)
+ generator = PlaylistGenerator(songs)
urls = generator.get_urls_from_file(args.urls_file)
video_info = generator.extract(urls)
- shuffle(video_info)
js_playlist = generator.build_playlist_string(video_info)
with open(args.output_file, 'w') as f:
f.write(js_playlist)
diff --git a/playlist_generator/pyproject.toml b/playlist_generator/pyproject.toml
index 5ac1b1f..5151a26 100644
--- a/playlist_generator/pyproject.toml
+++ b/playlist_generator/pyproject.toml
@@ -6,6 +6,7 @@ readme = "README.md"
requires-python = ">=3.13"
dependencies = [
"boto3>=1.43.22",
+ "json5>=0.15.0",
"python-dotenv>=1.2.2",
"requests>=2.34.2",
"yt-dlp>=2026.3.17",
diff --git a/playlist_generator/uv.lock b/playlist_generator/uv.lock
index 4583031..aa4805e 100644
--- a/playlist_generator/uv.lock
+++ b/playlist_generator/uv.lock
@@ -115,11 +115,21 @@ wheels = [
]
[[package]]
+name = "json5"
+version = "0.15.0"
+source = { registry = "https://pypi.org/simple" }
+sdist = { url = "https://files.pythonhosted.org/packages/e4/7d/05c46a96a78147ae3bf99c2f4169ce144a70220b8d6fcd56f6ec368b8ce9/json5-0.15.0.tar.gz", hash = "sha256:7424d1f1eb1d56da6e3d70643f53619862b4ce81440bdb8ecfd6f875e5ba4a71", size = 53278, upload-time = "2026-06-19T20:08:27.716Z" }
+wheels = [
+ { url = "https://files.pythonhosted.org/packages/eb/be/59527c99478aade6bb33a68d72e6e18dd4e6ff6eacfc7d01bdb15bc76912/json5-0.15.0-py3-none-any.whl", hash = "sha256:56636a30c0e8a4665fe2179c0212f32eae3796dea89ea6f649b9436ecdb39618", size = 36570, upload-time = "2026-06-19T20:08:26.748Z" },
+]
+
+[[package]]
name = "playlist-generator"
version = "0.1.0"
source = { virtual = "." }
dependencies = [
{ name = "boto3" },
+ { name = "json5" },
{ name = "python-dotenv" },
{ name = "requests" },
{ name = "yt-dlp" },
@@ -128,6 +138,7 @@ dependencies = [
[package.metadata]
requires-dist = [
{ name = "boto3", specifier = ">=1.43.22" },
+ { name = "json5", specifier = ">=0.15.0" },
{ name = "python-dotenv", specifier = ">=1.2.2" },
{ name = "requests", specifier = ">=2.34.2" },
{ name = "yt-dlp", specifier = ">=2026.3.17" },
send patches to the email below
yukais@pinapelz.com
include the subject [PATCH repo_name]
pinapelz.com
homepage