From 1f7eeb53a754907abdd29a571adbe5c06e0110e6 Mon Sep 17 00:00:00 2001 From: Halhadus <eneshakans45@proton.me> Date: Sat, 8 Feb 2025 21:20:48 +0300 Subject: [PATCH] Updated website module --- websitemodule.py | 256 ++++++++++++++++++++++++++++++++++--------- websitemodule.py.old | 68 ++++++++++++ 2 files changed, 275 insertions(+), 49 deletions(-) create mode 100644 websitemodule.py.old diff --git a/websitemodule.py b/websitemodule.py index a4bdc4a..2ed9448 100644 --- a/websitemodule.py +++ b/websitemodule.py @@ -1,7 +1,8 @@ import os import sqlite3 -import requests import datetime +# For now +import flask def read_music_database(): conn = sqlite3.connect("assets/localwrapped/music.db") @@ -12,57 +13,214 @@ def read_music_database(): return music_list def read_count_database(year: int): - if year == datetime.datetime.now().year: - conn = sqlite3.connect(f'assets/localwrapped/count.db') - c = conn.cursor() - c.execute('SELECT * FROM count') - count_list = c.fetchall() - conn.close() - return count_list - else: - conn = sqlite3.connect(f'assets/localwrapped/count-{year}.db') - c = conn.cursor() - c.execute('SELECT * FROM count') - count_list = c.fetchall() - conn.close() - return count_list + db_path = f'assets/localwrapped/count-{year}.db' if year != datetime.datetime.now().year else 'assets/localwrapped/count.db' + if not os.path.exists(db_path): + return [] + + conn = sqlite3.connect(db_path) + c = conn.cursor() + c.execute('SELECT * FROM count') + count_list = c.fetchall() + conn.close() + return count_list + +def get_available_years(): + years = [] + for file in os.listdir('assets/localwrapped'): + if file.startswith('count') and file.endswith('.db'): + year = file.split('-')[-1].split('.')[0] + if year.isdigit(): + years.append(int(year)) + return sorted(years, reverse=True) def total_play_time(year: int): total_time = 0 - for countvar in read_count_database(year): - for musicvar in read_music_database(): - if countvar[0] == musicvar[0]: - total_time += float(musicvar[-1]) * countvar[1] + music_data = {row[0]: row for row in read_music_database()} + + for count_entry in read_count_database(year): + if count_entry[0] in music_data: + total_time += float(music_data[count_entry[0]][7]) * count_entry[1] + return total_time def generatehtmlcode(year: int = datetime.datetime.now().year): - html = '<DOCTYPE html>\n<html>\n' - html += '<head>\n<meta charset="UTF-8">\n<link href="https://fonts.googleapis.com/css2?family=Jetbrains+Mono:wght@400;700&display=swap" rel="stylesheet">\n</head>\n' - html += '<body style="background-color: #1f1f1f; color: #ffffff; font-family: \'Jetbrains Mono\', monospace;">\n<meta name="viewport" content="width=device-width, initial-scale=1.0">\n' - html += '<title>Halhadus\' Local Wrapped</title>\n<link rel="icon" type="image/png" href="assets/favicon.png">\n' - html += '<meta name="description" content="Halhadus\' Local Wrapped">\n<meta property="og:title" content="Halhadus\' Local Wrapped">\n' - html += '<meta property="og:description" content="Halhadus\' Local Wrapped">\n<meta property="og:image" content="assets/favicon.png">\n' - html += '<meta property="og:url" content="https://halhadus.rocks/localwrapped.html">\n' - html += '<h1>Halhadus\' Local Wrapped</h1>\n' - html += '<a href="https://git.halhadus.rocks/Halhadus/my-local-wrapped" style="color: #ffffff;">Source Code</a>\n' - html += '<h3>Hi guys. I am too lazy to add links to song names. To find which song is it, check <a href="musiclist.html" style="color: #ffffff;">this link</a>.</h3>\n' - html += '<h2>' + str(year) + '</h2>\n' - html += '<form action="index.html">\n<input type="submit" value="Back to main page" style="background-color: #1f1f1f; color: #ffffff; border: 2px solid #ffffff; border-radius: 5px; padding: 10px 20px; margin: 10px 0px;">\n</form>\n' - html += '<h2>Total Play Time: ' + str(int(total_play_time(datetime.datetime.now().year)/60)) + ' minutes</h2>\n' - if year == datetime.datetime.now().year: - html += '<h2>Last Updated: ' + datetime.datetime.utcfromtimestamp(os.path.getmtime('assets/localwrapped/count.db')).strftime('%Y-%m-%d %H:%M:%S') + ' (UTC +0, I hope.)</h2>\n'; - else: - html += '<h2>Last Updated: ' + datetime.datetime.utcfromtimestamp(os.path.getmtime(f'assets/localwrapped/count-{year}.db')).strftime('%Y-%m-%d %H:%M:%S') + ' (UTC +0, I hope.)</h2>\n' - html += '<h3>Most Played Musics</h3>\n' - html += '<ol>\n' - count_list_formatted = [] - for music in read_count_database(year): - music_name = music[0] - count = music[1] - count_list_formatted.append([music_name, count]) - count_list_formatted.sort(key=lambda x: x[1], reverse=True) - for music in count_list_formatted: - html += '<li>' + music[0] + ' | ' + str(music[1]) + ' times</li>\n' - html += '</ol>\n' - html += '</body>\n</html>' - return html + available_years = get_available_years() + current_year = datetime.datetime.now().year + selected_year = year if year in available_years else current_year + + html = '''<!DOCTYPE html> +<html> +<head> + <meta charset="UTF-8"> + <link href="https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;700&display=swap" rel="stylesheet"> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <title>Halhadus' Local Wrapped</title> + <link rel="icon" type="image/png" href="assets/favicon.png"> + <meta name="description" content="Halhadus' Local Wrapped"> + <meta name="author" content="Halhadus"> + <meta property="og:title" content="Halhadus' Local Wrapped"> + <meta property="og:description" content="Halhadus' Local Wrapped"> + <meta property="og:url" content="https://halhadus.rocks/localwrapped.html"> + <link rel="icon" type="image/png" href="assets/favicon.png"> + <style> + :root { + --bg-color: #1f1f1f; + --card-bg: #2a2a2a; + --border-color: #333; + --text-color: #ffffff; + } + + .container { + max-width: 1200px; + margin: 0 auto; + padding: 1rem; + } + + .year-selector { + display: flex; + gap: 0.5rem; + margin: 1rem 0; + flex-wrap: wrap; + } + + .year-button { + background: #333; + border: 1px solid #444; + color: var(--text-color); + padding: 0.5rem 1rem; + border-radius: 5px; + text-decoration: none; + font-family: 'JetBrains Mono', monospace; + } + + .year-button.active { + background: #444; + border-color: #555; + } + + .music-card { + background: var(--card-bg); + border-radius: 8px; + margin: 1rem 0; + padding: 1rem; + display: grid; + grid-template-columns: 120px 1fr; + gap: 1rem; + align-items: center; + } + + .thumbnail { + width: 100%; + border-radius: 6px; + aspect-ratio: 16/9; + object-fit: cover; + border: 2px solid var(--border-color); + } + + .play-button { + background: #333; + border: 1px solid #444; + color: var(--text-color); + padding: 0.5rem 1rem; + margin: 0.3rem; + border-radius: 5px; + text-decoration: none; + display: inline-block; + text-align: center; + font-family: 'JetBrains Mono', monospace; + } + + .stats { + background: var(--card-bg); + border-radius: 8px; + padding: 1rem; + margin: 1rem 0; + } + + @media (max-width: 768px) { + .music-card { + grid-template-columns: 1fr; + } + } + .source-banner { + background: #2a2a2a; + padding: 12px; + border-radius: 8px; + margin: 20px 0; + text-align: center; + border: 1px solid #333333; + } + </style> +</head> +<body style="background-color: var(--bg-color); color: var(--text-color); font-family: 'JetBrains Mono', monospace;"> + <div class="container"> + <h1>🎵 Halhadus' Local Wrapped</h1> + <a href="/index.html" class="play-button">← Main Page</a> + <div class="source-banner"> + <a href="https://git.halhadus.rocks/Halhadus/my-local-wrapped" style="color: #ffffff; text-decoration: none;">📁 Source Codes</a> + </div> + + <div class="year-selector"> + {% for y in available_years %} + <a href="?year={{ y }}" class="year-button {% if y == selected_year %}active{% endif %}"> + {{ y }} + </a> + {% endfor %} + </div> + + <div class="stats"> + <h2>📊 Statistics for {{ selected_year }}</h2> + <p>⏳ Total Play Time: {{ total_time }} minutes</p> + <p>🕒 Last Updated: {{ last_updated }}</p> + </div> + + <h2>🎶 Most Played Tracks</h2> + {% for music in top_tracks %} + <div class="music-card"> + <img src="https://img.youtube.com/vi/{{ music.video_id }}/hqdefault.jpg" + class="thumbnail" + alt="{{ music.name }} cover"> + <div> + <h3>{{ music.name }}</h3> + <p>▶ Played {{ music.count }} times</p> + <div> + <a href="https://www.youtube.com/watch?v={{ music.video_id }}" + class="play-button" + target="_blank"> + YouTube + </a> + <a href="https://music.youtube.com/watch?v={{ music.video_id }}" + class="play-button" + target="_blank"> + YT Music + </a> + </div> + </div> + </div> + {% endfor %} + </div> +</body> +</html>''' + + # Verileri hazırla + music_data = {row[0]: row for row in read_music_database()} + count_data = read_count_database(selected_year) + + top_tracks = [] + for count_entry in count_data: + if count_entry[0] in music_data: + video_id = music_data[count_entry[0]][1] + top_tracks.append({ + 'name': count_entry[0], + 'count': count_entry[1], + 'video_id': video_id + }) + + top_tracks.sort(key=lambda x: x['count'], reverse=True) + + total_time = int(total_play_time(selected_year) / 60) + + db_path = f'assets/localwrapped/count-{selected_year}.db' if selected_year != current_year else 'assets/localwrapped/count.db' + last_updated = datetime.datetime.utcfromtimestamp(os.path.getmtime(db_path)).strftime('%Y-%m-%d %H:%M UTC') + + return flask.render_template_string(html, top_tracks=top_tracks, total_time=total_time, last_updated=last_updated, available_years=available_years, selected_year=selected_year) diff --git a/websitemodule.py.old b/websitemodule.py.old new file mode 100644 index 0000000..a4bdc4a --- /dev/null +++ b/websitemodule.py.old @@ -0,0 +1,68 @@ +import os +import sqlite3 +import requests +import datetime + +def read_music_database(): + conn = sqlite3.connect("assets/localwrapped/music.db") + c = conn.cursor() + c.execute('SELECT * FROM music') + music_list = c.fetchall() + conn.close() + return music_list + +def read_count_database(year: int): + if year == datetime.datetime.now().year: + conn = sqlite3.connect(f'assets/localwrapped/count.db') + c = conn.cursor() + c.execute('SELECT * FROM count') + count_list = c.fetchall() + conn.close() + return count_list + else: + conn = sqlite3.connect(f'assets/localwrapped/count-{year}.db') + c = conn.cursor() + c.execute('SELECT * FROM count') + count_list = c.fetchall() + conn.close() + return count_list + +def total_play_time(year: int): + total_time = 0 + for countvar in read_count_database(year): + for musicvar in read_music_database(): + if countvar[0] == musicvar[0]: + total_time += float(musicvar[-1]) * countvar[1] + return total_time + +def generatehtmlcode(year: int = datetime.datetime.now().year): + html = '<DOCTYPE html>\n<html>\n' + html += '<head>\n<meta charset="UTF-8">\n<link href="https://fonts.googleapis.com/css2?family=Jetbrains+Mono:wght@400;700&display=swap" rel="stylesheet">\n</head>\n' + html += '<body style="background-color: #1f1f1f; color: #ffffff; font-family: \'Jetbrains Mono\', monospace;">\n<meta name="viewport" content="width=device-width, initial-scale=1.0">\n' + html += '<title>Halhadus\' Local Wrapped</title>\n<link rel="icon" type="image/png" href="assets/favicon.png">\n' + html += '<meta name="description" content="Halhadus\' Local Wrapped">\n<meta property="og:title" content="Halhadus\' Local Wrapped">\n' + html += '<meta property="og:description" content="Halhadus\' Local Wrapped">\n<meta property="og:image" content="assets/favicon.png">\n' + html += '<meta property="og:url" content="https://halhadus.rocks/localwrapped.html">\n' + html += '<h1>Halhadus\' Local Wrapped</h1>\n' + html += '<a href="https://git.halhadus.rocks/Halhadus/my-local-wrapped" style="color: #ffffff;">Source Code</a>\n' + html += '<h3>Hi guys. I am too lazy to add links to song names. To find which song is it, check <a href="musiclist.html" style="color: #ffffff;">this link</a>.</h3>\n' + html += '<h2>' + str(year) + '</h2>\n' + html += '<form action="index.html">\n<input type="submit" value="Back to main page" style="background-color: #1f1f1f; color: #ffffff; border: 2px solid #ffffff; border-radius: 5px; padding: 10px 20px; margin: 10px 0px;">\n</form>\n' + html += '<h2>Total Play Time: ' + str(int(total_play_time(datetime.datetime.now().year)/60)) + ' minutes</h2>\n' + if year == datetime.datetime.now().year: + html += '<h2>Last Updated: ' + datetime.datetime.utcfromtimestamp(os.path.getmtime('assets/localwrapped/count.db')).strftime('%Y-%m-%d %H:%M:%S') + ' (UTC +0, I hope.)</h2>\n'; + else: + html += '<h2>Last Updated: ' + datetime.datetime.utcfromtimestamp(os.path.getmtime(f'assets/localwrapped/count-{year}.db')).strftime('%Y-%m-%d %H:%M:%S') + ' (UTC +0, I hope.)</h2>\n' + html += '<h3>Most Played Musics</h3>\n' + html += '<ol>\n' + count_list_formatted = [] + for music in read_count_database(year): + music_name = music[0] + count = music[1] + count_list_formatted.append([music_name, count]) + count_list_formatted.sort(key=lambda x: x[1], reverse=True) + for music in count_list_formatted: + html += '<li>' + music[0] + ' | ' + str(music[1]) + ' times</li>\n' + html += '</ol>\n' + html += '</body>\n</html>' + return html