uuid4 for unique id, db now for play history query

main
Rob Canning 2024-01-22 22:42:54 +01:00
parent de16269ad8
commit 9181ae9f2d
7 changed files with 335 additions and 235 deletions

View File

@ -29,7 +29,7 @@ now using a venv so :
python3 -m venv .venv
source .venv/bin/activate
pip install tinytag scikit-image
pip install tinytag scikit-image popen
## run the script

Binary file not shown.

View File

@ -92,7 +92,7 @@
<div class="container">
<div class="row align-items-center justify-content-center text-center">
<div class="col-md-8" data-aos="fade-up" data-aos-delay="400">
<h2 class="text-white font-weight-light mb-2 display-4">{{show_title}}</h2>
<h2 class="text-white font-weight-light mb-2 display-4">{{show_name}} | Episode #{{episode_number}} </h2>
<div class="text-white mb-3"><span class="text-white-opacity-05"><small>{{episode_author}} <span class="sep">/</span> {{episode_date}} <span class="sep">/</span> {{episode_dur}}</small></span></div>
</div>
</div>
@ -119,6 +119,7 @@
<table class="table table-striped">
<!-- <TD class="c1"><IMG src="favicon.ico"></TD> -->
<TD class="c0"><b>#</b></TD>
<TD class="c1"><b>TRACK</b></TD>
<TD class="c2"><b>ARTIST</b></TD>
<TD class="c3"><b>ALBUM</b></TD>
@ -130,12 +131,13 @@
<TR>
<!-- <TD class="c1"><IMG src="favicon.ico"></TD> -->
<TD class="c1"><i>{{track[0]}}</i></TD>
<TD class="c2">{{track[1]}}</TD>
<TD class="c3">{{track[2]}}</TD>
<TD class="c4">{{track[3]}}</TD>
<TD class="c5">{{track[4]}}</TD>
<TD class="c5">{{track[5]}}</T>
<TD class="c0"><i>{{track[0]}}</i></TD>
<TD class="c1"><i>{{track[1]}}</i></TD>
<TD class="c2">{{track[2]}}</TD>
<TD class="c3">{{track[3]}}</TD>
<TD class="c4">{{track[4]}}</TD>
<TD class="c5">{{track[5]}}</TD>
<TD class="c5">{{track[6]}}</T>
<!-- <Item> -->
<!-- <p>{{track}}</p> -->

View File

@ -94,7 +94,7 @@
<div class="col-md-8" data-aos="fade-up" data-aos-delay="400">
<h2 class="text-white font-weight-light mb-2 display-4">Latest Episode: # {{episode_number}}</h2>
<div class="text-white mb-4"><span class="text-white">{{episode_artists}}</span></div>
<div class="text-white mb-4"><span class="text-white"><b>This week music from: {{episode_artists}}</b></span></div>
<div class="text-white mb-4"><span class="text-white-opacity-05"><small>{{episode_author}} / Zavod Rizoma | 16 September 2017 | 1:30:20</small></span></div>
<p><a href="episode/{{episode_number}}/index.html" class="btn btn-primary btn-sm py-3 px-4 small">Episode Details and Player</a></p>
@ -127,7 +127,7 @@
<h3 class="font-weight-light"><a href="episode/{{episode.episode_number}}/index.html">Episode: # {{episode.episode_number}} </a></h3>
<div class="text-white mb-3"><span class="text-black-opacity-05">
<small>Presented by Rob Canning <span class="sep">/</span> {{episode.episode_date}} <span class="sep">/</span> {{episode.episode_duration}}</small></span></div>
<p class="mb-4">On this weeks show music from: {{episode.episode_artists}} </p>
<p class="mb-4"><b>On this weeks show music from: {{episode.episode_artists}} </b> </p>
</div>
</div>
@ -164,108 +164,96 @@
</div>
<div class="site-section">
<div class="container" data-aos="fade-up">
<div class="row mb-5">
<div class="col-md-12 text-center">
<h2 class="font-weight-bold text-black">Behind The Mic</h2>
</div>
</div>
<div class="row">
<div class="col-md-6 col-lg-4 mb-5 mb-lg-5">
<div class="team-member">
</div>
<img src="images/rob_canning.jpeg" alt="Image" class="img-fluid">
<!-- <div class="site-section"> -->
<!-- <div class="container" data-aos="fade-up"> -->
<!-- <div class="row mb-5"> -->
<!-- <div class="col-md-12 text-center"> -->
<!-- <h2 class="font-weight-bold text-black">Behind The Mic</h2> -->
<!-- </div> -->
<!-- </div> -->
<!-- <div class="row"> -->
<!-- <div class="col-md-6 col-lg-4 mb-5 mb-lg-5"> -->
<!-- <div class="team-member"> -->
<div class="text">
<!-- <img src="images/rob_canning.jpeg" alt="Image" class="img-fluid"> -->
<h2 class="mb-2 font-weight-light h4">Rob Canning</h2>
<span class="d-block mb-2 text-white-opacity-05">Creative Director</span>
<p class="mb-4">Lorem ipsum dolor sit amet consectetur adipisicing elit ullam reprehenderit nemo.</p>
<p>
<a href="#" class="text-white p-2"><span class="icon-facebook"></span></a>
<a href="#" class="text-white p-2"><span class="icon-twitter"></span></a>
<a href="#" class="text-white p-2"><span class="icon-linkedin"></span></a>
</p>
</div>
<!-- <div class="text"> -->
</div>
</div>
<!-- <h2 class="mb-2 font-weight-light h4">Rob Canning</h2> -->
<!-- <span class="d-block mb-2 text-white-opacity-05">Creative Director</span> -->
<!-- <p class="mb-4">Lorem ipsum dolor sit amet consectetur adipisicing elit ullam reprehenderit nemo.</p> -->
<!-- <p> -->
<!-- <a href="#" class="text-white p-2"><span class="icon-facebook"></span></a> -->
<!-- <a href="#" class="text-white p-2"><span class="icon-twitter"></span></a> -->
<!-- <a href="#" class="text-white p-2"><span class="icon-linkedin"></span></a> -->
<!-- </p> -->
<!-- </div> -->
<div class="col-md-6 col-lg-4 mb-5 mb-lg-5">
<div class="team-member">
<!-- </div> -->
<!-- </div> -->
<img src="images/person_2.jpg" alt="Image" class="img-fluid">
<div class="text">
<h2 class="mb-2 font-weight-light h4">Brooke Cagle</h2>
<span class="d-block mb-2 text-white-opacity-05">Creative Director</span>
<p class="mb-4">Lorem ipsum dolor sit amet consectetur adipisicing elit ullam reprehenderit nemo.</p>
<p>
<a href="#" class="text-white p-2"><span class="icon-facebook"></span></a>
<a href="#" class="text-white p-2"><span class="icon-twitter"></span></a>
<a href="#" class="text-white p-2"><span class="icon-linkedin"></span></a>
</p>
</div>
</div>
</div>
<!-- </div> -->
<!-- </div> -->
<div class="site-section bg-light block-13">
<div class="container">
<div class="row mb-5">
<div class="col-md-12 text-center">
<h2 class="font-weight-bold text-black">Featured Labels</h2>
</div>
</div>
<div class="nonloop-block-13 owl-carousel">
<!-- <div class="site-section bg-light block-13"> -->
<!-- <div class="container"> -->
<!-- <div class="row mb-5"> -->
<!-- <div class="col-md-12 text-center"> -->
<!-- <h2 class="font-weight-bold text-black">Featured Labels</h2> -->
<!-- </div> -->
<!-- </div> -->
<!-- <div class="nonloop-block-13 owl-carousel"> -->
<div class="text-center p-3 p-md-5 bg-white">
<div class="mb-4">
<img src="images/label_logos/kamizdat.png" alt="Image" class="w-50 mx-auto img-fluid rounded-circle">
</div>
<div class="">
<h3 class="font-weight-light h5">Kamizdat</h3>
<p>Kamizdat is a Slovene free-form boutique netlabel for Creative Commons music by local artists exploring a wide range of genres often packaged in locally-made and unique hand-numbered limited editions.</p>
</div>
</div>
<!-- <div class="text-center p-6 p-md-5 bg-white"> -->
<!-- <div class="mb-4"> -->
<!-- <img src="images/label_logos/kamizdat.png" alt="Image" class="w-50 mx-auto img-fluid rounded-circle"> -->
<!-- </div> -->
<!-- <div class=""> -->
<!-- <h3 class="font-weight-light h5">Kamizdat</h3> -->
<!-- <\!-- <p>Kamizdat is a Slovene free-form boutique netlabel for Creative Commons music by local artists exploring a wide range of genres often packaged in locally-made and unique hand-numbered limited editions.</p> -\-> -->
<!-- </div> -->
<!-- </div> -->
<div class="text-center p-3 p-md-5 bg-white">
<div class="mb-4">
<img src="images/label_logos/sploh.jpeg" alt="Image" class="w-50 mx-auto img-fluid rounded-circle">
</div>
<div class="">
<h3 class="font-weight-light h5">Zavod Sploh</h3>
<p>Sploh (Sound, Performing, Listening, Observing, Hearing) for art production and publishing is engaged in music, performing arts and intermedia arts production, publishing and education. Primarily it is oriented towards developing, staging, establishing and reflecting musical practices that dip a toe in the waters of: improvisation, contemporary composition, and sound/tech experiments. s</p>
</div>
</div>
<!-- <div class="text-center p-6 p-md-5 bg-white"> -->
<!-- <div class="mb-4"> -->
<!-- <img src="images/label_logos/sploh.jpeg" alt="Image" class="w-50 mx-auto img-fluid rounded-circle"> -->
<!-- </div> -->
<!-- <div class=""> -->
<!-- <h3 class="font-weight-light h5">Zavod Sploh</h3> -->
<!-- <\!-- <p>Sploh (Sound, Performing, Listening, Observing, Hearing) for art production and publishing is engaged in music, performing arts and intermedia arts production, publishing and education. Primarily it is oriented towards developing, staging, establishing and reflecting musical practices that dip a toe in the waters of: improvisation, contemporary composition, and sound/tech experiments. s</p> -\-> -->
<!-- </div> -->
<!-- </div> -->
<div class="text-center p-3 p-md-5 bg-white">
<div class="mb-4">
<img src="images/label_logos/terraformer.jpeg" alt="Image" class="w-50 mx-auto img-fluid rounded-circle">
</div>
<div class="">
<h3 class="font-weight-light h5">Terraformer Research Facilities</h3>
<p>Terraformer Research Facilities Label for experimental, drone, ambient, noise improvised music. Velenje, Slovenia.</p>
</div>
</div>
<!-- <div class="text-center p-6 p-md-5 bg-white"> -->
<!-- <div class="mb-4"> -->
<!-- <img src="images/label_logos/terraformer.jpeg" alt="Image" class="w-50 mx-auto img-fluid rounded-circle"> -->
<!-- </div> -->
<!-- <div class=""> -->
<!-- <h3 class="font-weight-light h5">Terraformer Research Facilities</h3> -->
<!-- <\!-- <p>Terraformer Research Facilities Label for experimental, drone, ambient, noise improvised music. Velenje, Slovenia.</p> -\-> -->
<!-- </div> -->
<!-- </div> -->
<div class="text-center p-3 p-md-5 bg-white">
<div class="mb-4">
<img src="images/label_logos/PF.png" alt="Image" class="w-50 mx-auto img-fluid rounded-circle">
</div>
<div class="">
<h3 class="font-weight-light h5">Pharmafabrik Records</h3>
<p>Delivers rare but comprehensive records of experimental, drone, ambient, electronic, and electro-acoustic music.</p>
</div>
</div>
<!-- <div class="text-center p-6 p-md-5 bg-white"> -->
<!-- <div class="mb-4"> -->
<!-- <img src="images/label_logos/PF.png" alt="Image" class="w-50 mx-auto img-fluid rounded-circle"> -->
<!-- </div> -->
<!-- <div class=""> -->
<!-- <h3 class="font-weight-light h5">Pharmafabrik Records</h3> -->
<!-- <\!-- <p>Delivers rare but comprehensive records of experimental, drone, ambient, electronic, and electro-acoustic music.</p> -\-> -->
<!-- </div> -->
<!-- </div> -->
</div>
</div>
</div>
<!-- </div> -->
<!-- </div> -->
<!-- </div> -->
@ -280,43 +268,43 @@
<p>{{about_show}}</p>
</div>
<div class="mb-5">
<h3 class="footer-heading mb-4">Previous Podcast</h3>
<div class="block-25">
<ul class="list-unstyled">
<li class="mb-3">
<a href="#" class="d-flex">
<figure class="image mr-4">
<img src="images/img_1.jpg" alt="" class="img-fluid">
</figure>
<div class="text">
<h3 class="heading font-weight-light">Lorem ipsum dolor sit amet consectetur elit</h3>
</div>
</a>
</li>
<li class="mb-3">
<a href="#" class="d-flex">
<figure class="image mr-4">
<img src="images/img_1.jpg" alt="" class="img-fluid">
</figure>
<div class="text">
<h3 class="heading font-weight-light">Lorem ipsum dolor sit amet consectetur elit</h3>
</div>
</a>
</li>
<li class="mb-3">
<a href="#" class="d-flex">
<figure class="image mr-4">
<img src="images/img_1.jpg" alt="" class="img-fluid">
</figure>
<div class="text">
<h3 class="heading font-weight-light">Lorem ipsum dolor sit amet consectetur elit</h3>
</div>
</a>
</li>
</ul>
</div>
</div>
<!-- <div class="mb-5"> -->
<!-- <h3 class="footer-heading mb-4">Previous Podcast</h3> -->
<!-- <div class="block-25"> -->
<!-- <ul class="list-unstyled"> -->
<!-- <li class="mb-3"> -->
<!-- <a href="#" class="d-flex"> -->
<!-- <figure class="image mr-4"> -->
<!-- <img src="images/img_1.jpg" alt="" class="img-fluid"> -->
<!-- </figure> -->
<!-- <div class="text"> -->
<!-- <h3 class="heading font-weight-light">Lorem ipsum dolor sit amet consectetur elit</h3> -->
<!-- </div> -->
<!-- </a> -->
<!-- </li> -->
<!-- <li class="mb-3"> -->
<!-- <a href="#" class="d-flex"> -->
<!-- <figure class="image mr-4"> -->
<!-- <img src="images/img_1.jpg" alt="" class="img-fluid"> -->
<!-- </figure> -->
<!-- <div class="text"> -->
<!-- <h3 class="heading font-weight-light">Lorem ipsum dolor sit amet consectetur elit</h3> -->
<!-- </div> -->
<!-- </a> -->
<!-- </li> -->
<!-- <li class="mb-3"> -->
<!-- <a href="#" class="d-flex"> -->
<!-- <figure class="image mr-4"> -->
<!-- <img src="images/img_1.jpg" alt="" class="img-fluid"> -->
<!-- </figure> -->
<!-- <div class="text"> -->
<!-- <h3 class="heading font-weight-light">Lorem ipsum dolor sit amet consectetur elit</h3> -->
<!-- </div> -->
<!-- </a> -->
<!-- </li> -->
<!-- </ul> -->
<!-- </div> -->
<!-- </div> -->
</div>
<div class="col-lg-4 mb-5 mb-lg-0">
@ -354,16 +342,16 @@
</div>
<div class="col-lg-4 mb-5 mb-lg-0">
<div class="mb-5">
<h3 class="footer-heading mb-4">Watch Video</h3>
<!-- <div class="col-lg-4 mb-5 mb-lg-0"> -->
<!-- <div class="mb-5"> -->
<!-- <h3 class="footer-heading mb-4">Watch Video</h3> -->
<div class="block-16">
<figure>
<img src="images/img_1.jpg" alt="Image placeholder" class="img-fluid rounded">
<a href="https://vimeo.com/channels/staffpicks/93951774" class="play-button popup-vimeo"><span class="icon-play"></span></a>
</figure>
</div>
<!-- <div class="block-16"> -->
<!-- <figure> -->
<!-- <img src="images/img_1.jpg" alt="Image placeholder" class="img-fluid rounded"> -->
<!-- <a href="https://vimeo.com/channels/staffpicks/93951774" class="play-button popup-vimeo"><span class="icon-play"></span></a> -->
<!-- </figure> -->
<!-- </div> -->
</div>

View File

@ -12,6 +12,7 @@ import uuid
#import pypika # sql query builder
from pypika import Query, Table, Field, Column
music_library_path = "/home/rob/antena/music/"
conn = sqlite3.connect("database/show.db")
@ -22,7 +23,7 @@ labelnames = [("sploh", "https://sploh.bandcamp.com"), ("terraformer"), ("pharam
mus_lib = Query \
.create_table("MUSIC_LIBRARY") \
.columns(
Column("id", "INT", nullable=True),
Column("id", "VARCHAR(32)", nullable=False),
Column("label", "VARCHAR(100)", nullable=True),
Column("album", "VARCHAR(100)", nullable=True),
Column("track", "VARCHAR(200)", nullable=True),
@ -34,8 +35,8 @@ mus_lib = Query \
Column("path", "VARCHAR(120)", nullable=False),
Column("lastplay", "DATETINE", nullable=True),
Column("comment", "VARCHAR(120)", nullable=True))\
.unique("path") \
.primary_key("path")
.unique("id") \
.primary_key("id")
def database_create(conn):
# the MUSIC LIBRARY TABLE
@ -43,6 +44,22 @@ def database_create(conn):
conn.execute(str(mus_lib))
print('''MUSIC LIBRARY Table created successfully''');
print('''
''');
def database_create_episodes_table(conn):
# the show database
@ -51,6 +68,7 @@ def database_create_episodes_table(conn):
.columns(
Column("id", "INT", nullable=True),
Column("episode", "INT", nullable=True),
Column("track_number", "INT", nullable=True),
Column("date", 'DATETIME', nullable=True),
Column("album", "VARCHAR(200)", nullable=True),
Column("track", "VARCHAR(120)", nullable=True),
@ -61,8 +79,9 @@ def database_create_episodes_table(conn):
Column("path", "VARCHAR(120)", nullable=False),
Column("label", "VARCHAR(120)", nullable=False),
Column("comment", "VARCHAR(120)", nullable=False))\
.unique("path") \
.primary_key("path")
.unique("id") \
.primary_key("id")
#TODO get the unique path back into action find bug
conn.execute(str(q))
@ -84,7 +103,8 @@ def mk_db_entry(conn):
track = TinyTag.get(os.path.join(subdir, file))# get metadata from file
cursor = conn.cursor()
mus_lib = Table('MUSIC_LIBRARY')
q = mus_lib.insert(1, label, track.album, track.title, track.artist, \
id = str(uuid.uuid4())
q = mus_lib.insert(id, label, track.album, track.title, track.artist, \
track.genre, track.duration, track.year, \
label_url, str(filepath), 1970-1-1, track.comment)
cursor.execute(str(q));

View File

@ -8,6 +8,7 @@ from os.path import join
from tinytag import TinyTag
from random import shuffle
import sqlite3, json
import subprocess
import uuid
from pypika import Query, Table, Field, Column
@ -52,28 +53,80 @@ def create_intro(episode_playlist):
intro = random.choice(os.listdir(intropath))
episode_playlist.insert(0, str(os.path.abspath(intropath)) + "/" + str(intro))
def add_to_tracks_played(add_to_played: str):
with open('playlists/track_playout_history.txt', "a") as tracks_played_file:
tracks_played_file.write(str(add_to_played) + "\n") # newline \n needed here?
# TODO make this go away....
#def add_to_tracks_played(add_to_played: str):
# with open('playlists/track_playout_history.txt', "a") as tracks_played_file:
# tracks_played_file.write(str(add_to_played) + "\n") # newline \n needed here?
#TODO replace the below with database stuff
def check_archive(track):
global archive
cursor = conn.cursor()
cursor.execute("SELECT * FROM EPISODES WHERE path = ?", (track,))
data=cursor.fetchone()
if data is None:
print('')
#print('There is no component named ?', [track])
else:
print('Component ? found with rowid ? /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////', [track, data[0]])
with open('playlists/track_playout_history.txt') as archive_file:
for line in archive_file:
archive.append(line)
if track not in archive:
print("____ TRACK NOT YET PLAYED ... ADDING _____")
#print("____ TRACK NOT YET PLAYED ... ADDING _____")
return True
else:
print("____ TRACK ALREADY PLAYED _____")
#print("____ TRACK ALREADY PLAYED _____")
return False
def playlist_replace_track(conn, episode_playlist, episode_number, track_to_replace):
cursor = conn.cursor()
cursor.execute("SELECT * FROM MUSIC_LIBRARY ORDER BY RANDOM() LIMIT 1 ;")
r = cursor.fetchone() # FETCH ONE RANDOM TRACK FROM THE DATABASE
print('new suggestion================================' + str(r))
# 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 = song #'/'.join(song.split('/')[0:-1])
track_comment = str(r[11])
e = Table('EPISODES')
# TODO This is not replace at the desired index / row but appending to the end of the table
q = e.insert(1, episode_number, track_to_replace, episode_date,\
track_album, track_title, track_artist, \
track_duration,track_genre, track_year, \
track_path, track_label, track_comment).where('e.track_number'==1)('e.episode'==1)
cursor.execute(str(q))
conn.commit()
print("sqlite: Episode track successfully updated into SHOW table");
#cursor = conn.cursor()
#cursor.execute('INSERT OR REPLACE FROM EPISODES WHERE EPISODE=? and track_number=?', [episode_number, track_to_replace])
#preview = cursor.fetchall()
#for i in preview:
# print('{0} : {1} {2} {3} {4} \n'.format(i[2], i[4], i[5], i[6], i[7],))
def create_episode_playlist(conn, episode_playlist: list, episode_number):
global episode_duration
episode_duration = 0
global archive
track_number = 0
track_count = 0
global artists_played
max_track_dur = 9
@ -81,7 +134,7 @@ def create_episode_playlist(conn, episode_playlist: list, episode_number):
# first clear the sqlite table rows for the episode
cursor = conn.cursor()
cursor.execute('DELETE FROM episodes WHERE episode = {0}'.format(episode_number))
cursor.execute('DELETE FROM EPISODES WHERE episode = {0}'.format(episode_number))
# TODO what is most important 12 tracks or 60 minutes
@ -89,7 +142,6 @@ def create_episode_playlist(conn, episode_playlist: list, episode_number):
cursor.execute("SELECT * FROM MUSIC_LIBRARY ORDER BY RANDOM() LIMIT 1 ;")
r = cursor.fetchone() # FETCH ONE RANDOM TRACK FROM THE DATABASE
# for t in r:
song = str(r[9])
track_label = str(r[1])
@ -101,11 +153,12 @@ def create_episode_playlist(conn, episode_playlist: list, episode_number):
track_year = str(r[7])
track_path = song #'/'.join(song.split('/')[0:-1])
track_comment = str(r[11])
# 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 check_archive(track_path) 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
@ -115,39 +168,86 @@ def create_episode_playlist(conn, episode_playlist: list, episode_number):
art = string=re.sub("and","&",art)
artist_abreviated.append(art)
artists_played.append(track_artist) # and add the artist to the played list
add_to_tracks_played(track_title) # and write entry to archive file
#add_to_tracks_played(track_path) # and write entry to archive file
if not track_year: # where missing metadata give a dummy value
track_year = 0000
track_year = "0000"
e = Table('EPISODES')
q = e.insert(1, episode_number, episode_date, \
track_number = track_count
id = str(uuid.uuid4())
q = e.insert(id, episode_number, track_number, episode_date,\
track_album, track_title, track_artist, \
track_duration,track_genre, track_year, \
track_path, track_label, track_comment)
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");
# print("sqlite: Episode track successfully inserted into SHOW table");
track_count += 1; print(track_count)
track_count += 1;
episode_duration = episode_duration + track_duration
else: print("TRACK TOO SHORT..........." )
else: print("TRACK TOO LONG..........." )
else: print("SONG PLAYED IN PREVIOUS EPISODE" )
else: print("ARTIST ALREADY IN PODCAST")
# else: print("TRACK TOO SHORT..........." )
# else: print("TRACK TOO LONG..........." )
# else: print("SONG PLAYED IN PREVIOUS EPISODE" )
#else: print("ARTIST ALREADY IN PODCAST")
#
episode_duration = timedelta(seconds=round(episode_duration))
#TODO am i happy with track selection? change an entry ? add a specific entry? to replace
# preview and modify option -TODO move to its own function
cursor = conn.cursor()
cursor.execute('SELECT * FROM EPISODES WHERE EPISODE=?', [episode_number])
preview = cursor.fetchall()
print("/////////////////////////////////////////////////")
for i in preview:
print('{0} : {1} {2} {3} {4}'.format(i[2], i[4], i[5], i[6], i[7],))
print("total tracks = {0} \n total duration = {1} ".format(track_count, episode_duration))
dj_is_unsure=True
cursor = conn.cursor()
if dj_is_unsure:
user_input = input("nice playlist? [y to proceed, anything else to suggest new] :")
if user_input == 'y':
print("action")
create_episode_playlist(conn, episode_playlist, episode_number)
elif user_input == 'p':
# preview a track --------------------------------------
preview_track = input("which track would you like to preview [0-12]:")
cursor.execute('SELECT path FROM EPISODES WHERE EPISODE=? AND track_number=?', [episode_number, preview_track ])
preview_track_path = cursor.fetchone()[0]
print(preview_track_path)
#os.system("mplayer '{0}' &".format(preview_track_path))
subprocess.Popen(["nohup mplayer '{0}' &".format(preview_track_path)], shell=True)
#Popen.run("mplayer '{0}' &".format(preview_track_path))
track_previewed = input("track OK? :")
if track_previewed == 'y':
print("ok groovy choice then...")
else:
input("do the db replace logic")
playlist_replace_track(conn, episode_playlist, episode_number, preview_track)
else:
print("Goodbye happy dj")
return user_input
def modify_playlist(conn, episode_playlist, episode_number):
cursor = conn.cursor()
cursor.execute('SELECT * FROM EPISODES WHERE EPISODE=?', [episode_number])
preview = cursor.fetchall()
for i in preview:
print('{0} : {1} {2} {3} {4} \n'.format(i[2], i[4], i[5], i[6], i[7],))
# episode_duration = timedelta(seconds=round(episode_duration))
# print("Total Tracks = {0} \nTotal Duration = {1}".format(track_count, episode_duration))
return episode_playlist, episode_duration
def combine_images(columns, space, images, variants:int):
global show_cover
@ -227,8 +327,9 @@ def combine_images(columns, space, images, variants:int):
im.text((1540,1888), ''' http://{0}.rizom.si '''\
.format(show_name, episode_date,episode_number), fill="white", font=mf_h4)
show_cover = 'img/cover.png'.format(episode_number,episode_date, variants)
show_cover = 'img/cover{2}.png'.format(episode_number,episode_date, variants)
background.save("html/" + "episode/{0}/{1}".format(episode_number, show_cover))
#convert -delay 100 -loop 0 html/episode/2/img/show_cover_2024-01-12* animatedGIF.gif
return show_cover
def create_show_coverart(episode_playlist, variants):
@ -276,10 +377,6 @@ def create_animated_gif():
img.save(fp=fp_out, format='GIF', append_images=imgs,
save_all=True, duration=200, loop=0)
def create_pls_file():
# write the selection as a playlist file
with open("shows/antena_playlist_" + episode_date + ".pls","w") as file:
file.writelines("\n".join(episode_playlist))
def create_podcast(episode_playlist: list):
@ -396,7 +493,8 @@ def create_html_homepage_from_template(episode_playlist):
episodes.append(an_episode)
episodes = reversed(episodes[1:episode_number])
# reversed order to most recent episode appears first in list
cursor = conn.cursor()
cursor.execute('SELECT * FROM EPISODES WHERE episode=?', [episode_number])
r = cursor.fetchall()
@ -404,24 +502,25 @@ def create_html_homepage_from_template(episode_playlist):
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_duration = float(t[6])
track_genre = str(t[7])
track_year = str(t[8])
track_number = str(t[2])
track_album = str(t[3])
track_title = str(t[4])
track_artist = str(t[5])
track_duration = float(t[7])
track_genre = str(t[8])
track_year = str(t[9])
detail = str(track_artist) + " | " + str(track_album) + \
" | " + str(track_title) + " | " + str(track_year) + \
" | " + str(timedelta(seconds=round(track_duration)))
show_info.append("" + detail)
#TODO remove single quptes not working in episode_artists
output_from_parsed_template = homepage_template.render(\
show_name=''.join(random.choice((str.upper,str.lower))(x) for x in show_name), \
episodes=episodes, episode_author="Rob Canning",\
episode_duration=episode_duration, episode_number=episode_number, \
episode_artists=episode_artists[episode_number], \
about_show=show_short_description, episode_playlist=show_info, \
episode_artists=str(episode_artists[episode_number]).strip("[").strip("]").strip("\'").strip("'"), \
about_show=show_short_description, episode_playlist=episode_playlist, \
episode_image="episode/{0}/img/cover.png".format(episode_number))
with open("html/index.html".format(episode_number), "w") as episode_page:
@ -441,35 +540,35 @@ def create_html_episode_from_template(episode_playlist, episode_number):
# maybe a jinja2 template loop here instead
cursor = conn.cursor()
e = Table('EPISODES')
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])
#cursor.execute(str(q))
r = cursor.fetchall()
for t in r:
song = str(t[0])
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[7])
track_year = str(t[8])
track_label = str(t[10])
track_comment = str(t[11])
track_number = str(t[2])
track_album = str(t[4])
track_title = str(t[5])
track_artist = str(t[6]).upper()
track_duration = float(t[7])
track_genre = str(t[8])
track_year = str(t[9])
track_label = str(t[11])
track_comment = str(t[12])
detail = str(track_artist) + " | " + str(track_album) + \
" | " + str(track_title) + " | " + str(track_year) + \
" | " + str(timedelta(seconds=round(track_duration)))
playlist_entry = [track_title, track_artist, track_album, track_year, timedelta(seconds=round(track_duration)), track_label.upper() ]
playlist_entry = [track_number, track_title, track_artist, track_album, track_year, timedelta(seconds=round(track_duration)), track_label.upper() ]
playlist_table.append(playlist_entry)
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_number=episode_number, episode_duration=episode_duration, \
@ -487,39 +586,43 @@ def create_RSS_XML_from_template():
env = Environment(loader=FileSystemLoader('html/templates'))
rss_template = env.get_template('show_RSS.jinja.xml')
output_from_parsed_template = rss_template.render(\
show_name=show_name, \
episode_number=int(episode_number), episode_author="Rob Canning",\
episode_duration=episode_duration, about_show=show_short_description, \
episode_image="img/cover.png".format(episode_number))
output_from_parsed_template = \
rss_template.render(\
show_name=show_name, \
episode_number=int(episode_number), episode_author="Rob Canning",\
episode_duration=episode_duration, about_show=show_short_description, \
episode_image="img/cover.png".format(episode_number))
with open("html/show_rss.xml".format(episode_number), "w") as rss_page:
rss_page.write(output_from_parsed_template)
def main():
# database_create_episodes_table()
set_episode_date(input_date)
# while create_episode_playlist(conn, episode_playlist, episode_number) != 'y':
# create_episode_playlist(conn, episode_playlist, episode_number)
create_episode_playlist(conn, episode_playlist, episode_number)
create_show_coverart(episode_playlist, 1) #episode_duration = 100
# modify_playlist(conn, episode_playlist, episode_number)
create_show_coverart(episode_playlist, 4) #episode_duration = 100
#create_animated_gif()
create_intro(episode_playlist)
create_pls_file()
create_html_episode_from_template(episode_playlist, episode_number)
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
#

View File

@ -1,13 +0,0 @@
YuWrong
Action XIV
things i decided against
Domen Gnezda - Misnomer II - 02 Misnomer 24
Crushing Trauma
Nicholas Cage
The Great White Buffalo
Integral [Excerpt]
Slika 4
Tomaž Grom - Sam, za... - 05 G.V.
Styröfoam - Moonmiles
The Oppressed 1 (Outtake)