added pypika for db queries
parent
3c5501643b
commit
2b7f711641
BIN
database/show.db
BIN
database/show.db
Binary file not shown.
|
@ -107,14 +107,35 @@
|
|||
</audio>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<div class="row justify-content-center">
|
||||
<div class="col-md-7">
|
||||
<h4>This weeks playlist:</h4>
|
||||
{% for track in episode_playlist[1:] %}
|
||||
<item>
|
||||
<p>{{track}}</p>
|
||||
</item>
|
||||
{% for track in episode_playlist[0:] %}
|
||||
<h4>{{track}}</h4>
|
||||
{% 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>
|
||||
|
||||
|
|
|
@ -7,6 +7,9 @@ from tinytag import TinyTag
|
|||
from random import shuffle
|
||||
import sqlite3, json
|
||||
import uuid
|
||||
#import pypika # sql query builder
|
||||
from pypika import Query, Table, Field, Column
|
||||
|
||||
conn = ''
|
||||
|
||||
music_library_path = "/home/rob/antena/music/"
|
||||
|
@ -15,35 +18,37 @@ conn = sqlite3.connect("database/show.db")
|
|||
#TODO fix getting bandcamp urls into db
|
||||
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):
|
||||
# the MUSIC LIBRARY TABLE
|
||||
#TODO UNIQUE constraint prevents duplicats but what if tracks are in another locaton?fixme
|
||||
conn.execute('''CREATE TABLE IF NOT EXISTS MUSICLIB(
|
||||
ID INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
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");
|
||||
|
||||
#######################################################
|
||||
conn.execute(str(mus_lib))
|
||||
print('''MUSIC LIBRARY Table created successfully''');
|
||||
|
||||
def mk_db_entry(conn):
|
||||
|
||||
import os
|
||||
|
||||
print("ADDING TRACKS TO DATABASE > > > one moment please! ");
|
||||
label_url = "https://fixme.bandcamp.com/"
|
||||
|
||||
for subdir, dirs, files in os.walk(music_library_path):
|
||||
|
||||
for file in files:
|
||||
for m in [".flac", ".FLAC", ".mp3"]: # get audio files
|
||||
if m in file:
|
||||
|
@ -52,25 +57,31 @@ def mk_db_entry(conn):
|
|||
track = TinyTag.get(os.path.join(subdir, file))# get metadata from file
|
||||
cursor = conn.cursor()
|
||||
|
||||
cursor.execute("INSERT OR IGNORE INTO MUSICLIB (\
|
||||
ID, LABEL, ALBUM, TRACK, ARTIST,\
|
||||
GENRE, TRACKDUR, YEAR, URL, PATH, LASTPLAY, COMMENT) \
|
||||
VALUES (NULL, ?, ?, ?, ?,?, ?,?,?,?,?,? )",\
|
||||
[label, track.album, track.title, track.artist, \
|
||||
track.genre, track.duration, track.year, label_url, str(filepath), "last_played", track.comment]);
|
||||
mus_lib = Table('MUSIC_LIBRARY')
|
||||
q = mus_lib.insert(1, label, track.album, track.title, track.artist, \
|
||||
track.genre, track.duration, track.year, \
|
||||
label_url, str(filepath), "last_played", track.comment)
|
||||
cursor.execute(str(q));
|
||||
conn.commit()
|
||||
# print("DB Record created successfully");
|
||||
|
||||
# track = TinyTag.get(i)
|
||||
# detail = str(track.artist) + " | " + str(track.album) + \
|
||||
# " | " + str(track.title) + " | " + str(track.year) + \
|
||||
# " | " + str(timedelta(seconds=round(track.duration)))
|
||||
# show_info.append("" + detail)
|
||||
|
||||
#def insert_track(conn, track):
|
||||
def count_tracks(conn):
|
||||
query = f"SELECT COUNT(*) FROM MUSIC_LIBRARY"
|
||||
cursor = conn.cursor()
|
||||
cursor.execute(query)
|
||||
result = cursor.fetchone()
|
||||
row_count = result[0]
|
||||
print(f'''\n WHOOP! THE MUSIC LIBRARY CONTAINS {row_count} TRACKS!!
|
||||
--------------------------------------------''')
|
||||
|
||||
def main():
|
||||
|
||||
database_create(conn)
|
||||
mk_db_entry(conn)
|
||||
count_tracks(conn)
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
164
mk_show.py
164
mk_show.py
|
@ -7,6 +7,7 @@ from tinytag import TinyTag
|
|||
from random import shuffle
|
||||
import sqlite3, json
|
||||
import uuid
|
||||
from pypika import Query, Table, Field, Column
|
||||
|
||||
#from mk_web import *
|
||||
|
||||
|
@ -44,29 +45,47 @@ def set_episode_date(input_date):
|
|||
print(episode_date)
|
||||
|
||||
conn = ''
|
||||
def database_create():
|
||||
def database_create_episodes_table():
|
||||
# the show database
|
||||
global conn
|
||||
conn = sqlite3.connect("database/show.db")
|
||||
|
||||
#cursor = conn.cursor()
|
||||
#cursor.execute("DROP TABLE SHOW")
|
||||
#conn.commit()
|
||||
q = Query \
|
||||
.create_table("EPISODES") \
|
||||
.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):
|
||||
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 :
|
||||
|
||||
cursor = conn.cursor()
|
||||
cursor.execute("SELECT * FROM MUSICLIB ORDER BY RANDOM() LIMIT 1 ;")
|
||||
r = cursor.fetchall()
|
||||
for t in r:
|
||||
song = str(t[9])
|
||||
track_label = str(t[1])
|
||||
track_album = str(t[2])
|
||||
track_title = str(t[3])
|
||||
track_artist = str(t[4])
|
||||
track_duration = float(t[6])
|
||||
track_genre = str(t[5])
|
||||
track_year = str(t[7])
|
||||
|
||||
cursor.execute("SELECT * FROM MUSIC_LIBRARY ORDER BY RANDOM() LIMIT 1 ;")
|
||||
r = cursor.fetchone() # FETCH ONE RANDOM TRACK FROM THE DATABASE
|
||||
print(str(r)+"ssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss")
|
||||
# for t in r:
|
||||
song = str(r[9])
|
||||
track_label = str(r[1])
|
||||
track_album = str(r[2])
|
||||
track_title = str(r[3])
|
||||
track_artist = str(r[4])
|
||||
track_duration = float(r[6])
|
||||
track_genre = str(r[5])
|
||||
track_year = str(r[7])
|
||||
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 check_archive(track_title) is True:
|
||||
if track_duration > min_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
|
||||
art = string=re.sub("\(.*?\)","",track_artist)
|
||||
print(art + "?????????????????????????????????????????????????????????????????????????????????????")
|
||||
# shorten verbose artist names such as trojnik Trojnik (Cene Resnik, Tomaž Grom, Vid Drašler)
|
||||
art = string=re.sub("and","&",art)
|
||||
artist_abreviated.append(art)
|
||||
|
@ -133,17 +158,16 @@ def create_episode_playlist(episode_playlist: list, complete_playlist:list):
|
|||
track_year = 0000
|
||||
|
||||
|
||||
#long_string = json.dumps(["' SomeWord"])
|
||||
|
||||
print([episode_number, episode_date, \
|
||||
e = Table('EPISODES')
|
||||
q = e.insert(1, episode_number, episode_date, \
|
||||
track_album, track_title, track_artist, \
|
||||
track_duration, track_year, track_path])
|
||||
track_duration,track_genre, track_year, track_path)
|
||||
|
||||
cursor.execute("INSERT INTO SHOW (\
|
||||
ID, EPISODE, DATE, ALBUM, TRACK, ARTIST, TRACKDUR, YEAR, PATH) \
|
||||
VALUES (NULL, ?, ?, ?, ?, ?,?,?,? )", [episode_number, episode_date, \
|
||||
track_album, track_title, track_artist, \
|
||||
track_duration, track_year, track_path]);
|
||||
cursor.execute(str(q))
|
||||
# ID, EPISODE, DATE, ALBUM, TRACK, ARTIST, TRACKDUR, YEAR, PATH) \
|
||||
# VALUES (NULL, ?, ?, ?, ?, ?,?,?,? )", [episode_number, episode_date, \
|
||||
# track_album, track_title, track_artist, \
|
||||
# track_duration, track_year, track_path]);
|
||||
conn.commit()
|
||||
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[9:12])]][0] > str_length_thresh:
|
||||
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)
|
||||
|
||||
|
@ -353,13 +377,14 @@ def create_podcast(episode_playlist: list):
|
|||
|
||||
# get length of final show / podcast
|
||||
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:
|
||||
# print("FLAC output file opened...writing to file...")
|
||||
# playlist.export(out_f, format='flac')
|
||||
# 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:
|
||||
print("MP3 output file opened...writing to file...")
|
||||
playlist.export(out_f, format='mp3')
|
||||
|
@ -381,7 +406,7 @@ def create_html_homepage_from_template(episode_playlist):
|
|||
episode_artists = []
|
||||
for i in range(10):
|
||||
artists = []
|
||||
cursor.execute("SELECT ARTIST FROM SHOW WHERE EPISODE=?", [i])
|
||||
cursor.execute("SELECT artist FROM EPISODES WHERE episode=?", [i])
|
||||
rows = cursor.fetchall()
|
||||
|
||||
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
|
||||
|
||||
cursor = conn.cursor()
|
||||
cursor.execute('SELECT * FROM SHOW WHERE EPISODE=?', [episode_number])
|
||||
cursor.execute('SELECT * FROM EPISODES WHERE episode=?', [episode_number])
|
||||
r = cursor.fetchall()
|
||||
|
||||
for t in r:
|
||||
song = str(t[0])
|
||||
track_label = str(t[1])
|
||||
#track_label = str(t[1])
|
||||
track_album = str(t[2])
|
||||
track_title = str(t[3])
|
||||
track_artist = str(t[4])
|
||||
track_duration = float(t[6])
|
||||
track_genre = str(t[5])
|
||||
track_year = str(t[7])
|
||||
track_genre = str(t[7])
|
||||
track_year = str(t[8])
|
||||
|
||||
detail = str(track_artist) + " | " + str(track_album) + \
|
||||
" | " + 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
|
||||
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()
|
||||
for t in r:
|
||||
song = str(t[0])
|
||||
track_label = str(t[1])
|
||||
track_album = str(t[2])
|
||||
track_title = str(t[3])
|
||||
track_artist = str(t[4])
|
||||
#track_label = str(t[1])
|
||||
track_album = str(t[3])
|
||||
track_title = str(t[4])
|
||||
track_artist = str(t[5]).upper()
|
||||
track_duration = float(t[6])
|
||||
track_genre = str(t[5])
|
||||
track_year = str(t[7])
|
||||
track_genre = 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) + \
|
||||
" | " + str(track_title) + " | " + str(track_year) + \
|
||||
" | " + str(timedelta(seconds=round(track_duration)))
|
||||
show_info.append("" + detail)
|
||||
|
||||
#TODO FIX THIS UP TO SEND COLUMNS FROM LIST TO JINJA
|
||||
|
||||
output_from_parsed_template = episode_template.render(\
|
||||
show_name=show_name, episode_author="Rob Canning",\
|
||||
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)
|
||||
create_episode_playlist(episode_playlist, complete_playlist)
|
||||
create_show_coverart(episode_playlist, 1) #episode_duration = 100
|
||||
#create_animated_gif()
|
||||
|
||||
|
||||
create_intro(episode_playlist)
|
||||
create_pls_file()
|
||||
|
||||
create_html_homepage_from_template(episode_playlist)
|
||||
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)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
main()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#convert -delay 100 -loop 0 html/episode/2/img/show_cover_2024-01-12* animatedGIF.gif
|
||||
|
|
|
@ -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
|
||||
Todestriebe
|
||||
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
|
||||
Jean-Luc Guionnet & Samo Kutin - Kopaš - 02 02
|
||||
Vertex
|
||||
|
|
2
runme.sh
2
runme.sh
|
@ -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 )
|
||||
|
||||
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
|
||||
|
||||
|
|
Loading…
Reference in New Issue