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