| @@ -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; | |||
| var progress = undefined; | |||
| 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; | |||
| 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 os | |||
| import sys | |||
| import shutil | |||
| from html_writer import Html | |||
| #TracksDir class definition | |||
| # TracksDir class definition | |||
| 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.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() | |||
| 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')) | |||
| with body.tag('ul') as list: | |||
| 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: | |||
| 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')) | |||
| 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: | |||
| # 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' | |||
| 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) | |||
| # script usage function | |||
| def usage(): | |||
| print('USAGE : labelize.py [inputDirectory] [outputDirectory]') | |||
| # script beginning | |||
| arguments = len(sys.argv) - 1 | |||
| if(arguments != 2): | |||
| if arguments != 2: | |||
| usage() | |||
| 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: | |||
| shutil.copytree(src, dest) | |||
| except shutil.Error as e: | |||
| @@ -69,23 +72,24 @@ def copyDirectory(src, dest): | |||
| except OSError as 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 = [] | |||
| for f in files: | |||
| if f.lower().endswith(('.mp3', '.wav', '.ogg')): | |||
| trackFiles.append(f) | |||
| 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() | |||
| @@ -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 | |||
| Mako==1.1.2 | |||
| MarkupSafe==1.1.1 | |||
| pkg-resources==0.0.0 | |||
| python-magic==0.4.15 | |||
| PyYAML==5.3.1 | |||
| 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--> | |||