RSS template now conforming to standards
parent
0398c4c208
commit
4017a3e483
13
README.md
13
README.md
|
@ -18,6 +18,10 @@ https://moonleerecords.bandcamp.com/
|
|||
https://sirom.bandcamp.com/music
|
||||
https://kikiriki.bandcamp.com
|
||||
|
||||
##
|
||||
unziping bandcamp
|
||||
for i in *.zip; do b=`basename "$i" .zip`; echo unzip \"$i\" -d \"$b\" ; done
|
||||
|
||||
## install notes
|
||||
|
||||
now using a venv so :
|
||||
|
@ -26,3 +30,12 @@ python3 -m venv .venv
|
|||
source .venv/bin/activate
|
||||
|
||||
pip install tinytag scikit-image
|
||||
|
||||
## run the script
|
||||
|
||||
// fresh start
|
||||
echo "" > playlists/track_playout_history.txt; rm show.db ; mk_master_playlist.sh; ./mk_show.py 2 2024-04-17;
|
||||
|
||||
// generate podcast episode 3 with a release date of 2024-02-23
|
||||
|
||||
/mk_show.py 3 2024-02-23
|
||||
|
|
BIN
database/show.db
BIN
database/show.db
Binary file not shown.
|
@ -142,17 +142,13 @@
|
|||
<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>
|
||||
|
|
|
@ -16,7 +16,6 @@
|
|||
|
||||
<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">
|
||||
|
@ -95,6 +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-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>
|
||||
|
||||
|
@ -326,17 +326,14 @@
|
|||
<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>
|
||||
|
|
|
@ -0,0 +1,49 @@
|
|||
|
||||
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<rss version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:content="http://purl.org/rss/1.0/modules/content/">
|
||||
<channel>
|
||||
<title>Hiking Treks</title> <link>https://www.apple.com/itunes/podcasts/</link>
|
||||
<language>en-us</language>
|
||||
<copyright>© 2019 John Appleseed</copyright>
|
||||
<itunes:author>The Sunset Explorers</itunes:author>
|
||||
<description> {{short_description}} </description>
|
||||
<itunes:type>serial</itunes:type>
|
||||
<itunes:owner> <itunes:name>{{show_name}}</itunes:name>
|
||||
<itunes:email>{{show_email}}</itunes:email>
|
||||
</itunes:owner>
|
||||
<itunes:image
|
||||
href="{{show_image}}"
|
||||
/>
|
||||
<itunes:category text="Music">
|
||||
<itunes:category text="Independent Music"/> </itunes:category>
|
||||
<itunes:explicit>false</itunes:explicit>
|
||||
|
||||
{% for rss_item in range(episode_number) %}
|
||||
<item>
|
||||
<itunes:episodeType>podcast</itunes:episodeType>
|
||||
<itunes:title>{{show_name}} Episode # {{episode_number}}</itunes:title>
|
||||
<description>
|
||||
<content:encoded>
|
||||
<![CDATA[{{show_short_description}} Listen on
|
||||
<a
|
||||
href="{{show_url}}">Rizoma Podcasts Homepage</a>.]]>
|
||||
</content:encoded>
|
||||
</description>
|
||||
<enclosure
|
||||
length="{{episode_duration}}"
|
||||
type="audio/mpeg"
|
||||
url="{{episde_mp3_url}}"
|
||||
/>
|
||||
<guid>aae20190418</guid>
|
||||
<pubDate>{{episode_pub_date}}</pubDate>
|
||||
<!-- <pubDate>Tue, 8 Jan 2019 01:15:00 GMT</pubDate> -->
|
||||
<itunes:duration>{{episode_duration}}</itunes:duration>
|
||||
<itunes:explicit>false</itunes:explicit>
|
||||
</item>
|
||||
{% endfor %}
|
||||
|
||||
|
||||
|
||||
</channel>
|
||||
</rss
|
|
@ -1,20 +0,0 @@
|
|||
<?xml version="1.0" encoding="UTF-8" ?>
|
||||
<rss version="2.0">
|
||||
|
||||
<channel>
|
||||
|
||||
<title>{{show_name}} RSS</title>
|
||||
<link>http://{{show_name}}.rizoma.si</link>
|
||||
<description>{{show_name}} Music Podcast</description>
|
||||
|
||||
{% for rss_item in range(episode_number) %}
|
||||
<item>
|
||||
<title>Episode # {{episode_number}} - The Slo Indie Show</title>
|
||||
<link>http://{{showname}}.rizoma.si/episode/{{episode_number}}/show.mp3</link>
|
||||
<description>Episode # {{episode_number}} of The Slovenian Indie Show</description>
|
||||
</item>
|
||||
{% endfor %}
|
||||
|
||||
</channel>
|
||||
|
||||
</rss>
|
34
mk_show.py
34
mk_show.py
|
@ -6,6 +6,7 @@ from os.path import join
|
|||
from tinytag import TinyTag
|
||||
from random import shuffle
|
||||
import sqlite3, json
|
||||
import uuid
|
||||
|
||||
from mk_web import *
|
||||
|
||||
|
@ -33,6 +34,7 @@ if os.path.exists(web_path):
|
|||
else: os.makedirs(web_path)
|
||||
|
||||
# /////////////////////////////////////////////////
|
||||
|
||||
def set_episode_date(input_date):
|
||||
global episode_date
|
||||
date_str = input_date
|
||||
|
@ -41,7 +43,6 @@ def set_episode_date(input_date):
|
|||
#return episode_date
|
||||
print(episode_date)
|
||||
|
||||
|
||||
conn = ''
|
||||
def database_create():
|
||||
# the show database
|
||||
|
@ -56,12 +57,12 @@ def database_create():
|
|||
ID INTEGER PRIMARY KEY AUTOINCREMENT,
|
||||
EPISODE INT NOT NULL,
|
||||
DATE TEXT NOT NULL,
|
||||
DURATION INT NOT NULL,
|
||||
ALBUM TEXT NOT NULL,
|
||||
TRACK TEXT NOT NULL,
|
||||
ARTIST TEXT NOT NULL,
|
||||
TRACKDUR INT NOT NULL,
|
||||
YEAR TEXT NOT NULL
|
||||
YEAR TEXT NOT NULL,
|
||||
PATH TEXT NOT NULL
|
||||
);''')
|
||||
|
||||
print("Table created successfully");
|
||||
|
@ -72,7 +73,6 @@ def database_create():
|
|||
#print("DB Record created successfully");
|
||||
#conn.close()
|
||||
|
||||
|
||||
def create_intro(show_array):
|
||||
intropath = path + "texts/clips/this_is"
|
||||
intro = random.choice(os.listdir(intropath))
|
||||
|
@ -114,13 +114,14 @@ def create_show_playlist(show_array: list, complete_playlist:list):
|
|||
track_count = 0
|
||||
global artists_played
|
||||
max_track_dur = 10
|
||||
min_track_dur = 1.8
|
||||
min_track_dur = 2
|
||||
|
||||
while episode_duration < 60 * 60 and track_count < 12 :
|
||||
while episode_duration < 60 * 60 and track_count < 10 :
|
||||
song = random.choice(random.sample(\
|
||||
complete_playlist, len(complete_playlist) )).rstrip() # pick a song
|
||||
track = TinyTag.get(song) # get its metadata
|
||||
# check if the artist not in the played list and the song is less than 8mins
|
||||
track_path = '/'.join(song.split('/')[0:-1])
|
||||
if track.artist not in artists_played:
|
||||
if check_archive(track.title) is True:
|
||||
if int(track.duration) > min_track_dur * 60:
|
||||
|
@ -139,9 +140,10 @@ def create_show_playlist(show_array: list, complete_playlist:list):
|
|||
cursor = conn.cursor()
|
||||
#long_string = json.dumps(["' SomeWord"])
|
||||
cursor.execute("INSERT INTO SHOW (\
|
||||
ID, EPISODE, DATE, DURATION, ALBUM, TRACK, ARTIST, TRACKDUR, YEAR) \
|
||||
VALUES (NULL, ?, ?, ?, ?, ?, ?,?,?)", [episode_number, episode_date, episode_duration, \
|
||||
track.album, track.title, track.artist, track.duration, track.year]);
|
||||
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("DB Record created successfully");
|
||||
|
||||
|
@ -243,10 +245,12 @@ def combine_images(columns, space, images, variants:int):
|
|||
def create_show_coverart(show_array, variants):
|
||||
|
||||
show_cover_jpgs = []
|
||||
|
||||
# in the directory containing songs find jpg and pngs containing string "cover"
|
||||
for dir in show_array:
|
||||
path = pathlib.Path(dir).parent
|
||||
for file in os.listdir(path):
|
||||
for p in [".png", ".jpg", ".jpeg"]:
|
||||
if p in file:
|
||||
for i in ["cover", "COVER"]:
|
||||
if i in file:
|
||||
show_cover_jpgs.append(str(path) + "/" + file)
|
||||
|
@ -354,10 +358,10 @@ def create_podcast(show_array: list):
|
|||
playlist_length = len(playlist) / (1000*60)
|
||||
# save the entire poidcast
|
||||
|
||||
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...")
|
||||
# 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...")
|
||||
|
||||
with open("html/episode/{0}/show.mp3".format(episode_number), 'wb') as out_f:
|
||||
print("MP3 output file opened...writing to file...")
|
||||
|
@ -501,7 +505,7 @@ def create_html_episode_from_template():
|
|||
def create_RSS_XML_from_template():
|
||||
from jinja2 import Template, Environment, FileSystemLoader
|
||||
env = Environment(loader=FileSystemLoader('html/templates'))
|
||||
rss_template = env.get_template('show_RSS_xml.jinja')
|
||||
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",\
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,102 +1,12 @@
|
|||
|
||||
Chorus 1 (SC)
|
||||
Elephant in The Mush Rooms
|
||||
Transition (Excerpt)
|
||||
Her Boat
|
||||
Todestriebe
|
||||
Extra space
|
||||
Tone Pavček & Tomaž Grom - Sonce in sončice po vsem svetu - 04 Čenčačeva uspavanka
|
||||
Tomaž Grom & Seijiro Murayama - Nepretrganost - 04 Štiri.
|
||||
Slika 6
|
||||
1 9 5 Ints (Edit)
|
||||
Crisp Ursa Minor
|
||||
Laszlo
|
||||
Inchoate Crimes
|
||||
Action I
|
||||
Jean-Luc Guionnet & Samo Kutin - Kopaš - 05 05
|
||||
Stabit
|
||||
Sub Persona IX
|
||||
decrepitation_var.1a-2
|
||||
won't work for free anymore
|
||||
Apropos
|
||||
Weakest Parts of Society
|
||||
death rattle_var.2-4
|
||||
Tomaž Grom & Seijiro Murayama - Nepretrganost - 04 Štiri.
|
||||
Small Tyrant
|
||||
Scena Prologue
|
||||
Pagan (KK Null remix)
|
||||
Samo Kutin - Plovilo - 02 Bliže
|
||||
voices
|
||||
Jean-Luc Guionnet & Samo Kutin - Kopaš - 07 07
|
||||
Sub Persona IX
|
||||
Crisp Ursa Minor
|
||||
Zlatko Kaučič, Tomaž Grom - The Ear Is The Shadow Of The Eye - 01 From Hands To Ears - Iz rok v ušesa
|
||||
Whale Ft Outtake
|
||||
Mono Scarves - Kaj pa tisti rizling
|
||||
Parallax Division
|
||||
Asphalt
|
||||
Loveful
|
||||
Vertex
|
||||
Je Šel Brat S Sestro
|
||||
a3
|
||||
Jošt Drašler - The Balloon Catcher - 06 Green Balloon
|
||||
Trojnik (Cene Resnik, Tomaž Grom, Vid Drašler) - Moje uho ima ostre robove - 03 03
|
||||
BE CREEP - LIVE
|
||||
RIP Girls Toys
|
||||
Zlatko Kaučič, Tomaž Grom - Torn Memories Of Folklore - Raztrgana folklora spomina - 03 Scattered Out Of Context
|
||||
Matej Bonin - Gymnastics of non-sense II - 02 Part II
|
||||
Trojnik (Cene Resnik, Tomaž Grom, Vid Drašler) - Moje uho ima ostre robove - 11 11
|
||||
Samo Kutin - Plovilo - 02 Bliže
|
||||
Descent
|
||||
Antichrist
|
||||
Vid Drašler - Kramljanja - 07 7.
|
||||
Ultrascan
|
||||
stepbystep
|
||||
Oscillopsia
|
||||
Soft Orange
|
||||
Offset V2
|
||||
coupdotexe (mapalma remix)
|
||||
Samo Kutin - Plovilo - 06 A
|
||||
Nebulae Tree
|
||||
Vid Drašler - Kramljanja - 07 7.
|
||||
1 9 5 Ints (Edit)
|
||||
Trojnik (Cene Resnik, Tomaž Grom, Vid Drašler) - Moje uho ima ostre robove - 11 11
|
||||
Zlatko Kaučič, Tomaž Grom - Torn Memories Of Folklore - Raztrgana folklora spomina - 09 Sheep On The Right Bank
|
||||
Explored
|
||||
Spiritual Of Anger (Outtake)
|
||||
Crushing Trauma
|
||||
Vision Rising (Eraldo Bernocchi remix)
|
||||
Sand Mantis
|
||||
Apropos
|
||||
things i decided against
|
||||
Action XVI
|
||||
Jošt Drašler - The Balloon Catcher - 06 Green Balloon
|
||||
Crossing The Rubicon
|
||||
perspektiva
|
||||
Sub Persona I
|
||||
Domen Gnezda - Misnomer II - 04 Misnomer 26
|
||||
Oholo! - Mnogobolje - 01 Blind man's buff
|
||||
Samo Kutin - Plovilo - 04 Kdove
|
||||
Typhaceae
|
||||
Quiet Certainty
|
||||
Immediate
|
||||
Passing
|
||||
Vision Rising (Eraldo Bernocchi remix)
|
||||
Trojnik (Cene Resnik, Tomaž Grom, Vid Drašler) - Moje uho ima ostre robove - 08 08
|
||||
Irena Z. Tomažin - Cmok v grlu - Lump In The Throat - 14 Klic meduze
|
||||
Strand Looper
|
||||
Domen Gnezda - Misnomer II - 17 Misnomer 39
|
||||
Antichrist
|
||||
a3
|
||||
Tone Pavček & Tomaž Grom - Sonce in sončice po vsem svetu - 10 Ninulla Çapkanёve (Čenčačeva uspavanka)
|
||||
Strenuous Effort
|
||||
blckend leftover_var.3a
|
||||
My Sweet.Com
|
||||
Vid Drašler - Kramljanja - 03 3.
|
||||
Kolonija
|
||||
The Oppressed 2 (SC)
|
||||
Ukwakha (Chris Wood remix)
|
||||
Ambinet
|
||||
Samo Kutin and Martin Küchen - Stutter And Strike - 04 Orans
|
||||
Krdelo
|
||||
Tomaž Grom - Sam, za... - 08 P.Č.
|
||||
5000000000 YRS
|
||||
Vinko Globokar - Splitting - 07 Vinko Globokar- Dialogue about water, for acoustic and electric guitar (1994)
|
||||
Lussid
|
||||
Wicked Child
|
||||
Harlequin
|
||||
Action VIII
|
||||
Blue Waters Turn Black (P.C.M. remix)
|
||||
Untold Truths
|
||||
Kampak
|
||||
|
|
Loading…
Reference in New Issue