From 9f70858aca494d916e8797897956fbd759912451 Mon Sep 17 00:00:00 2001 From: Rob Canning Date: Mon, 15 Jan 2024 02:19:13 +0100 Subject: [PATCH] added sqlite database funtionality and jinja templating --- database/music.db | Bin 0 -> 32768 bytes html/images/label_logos/PF.png | Bin 0 -> 7446 bytes html/images/label_logos/kamizdat.png | Bin 0 -> 1650 bytes html/images/label_logos/sploh.jpeg | Bin 0 -> 2471 bytes html/images/label_logos/terraformer.jpeg | Bin 0 -> 6684 bytes html/images/rob_canning.jpeg | Bin 0 -> 9101 bytes html/templates/episode.jinja | 90 ++-- html/templates/homepage.jinja | 441 +++++++++++++++ mk_show.py | 272 +++++++--- playlists/track_playout_history.txt | 657 +---------------------- 10 files changed, 688 insertions(+), 772 deletions(-) create mode 100644 database/music.db create mode 100644 html/images/label_logos/PF.png create mode 100644 html/images/label_logos/kamizdat.png create mode 100644 html/images/label_logos/sploh.jpeg create mode 100644 html/images/label_logos/terraformer.jpeg create mode 100644 html/images/rob_canning.jpeg create mode 100644 html/templates/homepage.jinja diff --git a/database/music.db b/database/music.db new file mode 100644 index 0000000000000000000000000000000000000000..7011c5171934e101cf67a76d3dcac15ef327e1d0 GIT binary patch literal 32768 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 Uw4!ed+yDRo07*qoM6N<$f_!m#V*mgE literal 0 HcmV?d00001 diff --git a/html/images/label_logos/kamizdat.png b/html/images/label_logos/kamizdat.png new file mode 100644 index 0000000000000000000000000000000000000000..fb6ab669dc7beb632d543921178a54257bfb31c6 GIT binary patch literal 1650 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 V>L++lHtLW>kF1zP0t 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 - + - - - - - + + + + + - + - + @@ -105,7 +105,7 @@
@@ -115,6 +115,18 @@ + +{% for result in show_info %} + + {{ result[0] }} + {{ result[1] }} + {{ result[2] }} + +{% endfor %} + + + +
@@ -179,43 +191,7 @@

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!

- +
@@ -301,18 +277,18 @@
- + - - - - - - - - + + + + + + + + - + - + diff --git a/html/templates/homepage.jinja b/html/templates/homepage.jinja new file mode 100644 index 0000000..9c386d6 --- /dev/null +++ b/html/templates/homepage.jinja @@ -0,0 +1,441 @@ + + + + show_name + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+
+ +
+
+
+
+ + + + +
+
+
+ +
+

Latest Episode: # {{episode_number}}

+
{{episode_author}} / Zavod Rizoma | 16 September 2017 | 1:30:20
+

Episode Details and Player

+ +
+ +
+ +
+
+
+
+ +
+
+ +
+
+

Previous Episodes

+
+
+ + {% for episode in episodes %} +
+
+
+ +

Episode: # {{episode.episode_number}}

+
+ Presented by Rob Canning / {{episode.episode_date}} / {{episode.episode_duration}}
+

On this weeks show music from: {{episode.episode_artists}}

+ +
+
+ + {% endfor %} + + + + + + + + + + + +
+
+
+
+
    +
  • <
  • +
  • 1
  • +
  • 2
  • +
  • 3
  • +
  • 4
  • +
  • 5
  • +
  • >
  • +
+
+
+
+
+
+ +
+
+
+
+

Behind The Mic

+
+
+
+
+
+ + Image + +
+ +

Rob Canning

+ Creative Director +

Lorem ipsum dolor sit amet consectetur adipisicing elit ullam reprehenderit nemo.

+

+ + + +

+
+ +
+
+ +
+
+ + Image + +
+ +

Brooke Cagle

+ Creative Director +

Lorem ipsum dolor sit amet consectetur adipisicing elit ullam reprehenderit nemo.

+

+ + + +

+
+ +
+
+ + +
+
+
+
+

Featured Labels

+
+
+ +
+
+ + + + + + +
+ + + + + + + + + + + + + + + + + + + + + diff --git a/mk_show.py b/mk_show.py index 1c3bd92..e1c9b55 100755 --- a/mk_show.py +++ b/mk_show.py @@ -1,19 +1,44 @@ #!/usr/bin/python3 + import sys, os, datetime, fnmatch, glob, random, time, pathlib, re from datetime import timedelta from os.path import join from tinytag import TinyTag - from random import shuffle - -import sqlite3 +import sqlite3, json from mk_web import * -con = sqlite3.connect("music.db") +conn = sqlite3.connect("database/music.db") -DATE = datetime.datetime.now().strftime("%Y-%m-%d") -total_show_dur = 0 +#cursor = conn.cursor() +#cursor.execute("DROP TABLE SHOW") +#conn.commit() + +conn.execute('''CREATE TABLE IF NOT EXISTS SHOW( +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 +);''') + +print("Table created successfully"); + +#conn.execute("INSERT INTO SHOW (ID, EPISODE,DATE,TRACK,ARTIST) \ +#VALUES (1, 1, 'wednesday', 'Some song', 'Some Artist' )"); +#conn.commit() +#print("DB Record created successfully"); +#conn.close() + + + +episode_date = datetime.datetime.now().strftime("%Y-%m-%d") +episode_duration = 0 complete_playlist = [] show_array = [] show_cover = "" @@ -21,8 +46,6 @@ archive = [] artists_played = [] artist_abreviated = [] episode_number = sys.argv[1] - - show_name = "SHOWNAME" # OBED path = "/home/rob/antena/" web_path = "/home/rob/antena/html/episode/{0}/img".format(episode_number) @@ -68,7 +91,7 @@ def load_all_music(): def create_show_playlist(show_array: list, complete_playlist:list): load_all_music() - global total_show_dur + global episode_duration global archive track_count = 0 @@ -76,7 +99,7 @@ def create_show_playlist(show_array: list, complete_playlist:list): max_track_dur = 10 min_track_dur = 1.8 - while total_show_dur < 60 * 60 and track_count < 12 : + while episode_duration < 60 * 60 and track_count < 12 : song = random.choice(random.sample(\ complete_playlist, len(complete_playlist) )).rstrip() # pick a song track = TinyTag.get(song) # get its metadata @@ -92,18 +115,37 @@ def create_show_playlist(show_array: list, complete_playlist:list): 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 + + if not track.year: # where missing metadata give a dummy value + track.year = 0000 + + 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]); + conn.commit() + print("DB Record created successfully"); + + + + + track_count += 1; print(track_count) - total_show_dur = total_show_dur + track.duration + 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") + + conn.close() - total_show_dur = timedelta(seconds=round(total_show_dur)) + episode_duration = timedelta(seconds=round(episode_duration)) - print("total tracks = {0} \n total duration = {1} ".format(track_count, total_show_dur)) + print("total tracks = {0} \n total duration = {1} ".format(track_count, episode_duration)) - return show_array, total_show_dur + return show_array, episode_duration def combine_images(columns, space, images, variants:int): global show_cover @@ -147,8 +189,7 @@ def combine_images(columns, space, images, variants:int): h2_spc = 85 h2_baseline = 1530 - - + # Add Text to the image ---------------------------------------- # ------------------------------------------------------------------- # some logic to shuffle the list if sub sections of list are too long for layout @@ -160,12 +201,10 @@ def combine_images(columns, space, images, variants:int): [len(s) for s in [''.join(artist_abreviated[9:12])]][0] > str_length_thresh: print("on of the lines is longer than fits the page... shuffling the list for a better look") random.shuffle(artist_abreviated) - - - + im.text((30,10), '''an eclectic selection of contemporary independent music from slovenia: {0} - E P I S O D E #{1} '''\ - .format(DATE,episode_number), fill="white", font=mf_h3) + .format(episode_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}'''\ @@ -177,20 +216,15 @@ def combine_images(columns, space, images, variants:int): 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) + im.text((1540,1888), ''' http://{0}.rizom.si '''\ + .format(show_name, episode_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) + show_cover = 'img/cover.png'.format(episode_number,episode_date, variants) 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 = [] for dir in show_array: @@ -199,11 +233,6 @@ def create_show_coverart(show_array, variants): for i in ["cover", "COVER"]: if i in file: show_cover_jpgs.append(str(path) + "/" + file) - #print(file) - -# print("\n ++++ show jpgs: +++++ {0} +++++++++number of jpgs: {1} +++++++\n"\ - # .format(show_cover_jpgs, len(show_cover_jpgs) ) ) - print(''' ------------------------ @@ -241,16 +270,10 @@ 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_" + DATE + ".pls","w") as file: + with open("shows/antena_playlist_" + episode_date + ".pls","w") as file: file.writelines("\n".join(show_array)) - def create_podcast(show_array: list): @@ -265,61 +288,176 @@ def create_podcast(show_array: list): playlist_songs = [AudioSegment.from_file(flac_file) for flac_file in show_array] - show_intro = playlist_songs.pop(0) - first_song = playlist_songs[0].fade_in(3000) - intro_and_first = first_song.overlay(show_intro) - first_three_blurb = playlist_songs.pop(0) - second_three_blurb = playlist_songs.pop(0) - final_songs_blurb = playlist_songs.pop(0) - final_show_outro = playlist_songs.pop(0) - playlist = intro_and_first - - for song in playlist_songs[2:3]: # first three songs (first added with intro) - # We don't want an abrupt stop at the end, so let's do a 1 second crossfades - playlist = playlist.append(song, crossfade=(10 * 1000)) + show_intro = playlist_songs[0] +# first_song = playlist_songs[0].fade_in(0) # only fadein if used over show intro - currently not used + # intro_and_first = first_song.overlay(show_intro) + first_three_blurb = playlist_songs[0] + second_three_blurb = playlist_songs[0] + final_songs_blurb = playlist_songs[0] + final_show_outro = playlist_songs[0] + # next two commented lines are for if intro goes over first track or not + #playlist = intro_and_first + + + + playlist = show_intro + + + #for song in playlist_songs[2:3]: + for song in playlist_songs[1:4]: # first three songs (first added with intro) + # We don't want an abrupt stop at the end, so let's do a 1 second crossfades + playlist = playlist.append(song, crossfade=(1 * 1000)) + print("first songs added") + # blurb about first three tracks playlist = playlist.append(first_three_blurb) # <--------------BLURB INSERT - for song in playlist_songs[4:6]: # second three songs - # We don't want an abrupt stop at the end, so let's do a 1 second crossfades - playlist = playlist.append(song, crossfade=(10 * 1000)) + for song in playlist_songs[4:7]: # second three songs + playlist = playlist.append(song, crossfade=(1 * 1000)) + print("second songs added") + playlist = playlist.append(second_three_blurb) # <--------------BLURB INSERT - for song in playlist_songs[7:]: # second three song # We don't want an abrupt stop at the end, so let's do a 1 second crossfades - playlist = playlist.append(song, crossfade=(10 * 1000)) + for song in playlist_songs[7:10]: # second three song + playlist = playlist.append(song, crossfade=(1 * 1000)) + print("third songs added") + playlist = playlist.append(final_songs_blurb) # <--------------BLURB INSERT + for song in playlist_songs[10:13]: # second three song + playlist = playlist.append(song, crossfade=(1 * 1000)) + print("final songs added") + playlist = playlist.append(final_show_outro) # <-------------- OUTRO SEQUENCE # get length of final show / podcast 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.mp3".format(episode_number), 'wb') as out_f: + print("MP3 output file opened...writing to file...") + playlist.export(out_f, format='mp3') + print("MP3 audio file exported...") ### ------------------------------------------------------------ -def create_html_from_template(): +def create_html_episode_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: + show_info = [] + + # maybe a jinja2 template loop here instead + for i in show_array: + 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) + + output_from_parsed_template = episode_template.render(episode_author="rrrrrrrr",\ + episode_duration=episode_duration, episode_date=episode_date, about_show="bla bla", episode_playlist=show_info, \ + episode_image="img/cover.png".format(episode_number)) + + with open("html/episode/{0}/index.html".format(episode_number), "w") as episode_page: episode_page.write(output_from_parsed_template) +def create_html_episode_from_template(): + + from jinja2 import Template, Environment, FileSystemLoader + + env = Environment(loader=FileSystemLoader('html/templates')) + episode_template = env.get_template('episode.jinja') + + show_info = [] + + # maybe a jinja2 template loop here instead + for i in show_array: + 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) + + output_from_parsed_template = episode_template.render(episode_author="rrrrrrrr",\ + episode_duration="123", about_show="bla bla", episode_playlist=show_info, \ + episode_image="img/cover.png".format(episode_number)) + + with open("html/episode/{0}/index.html".format(episode_number), "w") as episode_page: + episode_page.write(output_from_parsed_template) + + +def create_html_homepage_from_template(): + + from jinja2 import Template, Environment, FileSystemLoader + + env = Environment(loader=FileSystemLoader('html/templates')) + homepage_template = env.get_template('homepage.jinja') + + show_info = [] + + episode_artists = [] + for i in range(10): + artists = [] + conn = sqlite3.connect("database/music.db") + cur = conn.cursor() + cur.execute("SELECT ARTIST FROM SHOW WHERE EPISODE=?", [i]) + rows = cur.fetchall() + + for artist in rows: + art = string=re.sub("\(.*?\)","", artist[0]) + # shorten verbose artist names such as trojnik Trojnik (Cene Resnik, Tomaž Grom, Vid Drašler) + artist = string=re.sub("and","&",art) + artists.append(artist) + episode_artists.append(artists) + + + episodes = [] + for i in range(10): + + print(episode_artists) + an_episode = dict(date="2012-02-", episode_artists=episode_artists[i], episode_number=i, episode_date=episode_date, episode_duration=episode_duration) + episodes.append(an_episode) + episodes = reversed(episodes) # reversed order to most recent episode appears first in list + + + # maybe a jinja2 template loop here instead + for i in show_array: + 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) + + output_from_parsed_template = homepage_template.render(episodes=episodes, episode_author="Rob Canning",\ + episode_duration="123", episode_number=episode_number, episode_artists=episode_artists, \ + about_show="bla bla", episode_playlist=show_info, \ + episode_image="episode/{0}/img/cover.png".format(episode_number)) + + with open("html/index.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_show_coverart(show_array, 1) #episode_duration = 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_html_from_template() -#create_web_page(show_name, show_array, episode_number, artists_played, show_cover, total_show_dur) -#create_podcast(show_array) - + +create_html_episode_from_template() +create_html_homepage_from_template() +create_podcast(show_array) +#convert -delay 100 -loop 0 html/episode/2/img/show_cover_2024-01-12* animatedGIF.gif diff --git a/playlists/track_playout_history.txt b/playlists/track_playout_history.txt index 063ad23..a7a3ff2 100644 --- a/playlists/track_playout_history.txt +++ b/playlists/track_playout_history.txt @@ -1,651 +1,12 @@ -Sub Persona II -BE CREEP - LIVE -Mono Scarves - Bralni stroj Korenje -Coriolis Effect -Sweet Sandy -Inchoate Crimes -When Ballon And Door Collide Pt2 -Stampede -Action XIII -Domen Gnezda - Misnomer II - 15 Misnomer 37 -TiTiTi (Jure Boršič, Jošt Drašler, Vid Drašler) - Štafelaj - 05 Čačkarije (Scribbles) -Lussid -Cyberpunk Tendencies -When Ballon And Door Collide Pt2 -Action I -Small Tyrant -Zlatko Kaučič, Tomaž Grom - The Ear Is The Shadow Of The Eye - 09 Though Ashtray (Pepelnik), I Still Like To Read Your Poems -Apprentie Sorciēre -Amyl Nitrite -Domen Gnezda - Misnomer II - 10 Misnomer 32 -biking, i look back -02 Confined Movement- B -Action XV -Her Boat -Irena Z. Tomažin - Cmok v grlu - Lump In The Throat - 14 Klic meduze -Untitled -chan debris_var.2a -Pudl -Je Šel Brat S Sestro -Vid Drašler - Kramljanja - 02 2. -Infinite values -Jean-Luc Guionnet & Samo Kutin - Kopaš - 06 06 -Altobar -Magie de la Pleine Lune -Keep An Eye On That Ice Cream -Domen Gnezda - Misnomer II - 16 Misnomer 38 -Liqweed -Vinko Globokar - Dialog - 05 Dialog über Luft (1994) -Samo Kutin and Martin Küchen - Stutter And Strike - 01 Uncaged (take 2) -TiTiTi (Jure Boršič, Jošt Drašler, Vid Drašler) - Štafelaj - 05 Čačkarije (Scribbles) -biking, i look back -Tilt - Tilt - 01 Alicante 1 -Cyclidox -Cyclidox -Sub Persona III -Zlatko Kaučič, Tomaž Grom - Torn Memories Of Folklore - Raztrgana folklora spomina - 10 Knitting Traps -Divine -Gfuel -Nots -you think you're so much better -debris of motus_var.1b -Tilt - Tilt - 03 Alicante 3 -Blue Waters Turn Black (P.C.M. remix) -Laszlo -Stale Futures -Tomaž Grom - Sam, za... - 08 P.Č. -Pudlica -Hollogramma -ethera (dome) -Jean-Luc Guionnet & Samo Kutin - Kopaš - 05 05 -Plastik Elastik -Tomaž Grom & Seijiro Murayama - Nepretrganost - 01 Ena. -BE CREEP - LIVE -Inna Moss Side (96' Flex) -Samo Kutin and Martin Küchen - Stutter And Strike - 04 Orans -Nihalo -Tone Pavček & Tomaž Grom - Sonce in sončice po vsem svetu - 02 Sončna idila -The Left Eye -Tides (excerpt) -Moonolog -Domen Gnezda - Misnomer II - 02 Misnomer 24 -a2 -Gravitacija -Zlatko Kaučič, Tomaž Grom - Torn Memories Of Folklore - Raztrgana folklora spomina - 07 Hardhanded -Tomaž Grom - Sam, za... - 04 L.Z. -Botox -Vid Drašler - Kramljanja - 06 6. -anticipation_var.1-1 -Oholo! - Mnogobolje - 05 Influenced -Tomaž Grom & Seijiro Murayama - Nepretrganost - 05 Pet. -+ [Excerpt] -Zlatko Kaučič, Tomaž Grom - The Ear Is The Shadow Of The Eye - 01 From Hands To Ears - Iz rok v ušesa -Sub Persona X -Passage -Juan Camilo Vasquez - Splitting - 05 Caliope (El canto de las abejas), for guitar and electronics (2014) -Bright Future -YuWrong -Leather Wings -Birth of a planet -Mono Scarves - Demoklejev meč in rivbiška palica dva v enem -Explored -wudang_var.3-7 -Lazy Sunday (Moshang remix) -Jean-Luc Guionnet & Samo Kutin - Kopaš - 05 05 -Of Blood -None -Mercurius & the Ram -Palimpsest V2 -5000000000 YRS -Tomaž Grom - Sam, za... - 09 N.N. -Ne Iz Sadu -Some Spatter Left -Extra space -Antichrist -Mono Scarves - Per fhodo ali kot niša -Nagauar -voices -Vid Drašler - Kramljanja - 07 7. -Untold Truths -Whale Ft -S.L.C. -Bad Girls (rework) -Jean-Luc Guionnet & Samo Kutin - Kopaš - 06 06 -Tomaž Grom - Sam, za... - 06 P.K. -Ligature part I -Magie de la Pleine Lune -Genetska Modifikacija Organskih Celic -Typhaceae -Tomaž Grom - Sam, za... - 08 P.Č. -Uroš Rojko - Splitting - 03 Chiton (2003) -Chorus 1 (SC) -things i decided against -Zlatko Kaučič, Tomaž Grom - Torn Memories Of Folklore - Raztrgana folklora spomina - 10 Knitting Traps -Zulu -Weakest Parts of Society -Fightinsect -Irena Z. Tomažin - Cmok v grlu - Lump In The Throat - 12 Zataknjeno za zobmi -Gfuel -Genetic Architecture Of The Evolutionary Selection -Samo Kutin and Martin Küchen - Stutter And Strike - 03 Svete gore -My Dentist -coupdotexe (mapalma remix) -Jean-Luc Guionnet & Samo Kutin - Kopaš - 05 05 -Inside Magog (Burp remix) -KIURIKI - Killem All -Oholo! - Mnogobolje - 01 Blind man's buff -Moonolog -save as -Seven Day Pill Box -conversation suppresed -Hume -The Stabbing Party -Rib Vaulting -Oscillopsia -Preludium General Ensemble (Outtake) -Non-Intersected Flight -Samo Kutin and Martin Küchen - Stutter And Strike - 08 Uncaged (take 1) -Sub Persona VI -Of Blood -Mono Scarves - Kaj pa tisti rizling -Scena Prologue -Dusted -Transition (Excerpt) -Fluid Ruin -Stop That Noise -Zlatko Kaučič, Tomaž Grom - Torn Memories Of Folklore - Raztrgana folklora spomina - 10 Knitting Traps -Brazen Bull -Birth of a planet -KIURIKI - Pudl -Persecutors Persecuted (Act III) -Zlatko Kaučič, Tomaž Grom - The Ear Is The Shadow Of The Eye - 08 Two Right Hands - Dve desni roki -Domen Gnezda - Misnomer II - 07 Misnomer 29 -Matej Bonin - Gymnastics of non-sense II - 06 Part VI -Seven Day Pill Box -KIURIKI - Killem All -Asphalt -Clear Love -Jošt Drašler - The Balloon Catcher - 09 Grandma Balloon -Vinko Globokar - Dialog - 05 Dialog über Luft (1994) -The Look -Kampak -Sterne Frau -Opaque Euphoria -Bojana Šaljić Podešva - Dialog - 03 Meditacija o bližini (2008) -Oholo! - Mnogobolje - 05 Influenced -a6 -Tone Pavček & Tomaž Grom - Sonce in sončice po vsem svetu - 01 Pogumna Lenka -Action XIX -Undulipodium -Stefan Beyer - Dialog - 02 Notoriously Pyratisch (2008) -Irena Z. Tomažin - Cmok v grlu - Lump In The Throat - 13 Drobovje ust -Oholo! - Mnogobolje - 03 Shards II. -TiTiTi (Jure Boršič, Jošt Drašler, Vid Drašler) - Štafelaj - 06 Peš (On Foot) -Asphalt -The Look -Cyclidox -Samo Kutin and Martin Küchen - Stutter And Strike - 09 Hjärtspion -Carve4 -Tomaž Grom - Sam, za... - 01 T.G.V.S. -Altobar -Vinko Globokar - Splitting - 07 Vinko Globokar- Dialogue about water, for acoustic and electric guitar (1994) -Zlatko Kaučič, Tomaž Grom - The Ear Is The Shadow Of The Eye - 04 Forgetting Won't Help - Pozaba ne pomaga -Dromon -Amena -Jaymups -Domen Gnezda - Misnomer II - 04 Misnomer 26 -Hanged Mans Paradox -Land -Vid Drašler - Kramljanja - 03 3. -BE CREEP - LIVE -death rattle_var.2-4 -make this title easy to remember -Action XVIII -Zlatko Kaučič, Tomaž Grom - Torn Memories Of Folklore - Raztrgana folklora spomina - 04 Slightly Used Machine -Arboreal -Slika 1 -Canote -Opaque Euphoria -Samo Kutin - Plovilo - 06 A -Osoje 2k5 -Domen Gnezda - Misnomer II - 10 Misnomer 32 -Sub Persona X -When Ballon And Door Collide Pt2 -annihilation_var. 0 -Zlatko Kaučič, Tomaž Grom - The Ear Is The Shadow Of The Eye - 11 Sound Out - Zvonka pavza -Stabit -Lenticular -debris of motus_var.1 -Vid Drašler - Kramljanja - 03 3. -Loveful -TiTiTi (Jure Boršič, Jošt Drašler, Vid Drašler) - Štafelaj - 03 V nedogled (Ad Infinitum) -Slika 3 -YuWrong -Offset -Tomaž Grom - Sam, za... - 01 T.G.V.S. -Jean-Luc Guionnet & Samo Kutin - Kopaš - 02 02 -My Sweet.Com -Irena Z. Tomažin - Cmok v grlu - Lump In The Throat - 15 Črna ovca -Action XXI -Koldunya -Love Emergency -Tomaž Grom - Sam, za... - 06 P.K. -Jean-Luc Guionnet & Samo Kutin - Kopaš - 02 02 -Oholo! - Mnogobolje - 03 Shards II. -Dobro Jutro -Tilt - Tilt - 06 Ljubljana 3 -Domen Gnezda - Misnomer II - 13 Misnomer 35 -Mono Scarves - Ogledala za gledanje v preteklost -I Dreams of Others -Brazen Bull -Crisp Ursa Minor -Ultrascan -Loveful -Plastik Elastik -Zlatko Kaučič, Tomaž Grom - The Ear Is The Shadow Of The Eye - 12 Battling For A Title - Za naslov se boriva -skull autopsy_var.2b-6 -Samo Kutin - Plovilo - 05 Nič -Irena Z. Tomažin - Cmok v grlu - Lump In The Throat - 13 Drobovje ust -Gravitacija -Scena Prologue -Domen Gnezda - Misnomer II - 13 Misnomer 35 -Action VII -Reflex Action -BE CREEP - Burnt Dreams -Samo Kutin - Plovilo - 02 Bliže -Surprise! No Magic -Zlatko Kaučič, Tomaž Grom - The Ear Is The Shadow Of The Eye - 11 Sound Out - Zvonka pavza -Dromon -Kampak -NTU -Soil Stone -Chorus 1 (SC) -Action IX -Action XVI -Somnambulism -Passage -Genetic Architecture Of The Evolutionary Selection -Nagauar -Tone Pavček & Tomaž Grom - Sonce in sončice po vsem svetu - 11 Înfiat din greşeală (Posvojen po pomoti) -Vid Drašler - Kramljanja - 05 5. -Keep An Eye On That Ice Cream -Zlatko Kaučič, Tomaž Grom - The Ear Is The Shadow Of The Eye - 07 Cargo - Tovor -Spider Move -Mistif -Mono Scarves - Demoklejev meč in rivbiška palica dva v enem -Domen Gnezda - Misnomer II - 15 Misnomer 37 -Deabody -Atlatl -Jošt Drašler - The Balloon Catcher - 05 Yellow Balloon -Genetska Modifikacija Organskih Celic -My Sweet.Com -Amyl Nitrite -My Dentist -Irena Z. Tomažin - Cmok v grlu - Lump In The Throat - 14 Klic meduze -TiTiTi (Jure Boršič, Jošt Drašler, Vid Drašler) - Štafelaj - 02 Spone (Chains) -Crossing The Rubicon -Magie de la Pleine Lune -prpld crossover_var.3b -Vinko Globokar - Dialog - 05 Dialog über Luft (1994) -De Sica -The Look -Echo-Recoil -Offset -Passage -Fluid Ruin -Vid Drašler - Kramljanja - 07 7. -Tomaž Grom - Sam, za... - 05 G.V. -Vorspiel fur Traurige Madchen -Domen Gnezda - Misnomer II - 10 Misnomer 32 -Weakest Parts of Society -Parallax Division -coupdotexe (mapalma remix) -Preludium General Ensemble (Outtake) -Sub Persona IX -things i decided against -Action XV -Samo Kutin - Plovilo - 02 Bliže -Vrtnice -Mistif -Zlatko Kaučič, Tomaž Grom - The Ear Is The Shadow Of The Eye - 05 Goldfish - Zlata ribica -Altobar -Atlatl -When Ballon And Door Collide -Action XIX -Vid Drašler - Kramljanja - 01 1. -Samo Kutin and Martin Küchen - Stutter And Strike - 06 Planota -The Stabbing Party -Trojnik (Cene Resnik, Tomaž Grom, Vid Drašler) - Moje uho ima ostre robove - 03 03 -Pudl -Cyborg Not Cyborg -Spurt -Passage -Cyborg Not Cyborg -Jošt Drašler - The Balloon Catcher - 01 Blue Balloon -None -Samo Kutin - Plovilo - 02 Bliže -Vrtnice -Trojnik (Cene Resnik, Tomaž Grom, Vid Drašler) - Moje uho ima ostre robove - 10 10 -Sun Gong Moon Song -Somnambulism -Vorspiel fur Traurige Madchen -Dolos -Afternoon: Panovec -Trojnik (Cene Resnik, Tomaž Grom, Vid Drašler) - Moje uho ima ostre robove - 07 07 -Pear of Anguish -Tomaž Grom & Seijiro Murayama - Nepretrganost - 01 Ena. -Sense of nonsense -Offset V2 -Vid Drašler - Kramljanja - 01 1. -Action III -Ambinet -Dnevnik -5000000000 YRS -Blade Runes -YuWrong -postcell -Color of Ice -anticipation_var.1-1 -Tomaž Grom - Sam, za... - 07 S.M. -Trojnik (Cene Resnik, Tomaž Grom, Vid Drašler) - Moje uho ima ostre robove - 08 08 -Mercurius & the Ram -Head Storm -Tone Pavček & Tomaž Grom - Sonce in sončice po vsem svetu - 10 Ninulla Çapkanёve (Čenčačeva uspavanka) -Smaidoša Mēnesnīca -Growing Destruction -Summer Peach Girl -chan debris_var.2a -Inside Magog (Burp remix) -Jošt Drašler - The Balloon Catcher - 06 Green Balloon -Jean-Luc Guionnet & Samo Kutin - Kopaš - 02 02 -Trojnik (Cene Resnik, Tomaž Grom, Vid Drašler) - Moje uho ima ostre robove - 10 10 -Gfuel -Action IV -Sterne Frau -Cyborg Not Cyborg -Tilt - Tilt - 07 Ljubljana 4 -Scena Prologue -Benocci 2004 -Samo Kutin - Plovilo - 06 A -Oholo! - Mnogobolje - 03 Shards II. -Outro -Magie de la Pleine Lune -wudang_var.3-7 -Whale Ft -Surprise! No Magic -一点一滴 -Fluid Ruin -Naval Cry -Lussid -Vinko Globokar - Splitting - 07 Vinko Globokar- Dialogue about water, for acoustic and electric guitar (1994) -Tomaž Grom - Sam, za... - 09 N.N. -Weakest Parts of Society -unum -Action XVII -Brazen Bull -Sun Gong Moon Song -Zlatko Kaučič, Tomaž Grom - Torn Memories Of Folklore - Raztrgana folklora spomina - 02 Feeding The Distance Between Us -Of Blood -The Oppressed 1 (Outtake) -Pilsētas Likums -Modem -I.F. II Metal Rach -KIURIKI - Pudl -Oholo! - Mnogobolje - 03 Shards II. -Slika 1 -02 Confined Movement- B -shifu_var.3a-8 -Regeneracijska Sonda -Loveful -Asphyxia -De Sica -Soloveikia Moj -Trojnik (Cene Resnik, Tomaž Grom, Vid Drašler) - Moje uho ima ostre robove - 06 06 -When Ballon And Door Collide -Domen Gnezda - Misnomer II - 13 Misnomer 35 -Peter Ablinger - Splitting - 06 Das Buch der Gesänge, no. 88 (Bus ride) -Enslaved Population (DJ Surgeon remix) -conversation suppresed -Harlequin -coupdotexe -Explored -TiTiTi (Jure Boršič, Jošt Drašler, Vid Drašler) - Štafelaj - 05 Čačkarije (Scribbles) -The Oppressed 2 (SC) -Tomaž Grom & Seijiro Murayama - Nepretrganost - 01 Ena. -1disrupt3violence1monopoly2 -Tomaž Grom - Sam, za... - 04 L.Z. -Misoneism -wudang_var.3-7 -Zlatko Kaučič, Tomaž Grom - Torn Memories Of Folklore - Raztrgana folklora spomina - 10 Knitting Traps -Stale Futures -Action I -Trojnik (Cene Resnik, Tomaž Grom, Vid Drašler) - Moje uho ima ostre robove - 06 06 -Speshlafer -Domen Gnezda - Misnomer II - 03 Misnomer 25 -Crossing The Rubicon -Canote -Action III -Deabody -Palimpsest V2 -chan debris_var.2b -Oholo! - Mnogobolje - 03 Shards II. -Zink -things i decided against -Surprise! No Magic -Irena Z. Tomažin - Cmok v grlu - Lump In The Throat - 11 Pesem monologa -Sirene -S.L.C. -Samo Kutin - Plovilo - 07 Sejalci -Multiply feat. N'toko -Sub Persona V -aching -BE CREEP - LIVE -Todorci2 -Metrognome -Intro -Nost -Vinko Globokar - Splitting - 07 Vinko Globokar- Dialogue about water, for acoustic and electric guitar (1994) -Mercurius & the Ram -Tilt - Tilt - 06 Ljubljana 3 -Trials -Tone Pavček & Tomaž Grom - Sonce in sončice po vsem svetu - 02 Sončna idila -a6 -H Light (Wodan remix) -Land -Her Boat -Sub Persona V -Strand Looper -Inchoate Crimes -Pool Reflection -Untold Truths -Tilt - Tilt - 05 Ljubljana 2 -The Mother And Chorus (Act II) -Vid Drašler - Kramljanja - 07 7. -Regeneracijska Sonda -Apropos -TiTiTi (Jure Boršič, Jošt Drašler, Vid Drašler) - Štafelaj - 02 Spone (Chains) -Sunsunsun -Samo Kutin and Martin Küchen - Stutter And Strike - 05 Hammaröga -Dolos -prpld crossover_var.3b -Vinko Globokar - Splitting - 07 Vinko Globokar- Dialogue about water, for acoustic and electric guitar (1994) -Cyberpunk Tendencies +don't tell me what i like Nothing Concealed -Jean-Luc Guionnet & Samo Kutin - Kopaš - 05 05 -Sub Persona IX -Tomaž Grom - Sam, za... - 05 G.V. -My Sweet.Com -coupdotexe (mapalma remix) -Hollogramma -Kampak -Domen Gnezda - Misnomer II - 17 Misnomer 39 -Sub Persona X -postcell -Zlatko Kaučič, Tomaž Grom - The Ear Is The Shadow Of The Eye - 09 Though Ashtray (Pepelnik), I Still Like To Read Your Poems -TiTiTi (Jure Boršič, Jošt Drašler, Vid Drašler) - Štafelaj - 06 Peš (On Foot) -a3 -Paperwork pt.3 -Action IV -won't work for free anymore -Side A / KIKIRIKI - Rosy Light -Sweet Sandy -Samo Kutin and Martin Küchen - Stutter And Strike - 06 Planota -Finka -Vertex -Multiply feat. N'toko -Irena Z. Tomažin - Cmok v grlu - Lump In The Throat - 12 Zataknjeno za zobmi -KIURIKI - Pudl -Jean-Luc Guionnet & Samo Kutin - Kopaš - 05 05 -Tilt - Tilt - 04 Ljubljana 1 -Zulu -Trojnik (Cene Resnik, Tomaž Grom, Vid Drašler) - Moje uho ima ostre robove - 03 03 -Slika 5 -Human Body Game -Infinite values -Koldunya -Untitled -The twelve and the dead -Land -Mono Scarves - Bralni stroj Korenje -Sub Persona V -Chorus 1 (SC) -My Dentist -TiTiTi (Jure Boršič, Jošt Drašler, Vid Drašler) - Štafelaj - 02 Spone (Chains) -postcell -Hollogramma -Waiting for Distor -Untold Truths -Crushing Trauma -prpld crossover_var.3b -Entropy -Zlatko Kaučič, Tomaž Grom - The Ear Is The Shadow Of The Eye - 12 Battling For A Title - Za naslov se boriva -TiTiTi (Jure Boršič, Jošt Drašler, Vid Drašler) - Štafelaj - 06 Peš (On Foot) -Radikal -Arboreal -Samo Kutin - Plovilo - 05 Nič -Jean-Luc Guionnet & Samo Kutin - Kopaš - 02 02 -Genome Autism Pt. 1 -Moni Harm -Lenticular -coupdotexe (mapalma remix) -Brazen Bull -a3 -Divine -Vertex -Side B / NIHILISTIC FRONT - Balkan Nihilism -Strand Looper -Nebulae Tree -Multiply feat. N'toko -02 Confined Movement- B -Sotto La Pelle -a5 -Laszlo -Trojnik (Cene Resnik, Tomaž Grom, Vid Drašler) - Moje uho ima ostre robove - 11 11 -Amyl Nitrite -Oholo! - Mnogobolje - 03 Shards II. -Osoje 2k5 -Heretics Fork -biking, i look back -make this title easy to remember -Enslaved Population (DJ Surgeon remix) -Sub Persona VI -Cyborg Not Cyborg -What ? -Samo Kutin and Martin Küchen - Stutter And Strike - 01 Uncaged (take 2) -Regeneracijska Sonda -Deabody -TiTiTi (Jure Boršič, Jošt Drašler, Vid Drašler) - Štafelaj - 01 Slikar (Painter) -Benocci 2004 -Untold Truths -Hydrozone -Action XIX -Sub Persona I -Zlatko Kaučič, Tomaž Grom - Torn Memories Of Folklore - Raztrgana folklora spomina - 01 Each In His Own Municipality -Smaidoša Mēnesnīca -Juice 10 -Vid Drašler - Kramljanja - 06 6. -Nost -Vrtnice -Untold Truths -Paperwork pt.3 -Hydrozone -Action XIX -+ [Excerpt] -Carve4 -Irena Z. Tomažin - Cmok v grlu - Lump In The Throat - 15 Črna ovca -stepbystep -Jošt Drašler - The Balloon Catcher - 04 Bouncing Balloon -Crossing The Rubicon -Inchoate Crimes -The navigators -Tomaž Grom & Seijiro Murayama - Nepretrganost - 05 Pet. -TiTiTi (Jure Boršič, Jošt Drašler, Vid Drašler) - Štafelaj - 05 Čačkarije (Scribbles) -Action IV -Explored -Samo Kutin and Martin Küchen - Stutter And Strike - 04 Orans -Nebulae Tree -Trojnik (Cene Resnik, Tomaž Grom, Vid Drašler) - Moje uho ima ostre robove - 01 01 -Zlatko Kaučič, Tomaž Grom - The Ear Is The Shadow Of The Eye - 05 Goldfish - Zlata ribica -Amena -debris of motus_var.1 -Moni Harm -Vertex -Action IX -一点一滴 -Slika 3 -Trojnik (Cene Resnik, Tomaž Grom, Vid Drašler) - Moje uho ima ostre robove - 07 07 -In His Prison (Outtake) -debris of motus_var.1b -Domen Gnezda - Misnomer II - 02 Misnomer 24 -Samo Kutin - Plovilo - 08 Lišaji -Liqweed -The navigators -Seven Day Pill Box -Summer Peach Girl -Impersonal Again -Domen Gnezda - Misnomer II - 06 Misnomer 28 -Tilt - Tilt - 01 Alicante 1 -Jošt Drašler - The Balloon Catcher - 05 Yellow Balloon -Vid Drašler - Kramljanja - 07 7. -Hanged Mans Paradox -Madmen -a4 -Finka -Naval Cry -Zlatko Kaučič, Tomaž Grom - Torn Memories Of Folklore - Raztrgana folklora spomina - 08 Almost The Same -Action IX -Nagual -Je Šel Brat S Sestro -Cyberpunk Tendencies -Zlatko Kaučič, Tomaž Grom - The Ear Is The Shadow Of The Eye - 06 Cinema Ear - - Kino uho -Matej Bonin - Gymnastics of non-sense II - 04 Part IV -Tomaž Grom - Sam, za... - 01 T.G.V.S. -Jewels -Samo Kutin and Martin Küchen - Stutter And Strike - 03 Svete gore -Jean-Luc Guionnet & Samo Kutin - Kopaš - 05 05 -won't work for free anymore -death rattle_var.2-4 -Gravitacija -Zulu -Human Body Game -you think you're so much better -ethera (dome) -Samo Kutin - Plovilo - 01 Platno -The twelve and the dead -Sweet Sandy -Dobro Jutro -Atlatl -Samo Kutin and Martin Küchen - Stutter And Strike - 02 Fishing In Siphon -Zlatko Kaučič, Tomaž Grom - The Ear Is The Shadow Of The Eye - 12 Battling For A Title - Za naslov se boriva -Offset -Growing Destruction -Head Storm +Action XV +Leather Wings +Loss of Consciousness +Strenuous Effort Irena Z. Tomažin - Cmok v grlu - Lump In The Throat - 14 Klic meduze -Samo Kutin and Martin Küchen - Stutter And Strike - 05 Hammaröga -Radikal -whtend leftover_var.3 -Atlatl -a2 -Matej Bonin - Gymnastics of non-sense II - 05 Part V -Zlatko Kaučič, Tomaž Grom - Torn Memories Of Folklore - Raztrgana folklora spomina - 08 Almost The Same +Hunahpu & Xbalanque +decrepitation_var.1a-2 +Speshlafer +PSH