| @@ -0,0 +1,106 @@ | |||||
| :root{ | |||||
| --one-dpi: 72px; | |||||
| --dd-blue: rgb(0,42,255); | |||||
| } | |||||
| .dd-player{ | |||||
| width: 25vw; | |||||
| height: 100vh; | |||||
| position:fixed; | |||||
| top: 0px; | |||||
| background-color: white; | |||||
| right:0px; | |||||
| color: black; | |||||
| padding-top: var(--one-dpi); | |||||
| padding-bottom: var(--one-dpi); | |||||
| display: flex; | |||||
| flex-direction: column; | |||||
| justify-content: space-between; | |||||
| } | |||||
| .collapsed{ | |||||
| display: none; | |||||
| } | |||||
| .dd-player-switch{ | |||||
| position :fixed; | |||||
| bottom: 0; | |||||
| right: 0; | |||||
| width: var(--one-dpi); | |||||
| height:var(--one-dpi); | |||||
| background-color: white; | |||||
| cursor: pointer; | |||||
| } | |||||
| .dd-player-switch.opened{ | |||||
| background-color: var(--dd-blue); | |||||
| } | |||||
| .dd-player h3 { | |||||
| font-size: 1rem; | |||||
| /*margin-top: calc(2 * var(--one-dpi));*/ | |||||
| margin: calc(var(--one-dpi) / 2); | |||||
| /* margin-bottom : var(--one-dpi); */ | |||||
| } | |||||
| .dd-player ul { | |||||
| margin-left : calc(var(--one-dpi) / 2); | |||||
| color: var(--dd-blue); | |||||
| font-size: 1.5rem; | |||||
| } | |||||
| .dd-player ul li img{ | |||||
| width:24px; | |||||
| height:24px; | |||||
| margin-right: 12px; | |||||
| } | |||||
| .playing{ | |||||
| font-weight: bold; | |||||
| color : black; | |||||
| } | |||||
| .progress-wrap{ | |||||
| display:flex; | |||||
| width: 100%; | |||||
| justify-content: space-around; | |||||
| } | |||||
| .progress-wrap .time-info{ | |||||
| font-size:0.66rem; | |||||
| display: flex; | |||||
| justify-content: center; | |||||
| /* align-items: center; */ | |||||
| } | |||||
| progress{ | |||||
| display: inline; | |||||
| /* margin: 0 calc(var(--one-dpi) / 2); */ | |||||
| /* max-width: calc(100% - var(--one-dpi)); */ | |||||
| height: 10px; | |||||
| width:66%; | |||||
| } | |||||
| #play-button{ | |||||
| max-width: calc(var(--one-dpi) / 2); | |||||
| max-height: calc(var(--one-dpi) / 2); | |||||
| margin: calc(var(--one-dpi) / 2); | |||||
| } | |||||
| progress::-moz-progress-bar{ | |||||
| background-color: black; | |||||
| } | |||||
| progress{ | |||||
| background-color: #rgba(200,200,200,0.5); | |||||
| } | |||||
| .dd-player ul li, #play-button{ | |||||
| cursor : pointer; | |||||
| } | |||||
| #wrap-playlist{ | |||||
| flex: 1; | |||||
| } | |||||
| @@ -0,0 +1,62 @@ | |||||
| *{ | |||||
| margin: 0; | |||||
| padding: 0; | |||||
| } | |||||
| section{ | |||||
| height: 100vh; | |||||
| } | |||||
| section:nth-of-type(odd){ | |||||
| background-color: white; | |||||
| color: blue; | |||||
| } | |||||
| section:nth-of-type(even){ | |||||
| background-color: blue; | |||||
| color: white; | |||||
| } | |||||
| .cover{ | |||||
| background : url(../images/cover.png) no-repeat center center; | |||||
| } | |||||
| .one-dpi{ | |||||
| position : fixed; | |||||
| bottom: 0; | |||||
| right: 0; | |||||
| width : 72px; | |||||
| height: 72px; | |||||
| background-color: black; | |||||
| z-index: 10; | |||||
| cursor: pointer; | |||||
| } | |||||
| .one-dpi.clicked { | |||||
| background : white; | |||||
| } | |||||
| .player { | |||||
| position : fixed; | |||||
| right : 0; | |||||
| top : 0; | |||||
| height : 100vh; | |||||
| width : 25vw; | |||||
| color : black; | |||||
| z-index: 5; | |||||
| background-color: black; | |||||
| color: white; | |||||
| padding: 25px; | |||||
| } | |||||
| .player ul { | |||||
| list-style-type: none; | |||||
| } | |||||
| .player li { | |||||
| height: 10vh; | |||||
| display : flex; | |||||
| align-items: center; | |||||
| } | |||||
| .hidden{ | |||||
| display: none; | |||||
| } | |||||
| @@ -2,20 +2,20 @@ var current = undefined | |||||
| const progressMargin = 50; | const progressMargin = 50; | ||||
| var progress = undefined; | var progress = undefined; | ||||
| window.addEventListener('DOMContentLoaded', (event) => { | window.addEventListener('DOMContentLoaded', (event) => { | ||||
| progress = document.getElementById('player-progress'); | |||||
| document.getElementById('player-progress').addEventListener('click', (e) => { | |||||
| if(current){ | |||||
| let media = current.getElementsByTagName('audio')[0]; | |||||
| media.currentTime = e.layerX * media.duration / progress.offsetWidth; | |||||
| } | |||||
| }); | |||||
| let toggler = document.getElementById('player-toggler'); | |||||
| toggler.setAttribute('title','afficher/masquer la liste des morceaux'); | |||||
| toggler.addEventListener('click', (e) => { | |||||
| document.getElementsByTagName('ul')[0].classList.toggle('invisible'); | |||||
| }) | |||||
| // progress = document.getElementById('player-progress'); | |||||
| // document.getElementById('player-progress').addEventListener('click', (e) => { | |||||
| // if(current){ | |||||
| // let media = current.getElementsByTagName('audio')[0]; | |||||
| // media.currentTime = e.layerX * media.duration / progress.offsetWidth; | |||||
| // | |||||
| // } | |||||
| // }); | |||||
| // | |||||
| // let toggler = document.getElementById('player-toggler'); | |||||
| // toggler.setAttribute('title','afficher/masquer la liste des morceaux'); | |||||
| // toggler.addEventListener('click', (e) => { | |||||
| // document.getElementsByTagName('ul')[0].classList.toggle('invisible'); | |||||
| // }) | |||||
| }); | }); | ||||
| @@ -58,3 +58,8 @@ function prettyDuration(duration) { | |||||
| sec = sec >= 10 ? sec : '0' + sec; | sec = sec >= 10 ? sec : '0' + sec; | ||||
| return min + ':' + sec; | return min + ':' + sec; | ||||
| } | } | ||||
| function togglePlayer(playerId, dpiId){ | |||||
| document.getElementById(playerId).classList.toggle('hidden'); | |||||
| document.getElementById(dpiId).classList.toggle('clicked'); | |||||
| } | |||||
| @@ -1,124 +0,0 @@ | |||||
| @font-face { | |||||
| font-family: "NotoSans"; | |||||
| src: url(./fonts/noto-sans/NotoSans-Regular.ttf); | |||||
| } | |||||
| :root { | |||||
| --main-bg-color: rgba(255,255,255,0.7); | |||||
| } | |||||
| *{ | |||||
| margin: 0; | |||||
| padding: 0; | |||||
| box-sizing: border-box; | |||||
| } | |||||
| html{ | |||||
| font-family: NotoSans; | |||||
| color: black; | |||||
| } | |||||
| html, body{ | |||||
| width: 100vw; | |||||
| height: 100vh; | |||||
| background-color: black; | |||||
| } | |||||
| body{ | |||||
| display: flex; | |||||
| align-items: center; | |||||
| justify-content: center; | |||||
| } | |||||
| .track-list{ | |||||
| width: 100vh; | |||||
| height: 100vh; | |||||
| background-image: url(../cover.jpg); | |||||
| background-size: cover; | |||||
| background-repeat: no-repeat; | |||||
| display: flex; | |||||
| flex-direction: column; | |||||
| align-items: center; | |||||
| justify-content: center; | |||||
| } | |||||
| ul.invisible{ | |||||
| display: none; | |||||
| } | |||||
| ul{ | |||||
| position: fixed; | |||||
| right:0px; | |||||
| top:0px; | |||||
| padding-top: 30px; | |||||
| list-style-type: none; | |||||
| background-color: var(--main-bg-color); | |||||
| height: 100vh; | |||||
| font-size: 0.75rem; | |||||
| } | |||||
| div#player-toggler{ | |||||
| position: fixed; | |||||
| top: 0px; | |||||
| right:0px; | |||||
| margin-top:2px; | |||||
| margin-right: 2px; | |||||
| z-index: 10; | |||||
| cursor: pointer; | |||||
| } | |||||
| li{ | |||||
| /*background-color: var(--main-bg-color);*/ | |||||
| padding: 2px; | |||||
| } | |||||
| li{ | |||||
| margin-top:2px; | |||||
| display: flex; | |||||
| justify-content: center; | |||||
| align-items: center; | |||||
| } | |||||
| button{ | |||||
| background-color: rgba(0,0,0,0); | |||||
| border: none; | |||||
| margin-left: 5px; | |||||
| cursor: pointer; | |||||
| } | |||||
| div#player-toggler > img{ | |||||
| width: 24px; | |||||
| height: 24px; | |||||
| } | |||||
| button img{ | |||||
| width: 16px; | |||||
| height: 16px; | |||||
| } | |||||
| progress::-moz-progress-bar { | |||||
| background-color: black !important; | |||||
| } | |||||
| #player-progress{ | |||||
| position: fixed; | |||||
| left:0; | |||||
| top:0; | |||||
| height: 1vw; | |||||
| width: 100vh; | |||||
| background-color: var(--main-bg-color); | |||||
| border: none; | |||||
| border-top:2px solid var(--main-bg-color); | |||||
| border-bottom:2px solid var(--main-bg-color); | |||||
| cursor: pointer; | |||||
| transform: rotate(90deg); | |||||
| transform-origin: top left; | |||||
| margin-left: 1vw; | |||||
| /* margin-top:calc(50vh - 0.5vw); | |||||
| margin-left:0; */ | |||||
| } | |||||
| #time-info{ | |||||
| visibility: hidden; | |||||
| position: fixed; | |||||
| bottom: 2px; | |||||
| left: 1%; | |||||
| padding-left: 2px; | |||||
| color:white; | |||||
| font-size: 0.6rem; | |||||
| } | |||||
| @@ -1,67 +1,70 @@ | |||||
| import eyed3 | import eyed3 | ||||
| import os | import os | ||||
| import sys | import sys | ||||
| import shutil | import shutil | ||||
| from html_writer import Html | from html_writer import Html | ||||
| #TracksDir class definition | |||||
| # TracksDir class definition | |||||
| class TracksDir: | class TracksDir: | ||||
| def __init__(self, trackFiles): | |||||
| self.trackFiles = trackFiles | |||||
| def __init__(self, track_files): | |||||
| self.trackFiles = track_files | |||||
| #HTML Output | |||||
| def toHTML(self): | |||||
| # HTML Output | |||||
| def to_html(self): | |||||
| head = Html() | head = Html() | ||||
| head.self_close_tag('meta', attributes=dict(charset='utf-8')) | head.self_close_tag('meta', attributes=dict(charset='utf-8')) | ||||
| head.self_close_tag('link', attributes=dict(href='assets/labelize.css',rel='stylesheet')) | |||||
| head.self_close_tag('link', attributes=dict(href='assets/labelize.css', rel='stylesheet')) | |||||
| body = Html() | body = Html() | ||||
| trackNumber = 0 | |||||
| with body.tag('div',classes=['track-list']): | |||||
| #body.tag_with_content('Track List', name='h2') | |||||
| with body.tag('div',attributes=dict(id='player-toggler')): | |||||
| track_number = 0 | |||||
| with body.tag('div', classes=['track-list']): | |||||
| # body.tag_with_content('Track List', name='h2') | |||||
| with body.tag('div', attributes=dict(id='player-toggler')): | |||||
| body.self_close_tag('img', attributes=dict(src='assets/labelize.png')) | body.self_close_tag('img', attributes=dict(src='assets/labelize.png')) | ||||
| with body.tag('ul') as list: | with body.tag('ul') as list: | ||||
| for t in self.trackFiles: | for t in self.trackFiles: | ||||
| trackNumber = trackNumber + 1 | |||||
| trackId = 'track-' + str(trackNumber) | |||||
| audiofile = eyed3.load("build/" + t) | |||||
| track_number = track_number + 1 | |||||
| track_id = 'track-' + str(track_number) | |||||
| audio_file = eyed3.load("build/" + t) | |||||
| with body.tag('li') as li: | with body.tag('li') as li: | ||||
| print(audiofile.tag.title) | |||||
| li += str(audiofile.tag.title or 'untitled')+ ' - ' | |||||
| li += str(audiofile.tag.album or 'untitled')+ ' - ' | |||||
| li += audiofile.tag.artist | |||||
| with body.tag('button',attributes=dict(onclick="togglePlay(this)")): | |||||
| print(audio_file.tag.title) | |||||
| li += str(audio_file.tag.title or 'untitled') + ' - ' | |||||
| li += str(audio_file.tag.album or 'untitled') + ' - ' | |||||
| li += audio_file.tag.artist | |||||
| with body.tag('button', attributes=dict(onclick="togglePlay(this)")): | |||||
| body.self_close_tag('img', attributes=dict(src='assets/play.png')) | body.self_close_tag('img', attributes=dict(src='assets/play.png')) | ||||
| with body.tag('audio', attributes=dict(src=t, id=trackId, | |||||
| ontimeupdate="updateProgress(this)")) as audio: | |||||
| audio+="Your browser does not support the audio element" | |||||
| with body.tag('audio', attributes=dict(src=t, id=track_id, | |||||
| ontimeupdate="updateProgress(this)")) as audio: | |||||
| audio += "Your browser does not support the audio element" | |||||
| # with body.tag('canvas',attributes=dict(id='player-progress')) as canvas: | # with body.tag('canvas',attributes=dict(id='player-progress')) as canvas: | ||||
| # canvas += "player's progress bar" | # canvas += "player's progress bar" | ||||
| with body.tag('progress',attributes=dict(id='player-progress',value='0')) as canvas: | |||||
| canvas += "player's progress bar" | |||||
| with body.tag('div',attributes=dict(id='time-info')) as timeInfo: | |||||
| with body.tag('progress', attributes=dict(id='player-progress', value='0')) as canvas: | |||||
| canvas += "player's progress bar" | |||||
| with body.tag('div', attributes=dict(id='time-info')) as timeInfo: | |||||
| timeInfo += '00:00' | timeInfo += '00:00' | ||||
| with body.tag('script', attributes=dict(src='assets/labelize.js')) as script: | with body.tag('script', attributes=dict(src='assets/labelize.js')) as script: | ||||
| script+=""#script tag is not added without that trick | |||||
| script += "" # script tag is not added without that trick | |||||
| return Html.html_template(head, body).to_raw_html(indent_size=2) | return Html.html_template(head, body).to_raw_html(indent_size=2) | ||||
| # script usage function | # script usage function | ||||
| def usage(): | def usage(): | ||||
| print('USAGE : labelize.py [inputDirectory] [outputDirectory]') | print('USAGE : labelize.py [inputDirectory] [outputDirectory]') | ||||
| # script beginning | # script beginning | ||||
| arguments = len(sys.argv) - 1 | arguments = len(sys.argv) - 1 | ||||
| if(arguments != 2): | |||||
| if arguments != 2: | |||||
| usage() | usage() | ||||
| sys.exit(2) | sys.exit(2) | ||||
| inputDirectory = sys.argv[1] | |||||
| outputDirectory = sys.argv[2] | |||||
| input_directory = sys.argv[1] | |||||
| output_directory = sys.argv[2] | |||||
| def copyDirectory(src, dest): | |||||
| def copy_directory(src, dest): | |||||
| try: | try: | ||||
| shutil.copytree(src, dest) | shutil.copytree(src, dest) | ||||
| except shutil.Error as e: | except shutil.Error as e: | ||||
| @@ -69,23 +72,24 @@ def copyDirectory(src, dest): | |||||
| except OSError as e: | except OSError as e: | ||||
| print('Directory not copied. Error: %s' % e) | print('Directory not copied. Error: %s' % e) | ||||
| #removes existing build directory if exists | |||||
| if os.path.isdir(outputDirectory): | |||||
| shutil.rmtree(outputDirectory) | |||||
| #copies source files in the build directory | |||||
| copyDirectory(inputDirectory, 'build') | |||||
| # removes existing build directory if exists | |||||
| if os.path.isdir(output_directory): | |||||
| shutil.rmtree(output_directory) | |||||
| # copies source files in the build directory | |||||
| copy_directory(input_directory, 'build') | |||||
| #copies assets in the build directory | |||||
| copyDirectory('assets', outputDirectory + '/assets') | |||||
| # copies assets in the build directory | |||||
| copy_directory('assets', output_directory + '/assets') | |||||
| for root, dirs, files in os.walk(inputDirectory): | |||||
| for root, dirs, files in os.walk(input_directory): | |||||
| trackFiles = [] | trackFiles = [] | ||||
| for f in files: | for f in files: | ||||
| if f.lower().endswith(('.mp3', '.wav', '.ogg')): | if f.lower().endswith(('.mp3', '.wav', '.ogg')): | ||||
| trackFiles.append(f) | trackFiles.append(f) | ||||
| td = TracksDir(trackFiles) | td = TracksDir(trackFiles) | ||||
| f = open(outputDirectory + "/index.html","w+") | |||||
| f.write(td.toHTML()) | |||||
| f = open(output_directory + "/index.html", "w+") | |||||
| f.write(td.to_html()) | |||||
| f.close() | f.close() | ||||
| @@ -0,0 +1,2 @@ | |||||
| title: Clou | |||||
| cover: image.png | |||||
| @@ -1,4 +1,8 @@ | |||||
| eyeD3==0.8.10 | |||||
| eyeD3==0.8.12 | |||||
| html-writer==1.1.1 | html-writer==1.1.1 | ||||
| Mako==1.1.2 | |||||
| MarkupSafe==1.1.1 | |||||
| pkg-resources==0.0.0 | |||||
| python-magic==0.4.15 | python-magic==0.4.15 | ||||
| PyYAML==5.3.1 | |||||
| six==1.12.0 | six==1.12.0 | ||||
| @@ -0,0 +1,51 @@ | |||||
| ## -*- coding: utf-8 -*- | |||||
| <!DOCTYPE html> | |||||
| <html lang="fr"> | |||||
| <head> | |||||
| <meta charset="utf-8"> | |||||
| <title>${title}</title> | |||||
| <meta name="description" content="dedemo"> | |||||
| <meta name="author" content="dede.space"> | |||||
| <link rel="stylesheet" href="assets/css/dede-player.css"> | |||||
| <link rel="stylesheet" href="assets/css/labelize.css"> | |||||
| </head> | |||||
| <body> | |||||
| <section class="cover"> | |||||
| <!-- <img src="images/CLOU_Icono-1.png"/> --> | |||||
| </section> | |||||
| <section class="dates"> | |||||
| <h2><span class="scaps">${title}</span> live</h2> | |||||
| </section> | |||||
| <section class="albums"> | |||||
| </section> | |||||
| <section class="contact"> | |||||
| <span>contact<span class="point">@</span>clou<span class="point">.</span>space</span> | |||||
| <footer class="flex-center"> | |||||
| dede <span class='point'>.</span>space<span class='pipe'>|</span>2019 | |||||
| </footer> | |||||
| </section> | |||||
| <div class="one-dpi" id="one-dpi" onclick="togglePlayer('player','one-dpi');"></div> | |||||
| <div class="player hidden" id="player"> | |||||
| <h2>${title} - Audio</h2> | |||||
| <ul> | |||||
| % for a in tracks: | |||||
| <li>Item ${loop.index}: ${a}</li> | |||||
| % endfor | |||||
| </ul> | |||||
| </div> | |||||
| <script src="./assets/js/labelize.js"></script> | |||||
| </body> | |||||
| </html> | |||||
| <!---nav footered-screen--> | |||||