added pypika for db queries

main
Rob Canning 2024-01-19 01:50:32 +01:00
parent 3c5501643b
commit 2b7f711641
6 changed files with 196 additions and 128 deletions

Binary file not shown.

View File

@ -107,14 +107,35 @@
</audio> </audio>
</div> </div>
<div class="row justify-content-center"> <div class="row justify-content-center">
<div class="col-md-7"> <div class="col-md-7">
<h4>This weeks playlist:</h4> <h4>This weeks playlist:</h4>
{% for track in episode_playlist[1:] %} {% for track in episode_playlist[0:] %}
<item> <h4>{{track}}</h4>
<p>{{track}}</p>
</item>
{% endfor %} {% endfor %}
<!-- <table> -->
<!-- {% for track in episode_playlist[0:] %} -->
<!-- <TR> -->
<!-- <TD class="c1"><IMG src="favicon.ico"></TD> -->
<!-- <TD class="c2">{{track[0]}}</TD> -->
<!-- <TD class="c3">{{track[1]}}</TD> -->
<!-- <TD class="c4"><SPAN>{{track[2]}}</SPAN></TD> -->
<!-- <TD class="c5"><SPAN>{{track[3]}}</SPAN></TD> -->
<!-- <\!-- <Item> -\-> -->
<!-- <\!-- <p>{{track}}</p> -\-> -->
<!-- <\!-- </item> -\-> -->
<!-- </TR> -->
<!-- {% endfor %} -->
<!-- </table> -->
</div> </div>
</div> </div>

View File

@ -7,6 +7,9 @@ from tinytag import TinyTag
from random import shuffle from random import shuffle
import sqlite3, json import sqlite3, json
import uuid import uuid
#import pypika # sql query builder
from pypika import Query, Table, Field, Column
conn = '' conn = ''
music_library_path = "/home/rob/antena/music/" music_library_path = "/home/rob/antena/music/"
@ -15,35 +18,37 @@ conn = sqlite3.connect("database/show.db")
#TODO fix getting bandcamp urls into db #TODO fix getting bandcamp urls into db
labelnames = [("sploh", "https://sploh.bandcamp.com"), ("terraformer"), ("pharamafabric") ] labelnames = [("sploh", "https://sploh.bandcamp.com"), ("terraformer"), ("pharamafabric") ]
# todo find album with no album name
mus_lib = Query \
.create_table("MUSIC_LIBRARY") \
.columns(
Column("id", "INT", nullable=True),
Column("label", "VARCHAR(100)", nullable=True),
Column("album", "VARCHAR(100)", nullable=True),
Column("track", "VARCHAR(200)", nullable=True),
Column("artist", "VARCHAR(120)", nullable=True),
Column("genre", "VARCHAR(120)", nullable=True),
Column("trackdur", "FLOAT", nullable=True),
Column("year", "INT", nullable=True),
Column("url", "VARCHAR(120)", nullable=True),
Column("path", "VARCHAR(120)", nullable=False),
Column("lastplay", "DATETINE", nullable=True),
Column("comment", "VARCHAR(120)", nullable=True))\
.unique("path") \
.primary_key("path")
def database_create(conn): def database_create(conn):
# the MUSIC LIBRARY TABLE # the MUSIC LIBRARY TABLE
#TODO UNIQUE constraint prevents duplicats but what if tracks are in another locaton?fixme #TODO UNIQUE constraint prevents duplicats but what if tracks are in another locaton?fixme
conn.execute('''CREATE TABLE IF NOT EXISTS MUSICLIB( conn.execute(str(mus_lib))
ID INTEGER PRIMARY KEY AUTOINCREMENT, print('''MUSIC LIBRARY Table created successfully''');
LABEL TEXT NOT NULL,
ALBUM TEXT ,
TRACK TEXT ,
ARTIST TEXT ,
GENRE TEXT ,
TRACKDUR TEXT ,
YEAR TEXT,
URL TEXT,
PATH TEXT UNIQUE,
LASTPLAY TEXT,
COMMENT TEXT
);''')
print("Table created successfully");
#######################################################
def mk_db_entry(conn): def mk_db_entry(conn):
print("ADDING TRACKS TO DATABASE > > > one moment please! ");
import os
label_url = "https://fixme.bandcamp.com/" label_url = "https://fixme.bandcamp.com/"
for subdir, dirs, files in os.walk(music_library_path): for subdir, dirs, files in os.walk(music_library_path):
for file in files: for file in files:
for m in [".flac", ".FLAC", ".mp3"]: # get audio files for m in [".flac", ".FLAC", ".mp3"]: # get audio files
if m in file: if m in file:
@ -51,26 +56,32 @@ def mk_db_entry(conn):
label = filepath.parts[5] # get LABEL etc name from path label = filepath.parts[5] # get LABEL etc name from path
track = TinyTag.get(os.path.join(subdir, file))# get metadata from file track = TinyTag.get(os.path.join(subdir, file))# get metadata from file
cursor = conn.cursor() cursor = conn.cursor()
cursor.execute("INSERT OR IGNORE INTO MUSICLIB (\ mus_lib = Table('MUSIC_LIBRARY')
ID, LABEL, ALBUM, TRACK, ARTIST,\ q = mus_lib.insert(1, label, track.album, track.title, track.artist, \
GENRE, TRACKDUR, YEAR, URL, PATH, LASTPLAY, COMMENT) \ track.genre, track.duration, track.year, \
VALUES (NULL, ?, ?, ?, ?,?, ?,?,?,?,?,? )",\ label_url, str(filepath), "last_played", track.comment)
[label, track.album, track.title, track.artist, \ cursor.execute(str(q));
track.genre, track.duration, track.year, label_url, str(filepath), "last_played", track.comment]);
conn.commit() conn.commit()
# print("DB Record created successfully");
def count_tracks(conn):
# track = TinyTag.get(i) query = f"SELECT COUNT(*) FROM MUSIC_LIBRARY"
# detail = str(track.artist) + " | " + str(track.album) + \ cursor = conn.cursor()
# " | " + str(track.title) + " | " + str(track.year) + \ cursor.execute(query)
# " | " + str(timedelta(seconds=round(track.duration))) result = cursor.fetchone()
# show_info.append("" + detail) row_count = result[0]
print(f'''\n WHOOP! THE MUSIC LIBRARY CONTAINS {row_count} TRACKS!!
#def insert_track(conn, track): --------------------------------------------''')
def main():
database_create(conn)
mk_db_entry(conn) database_create(conn)
mk_db_entry(conn)
count_tracks(conn)
if __name__ == "__main__":
main()

View File

@ -7,6 +7,7 @@ from tinytag import TinyTag
from random import shuffle from random import shuffle
import sqlite3, json import sqlite3, json
import uuid import uuid
from pypika import Query, Table, Field, Column
#from mk_web import * #from mk_web import *
@ -44,29 +45,47 @@ def set_episode_date(input_date):
print(episode_date) print(episode_date)
conn = '' conn = ''
def database_create(): def database_create_episodes_table():
# the show database # the show database
global conn global conn
conn = sqlite3.connect("database/show.db") conn = sqlite3.connect("database/show.db")
#cursor = conn.cursor() q = Query \
#cursor.execute("DROP TABLE SHOW") .create_table("EPISODES") \
#conn.commit() .columns(
Column("id", "INT", nullable=True),
Column("episode", "INT", nullable=True),
Column("date", 'DATETIME', nullable=True),
Column("album", "VARCHAR(200)", nullable=True),
Column("track", "VARCHAR(120)", nullable=True),
Column("artist", "VARCHAR(120)", nullable=True),
Column("trackdur", "FLOAT", nullable=True),
Column("genre", "VARCHAR(120)", nullable=True),
Column("year", 'DATETIME', nullable=True),
Column("path", "VARCHAR(120)", nullable=False))\
.primary_key("path")
#.unique("path") \
#TODO get the unique path back into action find bug
conn.execute(str(q))
print("EPISODES Table created successfully");
conn.execute('''CREATE TABLE IF NOT EXISTS SHOW(
ID INTEGER PRIMARY KEY AUTOINCREMENT,
EPISODE INT NOT NULL,
DATE TEXT NOT NULL,
ALBUM TEXT ,
TRACK TEXT NOT NULL,
ARTIST TEXT NOT NULL,
TRACKDUR FLOAT NOT NULL,
GENRE TEXT NOT NULL,
YEAR TEXT NOT NULL,
PATH TEXT NOT NULL
);''')
print("Table created successfully");
def create_intro(episode_playlist): def create_intro(episode_playlist):
intropath = path + "audio/texts/clips/this_is" intropath = path + "audio/texts/clips/this_is"
@ -104,25 +123,31 @@ def create_episode_playlist(episode_playlist: list, complete_playlist:list):
while episode_duration < 60 * 60 and track_count < 12 : while episode_duration < 60 * 60 and track_count < 12 :
cursor = conn.cursor() cursor = conn.cursor()
cursor.execute("SELECT * FROM MUSICLIB ORDER BY RANDOM() LIMIT 1 ;") cursor.execute("SELECT * FROM MUSIC_LIBRARY ORDER BY RANDOM() LIMIT 1 ;")
r = cursor.fetchall() r = cursor.fetchone() # FETCH ONE RANDOM TRACK FROM THE DATABASE
for t in r: print(str(r)+"ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss")
song = str(t[9]) # for t in r:
track_label = str(t[1]) song = str(r[9])
track_album = str(t[2]) track_label = str(r[1])
track_title = str(t[3]) track_album = str(r[2])
track_artist = str(t[4]) track_title = str(r[3])
track_duration = float(t[6]) track_artist = str(r[4])
track_genre = str(t[5]) track_duration = float(r[6])
track_year = str(t[7]) track_genre = str(r[5])
track_year = str(r[7])
track_path = '/'.join(song.split('/')[0:-1]) track_path = '/'.join(song.split('/')[0:-1])
# SOME LOGIC TO SEE IF WE ALLOW THAT TRACK OR NOT
# TODO here we need to append to DB not the static file
if track_artist not in artists_played: if track_artist not in artists_played:
if check_archive(track_title) is True: if check_archive(track_title) is True:
if track_duration > min_track_dur * 60: if track_duration > min_track_dur * 60:
if int(track_duration) < max_track_dur * 60: if int(track_duration) < max_track_dur * 60:
episode_playlist.append(song.rstrip()) # if 'not in' is true then add the song episode_playlist.append(song.rstrip()) # if 'not in' is true then add the song
art = string=re.sub("\(.*?\)","",track_artist) art = string=re.sub("\(.*?\)","",track_artist)
print(art + "?????????????????????????????????????????????????????????????????????????????????????")
# shorten verbose artist names such as trojnik Trojnik (Cene Resnik, Tomaž Grom, Vid Drašler) # shorten verbose artist names such as trojnik Trojnik (Cene Resnik, Tomaž Grom, Vid Drašler)
art = string=re.sub("and","&",art) art = string=re.sub("and","&",art)
artist_abreviated.append(art) artist_abreviated.append(art)
@ -133,17 +158,16 @@ def create_episode_playlist(episode_playlist: list, complete_playlist:list):
track_year = 0000 track_year = 0000
#long_string = json.dumps(["' SomeWord"]) e = Table('EPISODES')
q = e.insert(1, episode_number, episode_date, \
print([episode_number, episode_date, \ track_album, track_title, track_artist, \
track_album, track_title, track_artist, \ track_duration,track_genre, track_year, track_path)
track_duration, track_year, track_path])
cursor.execute("INSERT INTO SHOW (\ cursor.execute(str(q))
ID, EPISODE, DATE, ALBUM, TRACK, ARTIST, TRACKDUR, YEAR, PATH) \ # ID, EPISODE, DATE, ALBUM, TRACK, ARTIST, TRACKDUR, YEAR, PATH) \
VALUES (NULL, ?, ?, ?, ?, ?,?,?,? )", [episode_number, episode_date, \ # VALUES (NULL, ?, ?, ?, ?, ?,?,?,? )", [episode_number, episode_date, \
track_album, track_title, track_artist, \ # track_album, track_title, track_artist, \
track_duration, track_year, track_path]); # track_duration, track_year, track_path]);
conn.commit() conn.commit()
print("sqlite: Episode track successfully inserted into SHOW table"); print("sqlite: Episode track successfully inserted into SHOW table");
@ -219,7 +243,7 @@ def combine_images(columns, space, images, variants:int):
[len(s) for s in [''.join(artist_abreviated[6:9])]][0] > str_length_thresh or \ [len(s) for s in [''.join(artist_abreviated[6:9])]][0] > str_length_thresh or \
[len(s) for s in [''.join(artist_abreviated[9:12])]][0] > str_length_thresh: [len(s) for s in [''.join(artist_abreviated[9:12])]][0] > str_length_thresh:
print('''one of the lines is longer than fits the page... print('''one of the lines is longer than fits the page...
...................shuffling the list for a better look''') ...................shuffling the list for a better look: {0}'''.format(artist_abreviated))
random.shuffle(artist_abreviated) random.shuffle(artist_abreviated)
@ -353,13 +377,14 @@ def create_podcast(episode_playlist: list):
# get length of final show / podcast # get length of final show / podcast
playlist_length = len(playlist) / (1000*60) playlist_length = len(playlist) / (1000*60)
# save the entire poidcast
# save the entire poidcast as FLAC
# with open("html/episode/{0}/show.flac".format(episode_number), 'wb') as out_f: # with open("html/episode/{0}/show.flac".format(episode_number), 'wb') as out_f:
# print("FLAC output file opened...writing to file...") # print("FLAC output file opened...writing to file...")
# playlist.export(out_f, format='flac') # playlist.export(out_f, format='flac')
# print("FLAC audio file exported...") # print("FLAC audio file exported...")
# save the entire poidcast as MP3
with open("html/episode/{0}/show.mp3".format(episode_number), 'wb') as out_f: with open("html/episode/{0}/show.mp3".format(episode_number), 'wb') as out_f:
print("MP3 output file opened...writing to file...") print("MP3 output file opened...writing to file...")
playlist.export(out_f, format='mp3') playlist.export(out_f, format='mp3')
@ -381,7 +406,7 @@ def create_html_homepage_from_template(episode_playlist):
episode_artists = [] episode_artists = []
for i in range(10): for i in range(10):
artists = [] artists = []
cursor.execute("SELECT ARTIST FROM SHOW WHERE EPISODE=?", [i]) cursor.execute("SELECT artist FROM EPISODES WHERE episode=?", [i])
rows = cursor.fetchall() rows = cursor.fetchall()
for artist in rows: for artist in rows:
@ -402,17 +427,18 @@ def create_html_homepage_from_template(episode_playlist):
episodes = reversed(episodes) # reversed order to most recent episode appears first in list episodes = reversed(episodes) # reversed order to most recent episode appears first in list
cursor = conn.cursor() cursor = conn.cursor()
cursor.execute('SELECT * FROM SHOW WHERE EPISODE=?', [episode_number]) cursor.execute('SELECT * FROM EPISODES WHERE episode=?', [episode_number])
r = cursor.fetchall() r = cursor.fetchall()
for t in r: for t in r:
song = str(t[0]) song = str(t[0])
track_label = str(t[1]) #track_label = str(t[1])
track_album = str(t[2]) track_album = str(t[2])
track_title = str(t[3]) track_title = str(t[3])
track_artist = str(t[4]) track_artist = str(t[4])
track_duration = float(t[6]) track_duration = float(t[6])
track_genre = str(t[5]) track_genre = str(t[7])
track_year = str(t[7]) track_year = str(t[8])
detail = str(track_artist) + " | " + str(track_album) + \ detail = str(track_artist) + " | " + str(track_album) + \
" | " + str(track_title) + " | " + str(track_year) + \ " | " + str(track_title) + " | " + str(track_year) + \
@ -442,27 +468,33 @@ def create_html_episode_from_template(episode_playlist):
# maybe a jinja2 template loop here instead # maybe a jinja2 template loop here instead
cursor = conn.cursor() cursor = conn.cursor()
cursor.execute('SELECT * FROM SHOW WHERE EPISODE=?', [episode_number])
e = Table('EPISODES')
q = Query.from_(e).select(
e.episode
).where(
e.episode == episode_number)
# raw 'SELECT * FROM EPISODES WHERE EPISODE=?', [episode_number]
cursor.execute('SELECT * FROM EPISODES WHERE EPISODE=?', [episode_number])
r = cursor.fetchall() r = cursor.fetchall()
for t in r: for t in r:
song = str(t[0]) song = str(t[0])
track_label = str(t[1]) #track_label = str(t[1])
track_album = str(t[2]) track_album = str(t[3])
track_title = str(t[3]) track_title = str(t[4])
track_artist = str(t[4]) track_artist = str(t[5]).upper()
track_duration = float(t[6]) track_duration = float(t[6])
track_genre = str(t[5]) track_genre = str(t[7])
track_year = str(t[7]) track_year = str(t[8])
# for i in episode_playlist: # liar od files
#for i in cur: # liar od files
#track = TinyTag.get(i)
detail = str(track_artist) + " | " + str(track_album) + \ detail = str(track_artist) + " | " + str(track_album) + \
" | " + str(track_title) + " | " + str(track_year) + \ " | " + str(track_title) + " | " + str(track_year) + \
" | " + str(timedelta(seconds=round(track_duration))) " | " + str(timedelta(seconds=round(track_duration)))
show_info.append("" + detail) show_info.append("" + detail)
#TODO FIX THIS UP TO SEND COLUMNS FROM LIST TO JINJA
output_from_parsed_template = episode_template.render(\ output_from_parsed_template = episode_template.render(\
show_name=show_name, episode_author="Rob Canning",\ show_name=show_name, episode_author="Rob Canning",\
episode_duration=episode_duration, \ episode_duration=episode_duration, \
@ -490,25 +522,29 @@ def create_RSS_XML_from_template():
def main():
database_create() database_create_episodes_table()
set_episode_date(input_date)
set_episode_date(input_date) create_episode_playlist(episode_playlist, complete_playlist)
create_episode_playlist(episode_playlist, complete_playlist) create_show_coverart(episode_playlist, 1) #episode_duration = 100
create_show_coverart(episode_playlist, 1) #episode_duration = 100 #create_animated_gif()
#create_animated_gif() create_intro(episode_playlist)
create_pls_file()
create_html_episode_from_template(episode_playlist)
create_html_homepage_from_template(episode_playlist)
create_RSS_XML_from_template()
conn.close()
create_podcast(episode_playlist)
create_intro(episode_playlist)
create_pls_file()
create_html_homepage_from_template(episode_playlist)
create_html_episode_from_template(episode_playlist)
create_RSS_XML_from_template()
conn.close() main()
create_podcast(episode_playlist)
#convert -delay 100 -loop 0 html/episode/2/img/show_cover_2024-01-12* animatedGIF.gif #convert -delay 100 -loop 0 html/episode/2/img/show_cover_2024-01-12* animatedGIF.gif

View File

@ -1,13 +1,13 @@
Stampede
Vrtnice
zvoki iz dnevne sobe
jez
The Left Eye
NeoPogo - FeS2
BE CREEP - Burnt Dreams
Zlatko Kaučič, Tomaž Grom - Torn Memories Of Folklore - Raztrgana folklora spomina - 08 Almost The Same
The Mother (Act VII)
一点一滴 一点一滴
BE CREEP - LIVE Jean-Luc Guionnet & Samo Kutin - Kopaš - 02 02
Todestriebe Vertex
The Great White Buffalo
Liqweed
Keep An Eye On That Ice Cream
Kaverna
Jošt Drašler - The Balloon Catcher - 03 Water Balloon
Magie de la Pleine Lune
Domen Gnezda - Misnomer II - 16 Misnomer 38
All is silent, All is dead
Exit Lover

View File

@ -8,7 +8,7 @@ rm html/index.html
show_dates=(2024-03-03 2024-03-10 2024-03-17 2024-03-24 2024-03-31 2024-03-31 2024-03-31 2024-03-31 2024-03-31 ) show_dates=(2024-03-03 2024-03-10 2024-03-17 2024-03-24 2024-03-31 2024-03-31 2024-03-31 2024-03-31 2024-03-31 )
counter= # set this as input argument to set what episode to start creating from... counter=0 # set this as input argument to set what episode to start creating from...
episodes=12 # set this as another input argument for how many episodes to produce episodes=12 # set this as another input argument for how many episodes to produce