mirror of
https://github.com/agresdominik/predictify.git
synced 2026-04-21 17:55:49 +00:00
refacor & simple logger
This commit is contained in:
+5
-4
@@ -1,5 +1,6 @@
|
|||||||
import base64
|
import base64
|
||||||
import json
|
import json
|
||||||
|
import logging as log
|
||||||
import os
|
import os
|
||||||
import time
|
import time
|
||||||
from http.server import BaseHTTPRequestHandler, HTTPServer
|
from http.server import BaseHTTPRequestHandler, HTTPServer
|
||||||
@@ -37,7 +38,7 @@ def simple_authenticate(grant_type: str = "client_credentials") -> str:
|
|||||||
access_token = response.json().get('access_token')
|
access_token = response.json().get('access_token')
|
||||||
return access_token
|
return access_token
|
||||||
else:
|
else:
|
||||||
print(f"Error {response.status_code}: {response.text}")
|
log.error(f"Error {response.status_code}: {response.text}")
|
||||||
|
|
||||||
|
|
||||||
def authenticate(scope: str) -> str:
|
def authenticate(scope: str) -> str:
|
||||||
@@ -55,7 +56,7 @@ def authenticate(scope: str) -> str:
|
|||||||
if time.time() < expires_at:
|
if time.time() < expires_at:
|
||||||
return access_token
|
return access_token
|
||||||
else:
|
else:
|
||||||
print(f"Token for scope {scope} expired, refreshing...")
|
log.info(f"Token for scope {scope} expired, refreshing...")
|
||||||
access_token, expires_at = _refresh_access_token(refresh_token, spotify_client_id, spotify_client_secret)
|
access_token, expires_at = _refresh_access_token(refresh_token, spotify_client_id, spotify_client_secret)
|
||||||
_refresh_tokens_file(access_token, scope, expires_at)
|
_refresh_tokens_file(access_token, scope, expires_at)
|
||||||
return access_token
|
return access_token
|
||||||
@@ -128,7 +129,7 @@ def _start_server_and_wait_for_code() -> any:
|
|||||||
self.wfile.write(b"Authorization successful! You can close this window.")
|
self.wfile.write(b"Authorization successful! You can close this window.")
|
||||||
|
|
||||||
server = HTTPServer(('localhost', 8888), CallbackHandler)
|
server = HTTPServer(('localhost', 8888), CallbackHandler)
|
||||||
print("Starting server to capture the authorization code...")
|
log.info("Starting server to capture the authorization code...")
|
||||||
server.handle_request()
|
server.handle_request()
|
||||||
return server.authorization_code
|
return server.authorization_code
|
||||||
|
|
||||||
@@ -253,4 +254,4 @@ def _refresh_tokens_file(access_token: str, scope: str, expires_at) -> None:
|
|||||||
with open(TOKEN_FILE_PATH, 'w') as file:
|
with open(TOKEN_FILE_PATH, 'w') as file:
|
||||||
json.dump(tokens, file, indent=4)
|
json.dump(tokens, file, indent=4)
|
||||||
else:
|
else:
|
||||||
print(f"Error: Scope '{scope}' or refresh_token not found in the tokens file.")
|
log.error(f"Error: Scope '{scope}' or refresh_token not found in the tokens file.")
|
||||||
|
|||||||
+16
-19
@@ -1,3 +1,4 @@
|
|||||||
|
import logging as log
|
||||||
import sqlite3
|
import sqlite3
|
||||||
from enum import Enum
|
from enum import Enum
|
||||||
|
|
||||||
@@ -28,21 +29,31 @@ class Database:
|
|||||||
self.cursor.execute(f'''
|
self.cursor.execute(f'''
|
||||||
CREATE TABLE IF NOT EXISTS {Table.TRACK_INFORMATION.value} (
|
CREATE TABLE IF NOT EXISTS {Table.TRACK_INFORMATION.value} (
|
||||||
track_id TEXT PRIMARY KEY,
|
track_id TEXT PRIMARY KEY,
|
||||||
title TEXT
|
title TEXT,
|
||||||
|
duration_ms INTEGER,
|
||||||
|
explicit BOOLEAN,
|
||||||
|
popularity INTEGER
|
||||||
);
|
);
|
||||||
''')
|
''')
|
||||||
|
|
||||||
self.cursor.execute(f'''
|
self.cursor.execute(f'''
|
||||||
CREATE TABLE IF NOT EXISTS {Table.ARTIST_INFORMATION.value} (
|
CREATE TABLE IF NOT EXISTS {Table.ARTIST_INFORMATION.value} (
|
||||||
artist_id TEXT PRIMARY KEY,
|
artist_id TEXT PRIMARY KEY,
|
||||||
artist_name TEXT
|
artist_name TEXT,
|
||||||
|
followers INTEGER,
|
||||||
|
genres TEXT,
|
||||||
|
popularity INTEGER
|
||||||
);
|
);
|
||||||
''')
|
''')
|
||||||
|
|
||||||
self.cursor.execute(f'''
|
self.cursor.execute(f'''
|
||||||
CREATE TABLE IF NOT EXISTS {Table.ALBUM_INFORMATION.value} (
|
CREATE TABLE IF NOT EXISTS {Table.ALBUM_INFORMATION.value} (
|
||||||
album_id TEXT PRIMARY KEY,
|
album_id TEXT PRIMARY KEY,
|
||||||
album_name TEXT
|
album_name TEXT,
|
||||||
|
album_type TEXT,
|
||||||
|
total_tracks INTEGER,
|
||||||
|
release_date TEXT,
|
||||||
|
label TEXT
|
||||||
);
|
);
|
||||||
''')
|
''')
|
||||||
|
|
||||||
@@ -77,7 +88,7 @@ class Database:
|
|||||||
self.cursor.execute(query, values)
|
self.cursor.execute(query, values)
|
||||||
self.conn.commit()
|
self.conn.commit()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error: {e}")
|
log.debug(f"Error: {e}")
|
||||||
|
|
||||||
def read_all_rows(self, table: Table, column: str = "*"):
|
def read_all_rows(self, table: Table, column: str = "*"):
|
||||||
"""Read all rows from the specified table"""
|
"""Read all rows from the specified table"""
|
||||||
@@ -111,19 +122,5 @@ class Database:
|
|||||||
rows = self.cursor.fetchall()
|
rows = self.cursor.fetchall()
|
||||||
return rows
|
return rows
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(f"Error retrieving total overview: {e}")
|
log.error(f"Error retrieving total overview: {e}")
|
||||||
return []
|
return []
|
||||||
|
|
||||||
"""
|
|
||||||
print(rows)
|
|
||||||
|
|
||||||
if rows:
|
|
||||||
print(f"{'Played At':<20} {'Track ID':<20} {'Track Title':<50} {'Artist ID':<20} {'Artist Name':<50} {'Album ID':<20} {'Album Name':<50}")
|
|
||||||
print("-" * 160)
|
|
||||||
for row in rows:
|
|
||||||
played_at, track_id, title, artist_id, artist_name, album_id, album_name = row
|
|
||||||
print(f"{played_at:<20} {track_id:<20} {title:<50} {artist_id:<20} {artist_name:<50} {album_id:<20} {album_name:<50}")
|
|
||||||
else:
|
|
||||||
print("No recently played songs found.")
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Error retrieving total overview: {e}")"""
|
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
from scraper import scraping
|
||||||
|
|
||||||
|
scraping()
|
||||||
+38
-27
@@ -6,7 +6,7 @@ from database_handler import Database, Table
|
|||||||
db = Database('spotify_scraped.db')
|
db = Database('spotify_scraped.db')
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def scraping():
|
||||||
"""
|
"""
|
||||||
This function is the main function that will be executed when the script is run
|
This function is the main function that will be executed when the script is run
|
||||||
"""
|
"""
|
||||||
@@ -17,31 +17,8 @@ def main():
|
|||||||
|
|
||||||
# Once each 30 mins
|
# Once each 30 mins
|
||||||
_read_recently_played_page_and_add_to_db(bearer_token=bearer_token)
|
_read_recently_played_page_and_add_to_db(bearer_token=bearer_token)
|
||||||
|
_scrape_missing_infos()
|
||||||
|
|
||||||
bearer_token_simple = simple_authenticate()
|
|
||||||
# Once a day
|
|
||||||
all_track_ids_recently_played = db.read_all_rows(Table.RECENTLY_PLAYED, 'track_id')
|
|
||||||
all_track_ids_saved = db.read_all_rows(Table.TRACK_INFORMATION, 'track_id')
|
|
||||||
all_track_ids_missing = list(set(all_track_ids_recently_played) - set(all_track_ids_saved))
|
|
||||||
for track_id in all_track_ids_missing:
|
|
||||||
response = _get_track_information(track_id=track_id[0], bearer_token=bearer_token_simple)
|
|
||||||
db.add_row(Table.TRACK_INFORMATION, (response['id'], response['name']))
|
|
||||||
# Once a day
|
|
||||||
all_album_ids_recently_played = db.read_all_rows(Table.RECENTLY_PLAYED, 'album_id')
|
|
||||||
all_album_ids_saved = db.read_all_rows(Table.ALBUM_INFORMATION, 'album_id')
|
|
||||||
all_album_ids_missing = list(set(all_album_ids_recently_played) - set(all_album_ids_saved))
|
|
||||||
for album_id in all_album_ids_missing:
|
|
||||||
response = _get_album_information(album_id=album_id[0], bearer_token=bearer_token_simple)
|
|
||||||
db.add_row(Table.ALBUM_INFORMATION, (response['id'], response['name']))
|
|
||||||
# Once a day
|
|
||||||
all_artist_ids_recently_played = db.read_all_rows(Table.RECENTLY_PLAYED, 'artist_id')
|
|
||||||
all_artist_ids_saved = db.read_all_rows(Table.ARTIST_INFORMATION, 'artist_id')
|
|
||||||
all_artist_ids_missing = list(set(all_artist_ids_recently_played) - set(all_artist_ids_saved))
|
|
||||||
for artist_id in all_artist_ids_missing:
|
|
||||||
response = _get_artist_information(artist_id=artist_id[0], bearer_token=bearer_token_simple)
|
|
||||||
db.add_row(Table.ARTIST_INFORMATION, (response['id'], response['name']))
|
|
||||||
|
|
||||||
# Close the database connection
|
|
||||||
db.close()
|
db.close()
|
||||||
|
|
||||||
|
|
||||||
@@ -135,5 +112,39 @@ def _get_album_information(album_id: str, bearer_token: str) -> dict:
|
|||||||
return response_json
|
return response_json
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
def _scrape_missing_infos():
|
||||||
main()
|
"""
|
||||||
|
"""
|
||||||
|
global db
|
||||||
|
|
||||||
|
bearer_token_simple = simple_authenticate()
|
||||||
|
|
||||||
|
# Track Info
|
||||||
|
all_track_ids_recently_played = db.read_all_rows(Table.RECENTLY_PLAYED, 'track_id')
|
||||||
|
all_track_ids_saved = db.read_all_rows(Table.TRACK_INFORMATION, 'track_id')
|
||||||
|
all_track_ids_missing = list(set(all_track_ids_recently_played) - set(all_track_ids_saved))
|
||||||
|
for track_id in all_track_ids_missing:
|
||||||
|
response = _get_track_information(track_id=track_id[0], bearer_token=bearer_token_simple)
|
||||||
|
db.add_row(Table.TRACK_INFORMATION, (response['id'], response['name'], response['duration_ms'], response['explicit'], response['popularity']))
|
||||||
|
# Album Info
|
||||||
|
all_album_ids_recently_played = db.read_all_rows(Table.RECENTLY_PLAYED, 'album_id')
|
||||||
|
all_album_ids_saved = db.read_all_rows(Table.ALBUM_INFORMATION, 'album_id')
|
||||||
|
all_album_ids_missing = list(set(all_album_ids_recently_played) - set(all_album_ids_saved))
|
||||||
|
for album_id in all_album_ids_missing:
|
||||||
|
response = _get_album_information(album_id=album_id[0], bearer_token=bearer_token_simple)
|
||||||
|
try:
|
||||||
|
release_year = response['release_date'][:4]
|
||||||
|
except Exception:
|
||||||
|
release_year = ""
|
||||||
|
db.add_row(Table.ALBUM_INFORMATION, (response['id'], response['name'], response['album_type'], response['total_tracks'], release_year, response['label']))
|
||||||
|
# Artist Info
|
||||||
|
all_artist_ids_recently_played = db.read_all_rows(Table.RECENTLY_PLAYED, 'artist_id')
|
||||||
|
all_artist_ids_saved = db.read_all_rows(Table.ARTIST_INFORMATION, 'artist_id')
|
||||||
|
all_artist_ids_missing = list(set(all_artist_ids_recently_played) - set(all_artist_ids_saved))
|
||||||
|
for artist_id in all_artist_ids_missing:
|
||||||
|
response = _get_artist_information(artist_id=artist_id[0], bearer_token=bearer_token_simple)
|
||||||
|
try:
|
||||||
|
genre = response['genres'][0]
|
||||||
|
except IndexError:
|
||||||
|
genre = ""
|
||||||
|
db.add_row(Table.ARTIST_INFORMATION, (response['id'], response['name'], response['followers']['total'], genre, response['popularity']))
|
||||||
|
|||||||
Reference in New Issue
Block a user