jinja2 added for web creation

main
Rob Canning 2024-01-14 02:56:15 +01:00
parent 3360165010
commit 795a25451b
6 changed files with 1749 additions and 1372 deletions

View File

@ -1,29 +0,0 @@
<html>
<head>
<title> SHOW INFO </title>
</head>
<body> <h1>Inside the with open: 2024-01-11 </h1>
<h2>"Show info for: THE AND IF #2 release date: 2024-01-11 </h2>
<img src="../html/img/show_cover_2024-01-11.png" alt="podcast cover of the week" width="700" height="700">
<h3>Total Playtime excluding fills: 1:01:07 </h3>
ARTIST | ALBUM | TRACK | YEAR | DURATION
<p>Lifecutter | Sub Persona | Sub Persona IV | 2020 | 0:03:52</p>
<p>Warrego Valles | Botox | 5000000000 YRS | 2018 | 0:05:04</p>
<p>Vomir | Bora Scura Reimagined | Action XIX | 2021 | 0:06:15</p>
<p>Delta-Sleep-Inducing Peptide | Oscillopsia | Constant Negation | 2014 | 0:06:58</p>
<p>Luka Prinčič | Antigone/Child | Chorus 1 (SC) | 2018 | 0:05:41</p>
<p>Gašper Torkar | Dreams of Others EP | Rib Vaulting | 2017 | 0:06:22</p>
<p>Zergon | Access Frame: Equity | Altobar | 2020 | 0:05:19</p>
<p>Lhetargija | Raganas Mācekle | Vorspiel fur Traurige Madchen | 2021 | 0:04:00</p>
<p>Irena Tomažin | Taste Of Silence | Soloveikia Moj | 2014 | 0:03:05</p>
<p>Jošt Drašler | The Balloon Catcher | Jošt Drašler - The Balloon Catcher - 09 Grandma Balloon | None | 0:04:26</p>
<p>Shekuza | De Sica | Nebulae Tree | 2019 | 0:03:55</p>
<p>rouge-ah | bare | conversation suppresed | 2018 | 0:06:11</p>
<hr>
<p>For more information on the artists or to buy thier albums visit their bandcamp page. </p>" +"
</body></html>

View File

@ -0,0 +1,340 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>{{show_name}}</title>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Poppins:200,300,400,700,900">
<link rel="stylesheet" href="fonts/icomoon/style.css">
<link rel="stylesheet" href="css/bootstrap.min.css">
<link rel="stylesheet" href="css/magnific-popup.css">
<link rel="stylesheet" href="css/jquery-ui.css">
<link rel="stylesheet" href="css/owl.carousel.min.css">
<link rel="stylesheet" href="css/owl.theme.default.min.css">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/mediaelement@4.2.7/build/mediaelementplayer.min.css">
<link rel="stylesheet" href="css/aos.css">
<link rel="stylesheet" href="css/style.css">
</head>
<body>
<div class="site-wrap">
<div class="site-mobile-menu">
<div class="site-mobile-menu-header">
<div class="site-mobile-menu-close mt-3">
<span class="icon-close2 js-menu-toggle"></span>
</div>
</div>
<div class="site-mobile-menu-body"></div>
</div>
<header class="site-navbar py-4 absolute transparent" role="banner">
<div class="container">
<div class="row align-items-center">
<div class="col-3" data-aos="fade-down">
<h1><a href="index.html" class="text-white h2">{{show_name}}</a></h1>
</div>
<div class="col-9" data-aos="fade-down">
<nav class="site-navigation position-relative text-right text-md-right" role="navigation">
<div class="d-inline-block ml-md-0 mr-auto py-3"><a href="#" class="site-menu-toggle js-menu-toggle text-white"><span class="icon-menu h3"></span></a></div>
<ul class="site-menu js-clone-nav d-none">
<li class="has-children">
<a href="index.html">Home</a>
<ul class="dropdown arrow-top">
<li><a href="#">Menu One</a></li>
<li><a href="#">Menu Two</a></li>
<li><a href="#">Menu Three</a></li>
<li class="has-children">
<a href="#">Sub Menu</a>
<ul class="dropdown">
<li><a href="#">Menu One</a></li>
<li><a href="#">Menu Two</a></li>
<li><a href="#">Menu Three</a></li>
</ul>
</li>
</ul>
</li>
<li class="has-children">
<a href="#">Dropdown</a>
<ul class="dropdown arrow-top">
<li><a href="#">Menu One</a></li>
<li><a href="#">Menu Two</a></li>
<li><a href="#">Menu Three</a></li>
</ul>
</li>
<li class="active"><a href="about.html">About</a></li>
<li><a href="contact.html">Contact</a></li>
</ul>
</nav>
</div>
</div>
</div>
</header>
<div class="site-blocks-cover overlay inner-page-cover" style="background-image: url({{episode_image}});" data-aos="fade" data-stellar-background-ratio="0.5">
<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">{{episode_title}}</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>
</div>
</div>
<div class="container site-section">
<div class="player mb-5">
<audio id="player2" preload="none" controls style="max-width: 100%">
<source src="{{episode_audio}}" type="audio/mp3">
</audio>
</div>
<div class="row justify-content-center">
<div class="col-md-7">
{{episode_playlist}}
</div>
</div>
</div>
<div class="site-section bg-light">
<div class="container">
<div class="row mb-5">
<div class="col-md-12 text-center">
<h2 class="font-weight-bold text-black">Related Podcasts</h2>
</div>
</div>
<div class="row">
<div class="col-md-6">
<div class="d-block podcast-entry bg-white mb-5" data-aos="fade-up">
<div class="image w-100" style="height: 300px; background-image: url('images/img_2.jpg');"></div>
<div class="text w-100">
<h3 class="font-weight-light"><a href="single-post.html">Episode 07: How To Create Web Page Using Bootstrap 4</a></h3>
<div class="text-white mb-3"><span class="text-black-opacity-05"><small>By Mike Smith <span class="sep">/</span> 16 September 2017 <span class="sep">/</span> 1:30:20</small></span></div>
<p class="mb-4">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Corrupti repellat mollitia consequatur, optio nesciunt placeat. Iste voluptates excepturi tenetur, nesciunt.</p>
<div class="player">
<audio id="player2" preload="none" controls style="max-width: 100%">
<source src="http://www.largesound.com/ashborytour/sound/AshboryBYU.mp3" type="audio/mp3">
</audio>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="d-block podcast-entry bg-white mb-5" data-aos="fade-up">
<div class="image w-100" style="height: 300px; background-image: url('images/img_3.jpg');"></div>
<div class="text w-100">
<h3 class="font-weight-light"><a href="single-post.html">Episode 07: How To Create Web Page Using Bootstrap 4</a></h3>
<div class="text-white mb-3"><span class="text-black-opacity-05"><small>By Mike Smith <span class="sep">/</span> 16 September 2017 <span class="sep">/</span> 1:30:20</small></span></div>
<p class="mb-4">Lorem ipsum dolor sit amet, consectetur adipisicing elit. Corrupti repellat mollitia consequatur, optio nesciunt placeat. Iste voluptates excepturi tenetur, nesciunt.</p>
<div class="player">
<audio id="player2" preload="none" controls style="max-width: 100%">
<source src="http://www.largesound.com/ashborytour/sound/AshboryBYU.mp3" type="audio/mp3">
</audio>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<footer class="site-footer border-top">
<div class="container">
<div class="row">
<div class="col-lg-4">
<div class="mb-5">
<h3 class="footer-heading mb-4">{{about_show}}</h3>
<p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Saepe pariatur reprehenderit vero atque, consequatur id ratione, et non dignissimos culpa? Ut veritatis, quos illum totam quis blanditiis, minima minus odio!</p>
</div>
<div class="mb-5">
<h3 class="footer-heading mb-4">Recent 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">
<div class="row mb-5">
<div class="col-md-12">
<h3 class="footer-heading mb-4">Quick Menu</h3>
</div>
<div class="col-md-6 col-lg-6">
<ul class="list-unstyled">
<li><a href="#">Home</a></li>
<li><a href="#">Matches</a></li>
<li><a href="#">News</a></li>
<li><a href="#">Team</a></li>
</ul>
</div>
<div class="col-md-6 col-lg-6">
<ul class="list-unstyled">
<li><a href="#">About Us</a></li>
<li><a href="#">Privacy Policy</a></li>
<li><a href="#">Contact Us</a></li>
<li><a href="#">Membership</a></li>
</ul>
</div>
</div>
<div class="row">
<div class="col-md-12">
<h3 class="footer-heading mb-4">Follow Us</h3>
<div>
<a href="#" class="pl-0 pr-3"><span class="icon-facebook"></span></a>
<a href="#" class="pl-3 pr-3"><span class="icon-twitter"></span></a>
<a href="#" class="pl-3 pr-3"><span class="icon-instagram"></span></a>
<a href="#" class="pl-3 pr-3"><span class="icon-linkedin"></span></a>
</div>
</div>
</div>
</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="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>
<div class="mb-5">
<h3 class="footer-heading mb-2">Subscribe Newsletter</h3>
<p>Lorem ipsum dolor sit amet consectetur adipisicing elit minima minus odio.</p>
<form action="#" method="post">
<div class="input-group mb-3">
<input type="text" class="form-control border-secondary text-white bg-transparent" placeholder="Enter Email" aria-label="Enter Email" aria-describedby="button-addon2">
<div class="input-group-append">
<button class="btn btn-primary" type="button" id="button-addon2">Send</button>
</div>
</div>
</form>
</div>
</div>
</div>
<div class="row pt-5 mt-5 text-center">
<div class="col-md-12">
<p>
<!-- Link back to Colorlib can't be removed. Template is licensed under CC BY 3.0. -->
Copyright &copy;<script data-cfasync="false" src="/cdn-cgi/scripts/5c5dd728/cloudflare-static/email-decode.min.js"></script><script>document.write(new Date().getFullYear());</script> All rights reserved | This template is made with <i class="icon-heart-o" aria-hidden="true"></i> by <a href="https://colorlib.com" target="_blank" >Colorlib</a>
<!-- Link back to Colorlib can't be removed. Template is licensed under CC BY 3.0. -->
</p>
</div>
</div>
</div>
</footer>
</div>
<script src="js/jquery-3.3.1.min.js"></script>
<script src="js/jquery-migrate-3.0.1.min.js"></script>
<script src="js/jquery-ui.js"></script>
<script src="js/popper.min.js"></script>
<script src="js/bootstrap.min.js"></script>
<script src="js/owl.carousel.min.js"></script>
<script src="js/jquery.stellar.min.js"></script>
<script src="js/jquery.countdown.min.js"></script>
<script src="js/jquery.magnific-popup.min.js"></script>
<script src="js/aos.js"></script>
<script src="js/mediaelement-and-player.min.js"></script>
<script>
document.addEventListener('DOMContentLoaded', function() {
var mediaElements = document.querySelectorAll('video, audio'), total = mediaElements.length;
for (var i = 0; i < total; i++) {
new MediaElementPlayer(mediaElements[i], {
pluginPath: 'https://cdn.jsdelivr.net/npm/mediaelement@4.2.7/build/',
shimScriptAccess: 'always',
success: function () {
var target = document.body.querySelectorAll('.player'), targetTotal = target.length;
for (var j = 0; j < targetTotal; j++) {
target[j].style.visibility = 'visible';
}
}
});
}
});
</script>
<script src="js/main.js"></script>
</body>
</html>

View File

@ -1,27 +1,35 @@
#!/usr/bin/python3 #!/usr/bin/python3
import os, fnmatch, glob, random, time, pathlib, re import sys, os, datetime, fnmatch, glob, random, time, pathlib, re
from datetime import timedelta
from os.path import join from os.path import join
from tinytag import TinyTag from tinytag import TinyTag
import datetime
#import skimage.uti
#import skimage.util
from datetime import timedelta
from random import shuffle from random import shuffle
import sqlite3
from mk_web import *
con = sqlite3.connect("music.db")
DATE = datetime.datetime.now().strftime("%Y-%m-%d") DATE = datetime.datetime.now().strftime("%Y-%m-%d")
total_show_duration = 0 total_show_dur = 0
complete_playlist = [] complete_playlist = []
show_array = [] show_array = []
show_cover = "" show_cover = ""
archive = [] archive = []
artist_played = [] artists_played = []
artist_abreviated = [] artist_abreviated = []
episode_number = "0" episode_number = sys.argv[1]
show_name = "THE AND IF"
show_name = "SHOWNAME" # OBED
path = "/home/rob/antena/" path = "/home/rob/antena/"
web_path = "/home/rob/antena/html/episode/{0}/img".format(episode_number)
if os.path.exists(web_path):
print("path_exists_doing_nothing")
else: os.makedirs(web_path)
# ///////////////////////////////////////////////// # /////////////////////////////////////////////////
@ -31,9 +39,8 @@ def create_intro(show_array):
show_array.insert(0, str(os.path.abspath(intropath)) + "/" + str(intro)) show_array.insert(0, str(os.path.abspath(intropath)) + "/" + str(intro))
def add_to_tracks_played(add_to_played: str): def add_to_tracks_played(add_to_played: str):
#global complete_tracks_played
with open('playlists/track_playout_history.txt', "a") as tracks_played_file: with open('playlists/track_playout_history.txt', "a") as tracks_played_file:
tracks_played_file.write(add_to_played + "\n") tracks_played_file.write(str(add_to_played) + "\n") # newline \n needed here?
def check_archive(track): def check_archive(track):
global archive global archive
@ -51,55 +58,60 @@ def load_all_music():
with open('playlists/complete_music_archive.pls') as playlist_file: with open('playlists/complete_music_archive.pls') as playlist_file:
for line in playlist_file: for line in playlist_file:
complete_playlist.append(line) complete_playlist.append(line)
print("loaded %s".format(str(len(complete_playlist)))) print('''
-------------------------------
loaded {0} tracks from playlist
-------------------------------
'''.format(str(len(complete_playlist))))
return complete_playlist return complete_playlist
def create_show_playlist(show_array: list, complete_playlist:list): def create_show_playlist(show_array: list, complete_playlist:list):
load_all_music() load_all_music()
global total_show_duration global total_show_dur
global archive global archive
track_count = 0 track_count = 0
global artist_played global artists_played
max_track_dur = 8 max_track_dur = 10
min_track_dur = 3 min_track_dur = 1.8
while total_show_duration < 60 * 55: while total_show_dur < 60 * 60 and track_count < 12 :
song = random.choice(random.sample(\ song = random.choice(random.sample(\
complete_playlist, len(complete_playlist) )).rstrip() # pick a song complete_playlist, len(complete_playlist) )).rstrip() # pick a song
track = TinyTag.get(song) # get its metadata track = TinyTag.get(song) # get its metadata
# check if the artist not in the played list and the song is less than 8mins # check if the artist not in the played list and the song is less than 8mins
if track.artist not in artist_played: if track.artist not in artists_played:
if check_archive(track.title) is True: if check_archive(track.title) is True:
if int(track.duration) > min_track_dur * 60: if int(track.duration) > min_track_dur * 60:
if int(track.duration) < max_track_dur * 60: if int(track.duration) < max_track_dur * 60:
show_array.append(song.rstrip()) # if 'not in' is true then add the song show_array.append(song.rstrip()) # if 'not in' is true then add the song
art = string=re.sub("\(.*?\)","",track.artist) art = string=re.sub("\(.*?\)","",track.artist)
# 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) # and add the artist to the played list artist_abreviated.append(art)
artist_played.append(track.artist) # and add the artist to the played list 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.title) # and write entry to archive file
track_count += 1 track_count += 1; print(track_count)
total_show_duration = total_show_duration + track.duration total_show_dur = total_show_dur + track.duration
else: print("TRACK TOO SHORT..........." ) else: print("TRACK TOO SHORT..........." )
else: print("TRACK TOO LONG..........." ) else: print("TRACK TOO LONG..........." )
else: print("SONG PLAYED IN PREVIOUS EPISODE" ) else: print("SONG PLAYED IN PREVIOUS EPISODE" )
else: print("ARTIST ALREADY IN PODCAST") else: print("ARTIST ALREADY IN PODCAST")
total_show_duration = timedelta(seconds=round(total_show_duration)) total_show_dur = timedelta(seconds=round(total_show_dur))
show_array = list(set(show_array))
print("total tracks = " + str(track_count)) print("total tracks = {0} \n total duration = {1} ".format(track_count, total_show_dur))
print("total duration = " + str(total_show_duration))
print(' \n\n\n SHOW ARRAY: \n {0} \n '.format) return show_array, total_show_dur
return show_array, total_show_duration
def combine_images(columns, space, images, variants:int):
global show_cover
def combine_images(columns, space, images):
from PIL import Image from PIL import Image
from PIL import ImageDraw from PIL import ImageDraw
from PIL import ImageFont from PIL import ImageFont
global show_cover
rows = len(images) // columns rows = len(images) // columns
if len(images) % columns: if len(images) % columns:
@ -129,42 +141,56 @@ def combine_images(columns, space, images):
im = ImageDraw.Draw(background) im = ImageDraw.Draw(background)
mf_h1 = ImageFont.truetype('fonts/Antonio-Light.ttf', 280) mf_h1 = ImageFont.truetype('fonts/Antonio-Light.ttf', 280)
mf_h2 = ImageFont.truetype('fonts/Antonio-Light.ttf', 70) mf_h2 = ImageFont.truetype('fonts/Antonio-Light.ttf', 65)
mf_h3 = ImageFont.truetype('fonts/Antonio-Regular.ttf', 50) mf_h3 = ImageFont.truetype('fonts/Antonio-Regular.ttf', 50)
mf_h4 = ImageFont.truetype('fonts/Antonio-Light.ttf', 45) mf_h4 = ImageFont.truetype('fonts/Antonio-Light.ttf', 50)
h2_spc = 85 h2_spc = 85
h2_baseline = 1530 h2_baseline = 1530
# Add Text to the image ----------------------------------------
im.text((30,10), '''an eclectic selection of contemporary independent music from slovenia: {0} - E P I S O D E #{1} # Add Text to the image ----------------------------------------
'''\ # -------------------------------------------------------------------
.format(DATE,episode_number), fill="white", font=mf_h3) # some logic to shuffle the list if sub sections of list are too long for layout
im.text((30,280), ''' THIS WEEK ON \n EPISODE #{0} of \n| {1} | SHOW'''\ str_length_thresh = 50
.format(episode_number, show_name), fill="white", font=mf_h1, stroke_width=2, stroke_fill='black') while \
im.text((30, h2_baseline + (h2_spc*1) ), '''m u s i c _ f r o m _ : {0}'''\ [len(s) for s in [''.join(artist_abreviated[0:3])]][0] > str_length_thresh or\
.format(' | '.join(artist_abreviated[0:3])), (255,255,255), font=mf_h2) [len(s) for s in [''.join(artist_abreviated[3:6])]][0] > str_length_thresh or\
im.text((30, h2_baseline + (h2_spc*2) ), "{0}"\ [len(s) for s in [''.join(artist_abreviated[6:9])]][0] > str_length_thresh or \
.format(' | '.join(artist_abreviated[3:6])), (255,255,255), font=mf_h2) [len(s) for s in [''.join(artist_abreviated[9:12])]][0] > str_length_thresh:
im.text((30, h2_baseline + (h2_spc*3)), "{0}"\ print("on of the lines is longer than fits the page... shuffling the list for a better look")
.format(' | '.join(artist_abreviated[6:9])), (255,255,255), font=mf_h2) random.shuffle(artist_abreviated)
im.text((30, h2_baseline + (h2_spc*4)), "{0}"\
.format(' | '.join(artist_abreviated[9:12])), (255,255,255), font=mf_h2)
im.text((1500,1905), ''' http://showname.rizom.si '''\
.format(DATE,episode_number), fill="white", font=mf_h4)
# shorten verbose artist names such as trojnik Trojnik (Cene Resnik, Tomaž Grom, Vid Drašler)
# TiTiTi (Jure Boršič, Jošt Drašler, Vid Drašler)
show_cover = 'html/img/show_cover_{0}.png'.format(DATE)
background.save(show_cover)
def create_show_coverart():
global show_array im.text((30,10), '''an eclectic selection of contemporary independent music from slovenia: {0} - E P I S O D E #{1}
print(show_array) '''\
.format(DATE,episode_number), fill="white", font=mf_h3)
im.text((30,280), ''' THIS WEEK ON \n EPISODE #{0} of \n {1}!'''.upper()\
.format(episode_number, show_name), fill="white", font=mf_h1, stroke_width=2, stroke_fill='black')
im.text((30, h2_baseline + (h2_spc*1) ), '''m u s i c _ f r o m _ : {0}'''\
.format(' | '.join(artist_abreviated[0:3])), (255,255,255), font=mf_h2)
im.text((30, h2_baseline + (h2_spc*2) ), "{0}"\
.format(' | '.join(artist_abreviated[3:6])), (255,255,255), font=mf_h2)
im.text((30, h2_baseline + (h2_spc*3)), "{0}"\
.format(' | '.join(artist_abreviated[6:9])), (255,255,255), font=mf_h2)
im.text((30, h2_baseline + (h2_spc*4)), "{0}"\
.format(' | '.join(artist_abreviated[9:12])), (255,255,255), font=mf_h2)
im.text((1560,1888), ''' http://{0}.rizom.si '''\
.format(show_name, DATE,episode_number), fill="white", font=mf_h4)
# TiTiTi (Jure Boršič, Jošt Drašler, Vid Drašler)
show_cover = 'img/cover.png'.format(episode_number,DATE, variants)
#pathlib.Path.touch(show_cover)
background.save("html/" + "episode/{0}/{1}".format(episode_number, show_cover))
return show_cover
def create_show_coverart(show_array, variants):
# global show_array
#print(show_array)
show_cover_jpgs = [] show_cover_jpgs = []
for dir in show_array: for dir in show_array:
@ -173,64 +199,47 @@ def create_show_coverart():
for i in ["cover", "COVER"]: for i in ["cover", "COVER"]:
if i in file: if i in file:
show_cover_jpgs.append(str(path) + "/" + file) show_cover_jpgs.append(str(path) + "/" + file)
print(file) #print(file)
print("\n ++++ show jpgs: +++++ {0} +++++++++number of jpgs: {1} +++++++\n"\ # print("\n ++++ show jpgs: +++++ {0} +++++++++number of jpgs: {1} +++++++\n"\
.format(show_cover_jpgs, len(show_cover_jpgs) ) ) # .format(show_cover_jpgs, len(show_cover_jpgs) ) )
#slice first 12 images of array
# do an if logic here based on track number to set colums
# if len(show_cover_jpgs) <= 9:
# combine_images(columns=3, space=0, images=show_cover_jpgs[:9])
if len(show_cover_jpgs) > 0: # duplicate this for variations of geometry print('''
combine_images(columns=4, space=3, images=show_cover_jpgs[:12]) ------------------------
creating show cover art
------------------------
''')
# if len(show_cover_jpgs) > 0: # duplicate this for variations of geometry
for i in range(variants):
x = show_cover_jpgs[:12]
combine_images(columns=4, space=3, images=random.sample(x,len(x)),variants=i)
return show_cover return show_cover
def create_animated_gif():
import contextlib
from PIL import Image
# filepaths
fp_in = "/home/rob/antena/html/episode/2/img/*.png".format(episode_number)
fp_out = "/home/rob/antena/html/episode/2/img/show_cover.gif"
# create a HTML file containing show information # use exit stack to automatically close opened images
with contextlib.ExitStack() as stack:
def create_web_page(show_array:list): # lazily load images
global show_cover imgs = (stack.enter_context(Image.open(f))
global total_show_duration for f in sorted(glob.glob(fp_in)))
dir_path = "html/"
pattern = "*.html"
show_count = len(fnmatch.filter(os.listdir(dir_path), pattern))
show_info = []
for i in show_array: # extract first image from iterator
track = TinyTag.get(i) img = next(imgs)
detail = str(track.artist) + " | " + str(track.album) + \
" | " + str(track.title) + " | " + str(track.year) + \
" | " + str(timedelta(seconds=round(track.duration)))
show_info.append("" + detail)
with open("html/showinfo_" + DATE + ".html","w") as file: # https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html#gif
file.write(''' img.save(fp=fp_out, format='GIF', append_images=imgs,
<html> save_all=True, duration=200, loop=0)
<head>
<title> SHOW INFO </title>
</head>
<body> <h1>Inside the with open: %s </h1>\n
\n ''' % DATE)
file.writelines('''<h2>"Show info for: {0} #{1} release date: {2} </h2>
'''.format(show_name, show_count, DATE))
file.writelines('''<img src="../{0}" alt="podcast cover of the week" width="700" height="700">
<h3>Total Playtime excluding fills: {1} </h3>
ARTIST | ALBUM | TRACK | YEAR | DURATION
'''.format(show_cover, total_show_duration) )
for x in show_info:
file.writelines("<p>" + x + "</p>" +" \n " )
file.writelines(''' \n\n <hr>
<p>For more information on the artists or to buy thier albums visit their bandcamp page. </p>" +" \n ''' )
file.writelines("</body></html>")
file.close()
@ -243,17 +252,14 @@ def create_pls_file():
file.writelines("\n".join(show_array)) file.writelines("\n".join(show_array))
def create_podcast(show_array: list): def create_podcast(show_array: list):
print('''
------------------------
creating show audio
------------------------
''')
from glob import glob from glob import glob
from pydub import AudioSegment from pydub import AudioSegment
@ -266,7 +272,6 @@ def create_podcast(show_array: list):
second_three_blurb = playlist_songs.pop(0) second_three_blurb = playlist_songs.pop(0)
final_songs_blurb = playlist_songs.pop(0) final_songs_blurb = playlist_songs.pop(0)
final_show_outro = playlist_songs.pop(0) final_show_outro = playlist_songs.pop(0)
playlist = intro_and_first playlist = intro_and_first
for song in playlist_songs[2:3]: # first three songs (first added with intro) for song in playlist_songs[2:3]: # first three songs (first added with intro)
@ -290,13 +295,31 @@ def create_podcast(show_array: 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
with open("%s_minute_playlist.flac" % playlist_length, 'wb') as out_f: with open("html/episode/{0}/show.flac".format(episode_number), 'wb') as out_f:
playlist.export(out_f, format='flac') playlist.export(out_f, format='flac')
create_show_playlist(show_array, complete_playlist) ### ------------------------------------------------------------
create_show_coverart() #total_show_duration = 100
def create_html_from_template():
from jinja2 import Template, Environment, FileSystemLoader
env = Environment(loader=FileSystemLoader('html/templates'))
episode_template = env.get_template('episode.jinja')
output_from_parsed_template = episode_template.render(episode_author="rrrrrrrr", episode_dur="123", about_show="bla bla", episode_playlist="playlist_songs", episode_image="episode/{0}/img/cover.png".format(episode_number))
with open("html/episode.html".format(episode_number), "w") as episode_page:
episode_page.write(output_from_parsed_template)
create_show_playlist(show_array, complete_playlist)
create_show_coverart(show_array, 1) #total_show_dur = 100
#create_animated_gif()
#convert -delay 100 -loop 0 html/episode/2/img/show_cover_2024-01-12* animatedGIF.gif
#create_intro(show_array) #create_intro(show_array)
create_pls_file() create_pls_file()
create_web_page(show_array) create_html_from_template()
#create_web_page(show_name, show_array, episode_number, artists_played, show_cover, total_show_dur)
#create_podcast(show_array) #create_podcast(show_array)

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,12 +1,11 @@
/home/rob/antena/music/kamizdat/Lifecutter - Sub Persona (Kamizdat, 2020) [FLAC]/Lifecutter - Sub Persona - 04. Sub Persona IV.flac /home/rob/antena/music/kamizdat/Irena Tomažin - Taste Of Silence/Irena Tomažin - Taste Of Silence - 02 Soil Stone.flac
/home/rob/antena/music/kamizdat/Warrego_Valles_-_Botox_(2018_Kamizdat)_[FLAC]/7. Warrego Valles - 5000000000 YRS.flac /home/rob/antena/music/kamizdat/Gašper_Torkar_-_Accept_the_Risk_and_Continue_[Kamizdat_2021_FLAC]/Gašper_Torkar_-_Accept_the_Risk_and_Continue_-_4._Arboreal.flac
/home/rob/antena/music/pharmafabrik_recordings/Various - Bora Scura Reimagined/Vomir - Bora Scura Reimagined - 09 Action XIX.flac /home/rob/antena/music/pharmafabrik_recordings/Chris Wood - Misoneism/Chris Wood - Misoneism - 02 Quiet Certainty.flac
/home/rob/antena/music/pharmafabrik_recordings/Delta-Sleep-Inducing Peptide - Oscillopsia/Delta-Sleep-Inducing Peptide - Oscillopsia - 05 Constant Negation.flac /home/rob/antena/music/sploh/Samo Kutin and Martin Küchen - Stutter And Strike/Samo Kutin and Martin Küchen - Stutter And Strike - 03 Svete gore.flac
/home/rob/antena/music/kamizdat/Luka_Prinčič_-_Antigone_Child_(2018, Kamizdat).[FLAC]/02 Chorus 1 (SC).flac /home/rob/antena/music/sploh/Axel Dörner and Tomaž Grom - Omejeno gibanje - Confined Movement/Axel Dörner and Tomaž Grom - Omejeno gibanje - Confined Movement - 06 Confined Movement- F.flac
/home/rob/antena/music/kamizdat/Gašper Torkar - Dreams of Others EP (Kamizdat, 2017) [FLAC]/Gašper Torkar - Dreams of Others EP - 5 - Rib Vaulting.flac
/home/rob/antena/music/kamizdat/Access Frame - Equity (Kamizdat, 2020) [FLAC]/Kamizdat - Access Frame- Equity - 07 Zergon- Altobar.flac
/home/rob/antena/music/pharmafabrik_recordings/Lhetargija - Raganas Mācekle/Lhetargija - Raganas Mācekle - 03 Vorspiel fur Traurige Madchen.flac
/home/rob/antena/music/kamizdat/Irena Tomažin - Taste Of Silence/Irena Tomažin - Taste Of Silence - 09 Soloveikia Moj.flac
/home/rob/antena/music/sploh/Jošt Drašler - The Balloon Catcher/Jošt Drašler - The Balloon Catcher - 09 Grandma Balloon.flac
/home/rob/antena/music/kamizdat/Shekuza - De Sica (2019, Kamizdat) [FLAC]/04 Shekuza - Nebulae Tree.flac /home/rob/antena/music/kamizdat/Shekuza - De Sica (2019, Kamizdat) [FLAC]/04 Shekuza - Nebulae Tree.flac
/home/rob/antena/music/kamizdat/rouge-ah - bare (Kamizdat, 2018) [FLAC]/5. conversation suppresed.flac /home/rob/antena/music/sploh/Tone Pavček & Tomaž Grom - Sonce in sončice po vsem svetu/Tone Pavček & Tomaž Grom - Sonce in sončice po vsem svetu - 10 Ninulla Çapkanёve (Čenčačeva uspavanka).flac
/home/rob/antena/music/pharmafabrik_recordings/Various - Bora Scura Reimagined/Sunao Inami - Bora Scura Reimagined - 05 Action XV.flac
/home/rob/antena/music/kamizdat/Luka Prinčič + ala pecula - a space process (2022, Kamizdat) [FLAC]/Luka Prinčič + ala pecula - a space process - 06 - a1.flac
/home/rob/antena/music/kamizdat/beepblip - Noise for Strings vol.2 (Kamizdat, 2020) [FLAC]/beepblip - Noise for Strings vol.2 - 02. Protons.flac
/home/rob/antena/music/sploh/TiTiTi (Jure Boršič, Jošt Drašler, Vid Drašler) - Štafelaj/TiTiTi (Jure Boršič, Jošt Drašler, Vid Drašler) - Štafelaj - 02 Spone (Chains).flac