@@ -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--> |