Compare commits
3 Commits
3e3d318134
...
fd57f5813d
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
fd57f5813d | ||
|
|
16642918fa | ||
|
|
297a20f3e0 |
1
.dockerignore
Normal file
1
.dockerignore
Normal file
@ -0,0 +1 @@
|
|||||||
|
__pycache__/
|
||||||
1
.gitignore
vendored
1
.gitignore
vendored
@ -1,3 +1,4 @@
|
|||||||
/songbook.sqlite
|
/songbook.sqlite
|
||||||
/static/clip/
|
/static/clip/
|
||||||
/__pycache__/
|
/__pycache__/
|
||||||
|
/suggestions.csv
|
||||||
|
|||||||
14
Dockerfile
Normal file
14
Dockerfile
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
FROM python:3.11-slim
|
||||||
|
|
||||||
|
RUN pip3 install poetry
|
||||||
|
RUN poetry config virtualenvs.create false
|
||||||
|
|
||||||
|
RUN mkdir /opt/app
|
||||||
|
WORKDIR /opt/app
|
||||||
|
|
||||||
|
COPY pyproject.toml poetry.lock ./
|
||||||
|
RUN poetry install --no-dev
|
||||||
|
|
||||||
|
COPY ./ ./
|
||||||
|
|
||||||
|
CMD ["gunicorn", "--bind", "0.0.0.0"]
|
||||||
10
app.py
10
app.py
@ -329,7 +329,7 @@ def songpage(id):
|
|||||||
|
|
||||||
song_info = db.execute('''
|
song_info = db.execute('''
|
||||||
select
|
select
|
||||||
name, name_jp
|
name, name_jp, location
|
||||||
from
|
from
|
||||||
song
|
song
|
||||||
where
|
where
|
||||||
@ -419,11 +419,17 @@ def suggestpage():
|
|||||||
@app.route('/sent', methods=['POST'])
|
@app.route('/sent', methods=['POST'])
|
||||||
def sentpage():
|
def sentpage():
|
||||||
|
|
||||||
|
print(flask.request.headers)
|
||||||
|
|
||||||
with open ('suggestions.csv', 'a', newline='') as suggestlog:
|
with open ('suggestions.csv', 'a', newline='') as suggestlog:
|
||||||
logwriter = csv.writer(suggestlog)
|
logwriter = csv.writer(suggestlog)
|
||||||
logwriter.writerow([
|
logwriter.writerow([
|
||||||
datetime.datetime.now().isoformat(),
|
datetime.datetime.now().isoformat(),
|
||||||
flask.request.form['suggest-description'],
|
flask.request.form['connection-0-desc'][:4],
|
||||||
|
flask.request.form['connection-0-id'][:4],
|
||||||
|
flask.request.form['connection-1-desc'][:4],
|
||||||
|
flask.request.form['connection-1-id'][:4],
|
||||||
|
flask.request.form['suggest-description'][:10_000],
|
||||||
])
|
])
|
||||||
return flask.render_template('sent.html',
|
return flask.render_template('sent.html',
|
||||||
)
|
)
|
||||||
|
|||||||
@ -37,7 +37,7 @@ for song, motif, start, duration, album, track in db.execute('''
|
|||||||
|
|
||||||
# get clip filename
|
# get clip filename
|
||||||
|
|
||||||
destination = f'static/clip/{song:04}-{motif:03}.flac'
|
destination = f'static/clip/{song:04}-{motif:03}.mp3'
|
||||||
|
|
||||||
print(destination)
|
print(destination)
|
||||||
|
|
||||||
|
|||||||
@ -15,13 +15,13 @@ clipdata = pyexcel_odsr.get_data('reference_clips.ods', skip_empty_rows=True)
|
|||||||
|
|
||||||
# import song
|
# import song
|
||||||
cur.executemany(
|
cur.executemany(
|
||||||
'insert or ignore into song(id,name,name_jp) values(?, ?, ?)',
|
'insert or ignore into song(id,name,name_jp,location) values(?, ?, ?, ?)',
|
||||||
((row[0],row[3],row[4]) for row in data['Song'][1:])
|
((row[0],row[3],row[4],'' if len(row)<11 else row[10]) for row in data['Song'][1:])
|
||||||
)
|
)
|
||||||
|
|
||||||
# import album
|
# import album
|
||||||
cur.executemany(
|
cur.executemany(
|
||||||
'insert into album(id,name,date,code) values (?, ?, ?, ?)',
|
'insert into album(id,name,date,code,description,updates) values (?, ?, ?, ?, ?, ?)',
|
||||||
data['Album'][1:]
|
data['Album'][1:]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
3
db.sql
3
db.sql
@ -4,6 +4,7 @@ create table song(
|
|||||||
id int primary key,
|
id int primary key,
|
||||||
name text not null,
|
name text not null,
|
||||||
name_jp text not null,
|
name_jp text not null,
|
||||||
|
location text not null,
|
||||||
unique(name,name_jp)
|
unique(name,name_jp)
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -11,6 +12,8 @@ create table album(
|
|||||||
id int primary key,
|
id int primary key,
|
||||||
name text not null,
|
name text not null,
|
||||||
date date not null,
|
date date not null,
|
||||||
|
description text not null,
|
||||||
|
updates text not null,
|
||||||
code char(3) not null
|
code char(3) not null
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|||||||
6
docker-compose.yaml
Normal file
6
docker-compose.yaml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
services:
|
||||||
|
app:
|
||||||
|
build: .
|
||||||
|
init: true
|
||||||
|
ports:
|
||||||
|
- "127.0.0.1:5123:8000"
|
||||||
1
gunicorn.conf.py
Normal file
1
gunicorn.conf.py
Normal file
@ -0,0 +1 @@
|
|||||||
|
wsgi_app = 'app:app'
|
||||||
17
poetry.lock
generated
17
poetry.lock
generated
@ -44,6 +44,20 @@ Werkzeug = ">=2.3.3"
|
|||||||
async = ["asgiref (>=3.2)"]
|
async = ["asgiref (>=3.2)"]
|
||||||
dotenv = ["python-dotenv"]
|
dotenv = ["python-dotenv"]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "gunicorn"
|
||||||
|
version = "20.1.0"
|
||||||
|
description = "WSGI HTTP Server for UNIX"
|
||||||
|
category = "main"
|
||||||
|
optional = false
|
||||||
|
python-versions = ">=3.5"
|
||||||
|
|
||||||
|
[package.extras]
|
||||||
|
eventlet = ["eventlet (>=0.24.1)"]
|
||||||
|
gevent = ["gevent (>=1.4.0)"]
|
||||||
|
setproctitle = ["setproctitle"]
|
||||||
|
tornado = ["tornado (>=0.2)"]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itsdangerous"
|
name = "itsdangerous"
|
||||||
version = "2.1.2"
|
version = "2.1.2"
|
||||||
@ -164,13 +178,14 @@ watchdog = ["watchdog (>=2.3)"]
|
|||||||
[metadata]
|
[metadata]
|
||||||
lock-version = "1.1"
|
lock-version = "1.1"
|
||||||
python-versions = "^3.10"
|
python-versions = "^3.10"
|
||||||
content-hash = "eb105df2967c9247e5d32c49b9996442ba31976fb4da0c99bffa003aa8242182"
|
content-hash = "1a5905d329305a82f0568b7fdea227b713ee393a14f79e5247af77551ffda804"
|
||||||
|
|
||||||
[metadata.files]
|
[metadata.files]
|
||||||
blinker = []
|
blinker = []
|
||||||
click = []
|
click = []
|
||||||
colorama = []
|
colorama = []
|
||||||
flask = []
|
flask = []
|
||||||
|
gunicorn = []
|
||||||
itsdangerous = []
|
itsdangerous = []
|
||||||
jinja2 = []
|
jinja2 = []
|
||||||
lml = []
|
lml = []
|
||||||
|
|||||||
@ -10,6 +10,7 @@ sox = "^1.4.1"
|
|||||||
Jinja2 = "^3.1.2"
|
Jinja2 = "^3.1.2"
|
||||||
pyexcel-odsr = "^0.6.0"
|
pyexcel-odsr = "^0.6.0"
|
||||||
Flask = "^2.3.2"
|
Flask = "^2.3.2"
|
||||||
|
gunicorn = "^20.1.0"
|
||||||
|
|
||||||
[tool.poetry.dev-dependencies]
|
[tool.poetry.dev-dependencies]
|
||||||
|
|
||||||
|
|||||||
BIN
reference.ods
BIN
reference.ods
Binary file not shown.
Binary file not shown.
@ -13,12 +13,14 @@ window.addEventListener('load', (event) => {
|
|||||||
|
|
||||||
function albumselect(code){
|
function albumselect(code){
|
||||||
const albumheader = document.getElementById(code);
|
const albumheader = document.getElementById(code);
|
||||||
|
const searchbar = document.getElementById('search-input');
|
||||||
for (const other of document.querySelectorAll('.sort-header.album.open')){
|
for (const other of document.querySelectorAll('.sort-header.album.open')){
|
||||||
other.classList.remove('open');
|
other.classList.remove('open');
|
||||||
}
|
}
|
||||||
albumheader.classList.add('open');
|
albumheader.classList.add('open');
|
||||||
document.getElementById('search-input').value = '';
|
searchbar.value = '';
|
||||||
document.getElementById('search-results').replaceChildren();
|
searchbar.dispatchEvent(new Event('input'));
|
||||||
|
document.getElementById('search-results-header').replaceChildren();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Toggle header when clicked
|
// Toggle header when clicked
|
||||||
@ -39,11 +41,16 @@ function albumHeaderClick(clickevent){
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Fill out form with suggest search result
|
// Fill out form with suggest search result
|
||||||
function suggestform1(id, desc){
|
function suggestform(id, desc, clickevent){
|
||||||
document.getElementById('connection-1').valueAsNumber = id;
|
const searchresults = clickevent.target.parentElement.parentElement;
|
||||||
document.getElementById('connection-1-desc').valueAsNumber = desc;
|
const form = searchresults.dataset.form;
|
||||||
document.getElementById('search-input-suggest-1').value = '';
|
const searchbar = document.getElementById(`search-input-suggest-${form}`)
|
||||||
document.getElementById('search-results-1').replaceChildren();
|
document.getElementById(`connection-${form}`).innerHTML = clickevent.target.innerHTML;
|
||||||
|
document.getElementById(`connection-${form}-id`).value = id;
|
||||||
|
document.getElementById(`connection-${form}-desc`).value = desc;
|
||||||
|
searchbar.value = '';
|
||||||
|
searchbar.dispatchEvent(new Event('input'));
|
||||||
|
searchresults.replaceChildren();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mutually exclusive audio playback
|
// Mutually exclusive audio playback
|
||||||
@ -62,3 +69,27 @@ function onlyPlayOneIn(container) {
|
|||||||
document.addEventListener("DOMContentLoaded", function() {
|
document.addEventListener("DOMContentLoaded", function() {
|
||||||
onlyPlayOneIn(document.body);
|
onlyPlayOneIn(document.body);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Search clear button
|
||||||
|
function searchIconChange(event, buttonid, barid) {
|
||||||
|
const searchbutton = document.getElementById(buttonid);
|
||||||
|
const searchicon = document.getElementById(barid);
|
||||||
|
|
||||||
|
if (event.target.value.length !== 0) {
|
||||||
|
searchbutton.classList.remove('hidden');
|
||||||
|
searchicon.classList.remove('search-empty');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
searchbutton.classList.add('hidden');
|
||||||
|
searchicon.classList.add('search-empty');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function clearSearch(searchid, resultid, clickevent) {
|
||||||
|
const searchbar = document.getElementById(searchid);
|
||||||
|
const searchresults = document.getElementById(resultid);
|
||||||
|
searchbar.value = '';
|
||||||
|
searchresults.replaceChildren();
|
||||||
|
searchbar.dispatchEvent(new Event('input'));
|
||||||
|
clickevent.preventDefault();
|
||||||
|
}
|
||||||
@ -52,6 +52,12 @@ span{
|
|||||||
color: var(--text);
|
color: var(--text);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
p{
|
||||||
|
margin-left: 1.2rem;
|
||||||
|
margin-right: 1.2rem;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
/* HEADER */
|
/* HEADER */
|
||||||
|
|
||||||
header{
|
header{
|
||||||
@ -199,39 +205,52 @@ header{
|
|||||||
/* SEARCH BAR */
|
/* SEARCH BAR */
|
||||||
|
|
||||||
.search-bar{
|
.search-bar{
|
||||||
display: flex; flex-shrink: 0; flex-direction: column; justify-content: center; align-items: center;
|
display: flex; justify-content: center; align-items: center; flex-wrap: wrap;
|
||||||
max-width: 64rem;
|
max-width: 64rem;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 3.6rem;
|
|
||||||
margin-left: auto; margin-right: auto;
|
margin-left: auto; margin-right: auto;
|
||||||
background-color: var(--block);
|
background-color: var(--block);
|
||||||
border-style: solid; border-top: 0; border-left: 0; border-right: 0; border-color: var(--thin-border); border-width: 1px;
|
padding-top: .6rem; padding-bottom: .6rem;
|
||||||
|
/* border-style: solid; border-top: 0; border-left: 0; border-right: 0; border-color: var(--thin-border); border-width: 1px; */
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-items{
|
.search-items{
|
||||||
position: relative;
|
position: relative;
|
||||||
height: 2.4rem;
|
height: 2.4rem;
|
||||||
width: 80%;
|
width: calc(100% - 3.6rem);
|
||||||
|
margin-right: 1.2rem;
|
||||||
|
margin-left: .6rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-items input{
|
.search-bar.search-empty::before, .suggest input::before{
|
||||||
/* all:unset; */
|
content: "🔎︎";
|
||||||
|
width: 1.2rem;
|
||||||
|
text-align: center;
|
||||||
|
margin-left: .6rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-items input, .suggest input{
|
||||||
|
all: unset;
|
||||||
font: unset;
|
font: unset;
|
||||||
color: unset;
|
color: unset;
|
||||||
background-color: var(--search-back);
|
background-color: var(--search-back);
|
||||||
width: 100%;
|
width: 100%;
|
||||||
height: 2.4rem;
|
height: 2.4rem;
|
||||||
border-style: solid; border-color: var(--thin-border); border-width: 1px;
|
border-style: solid; border-color: var(--thin-border); border-width: 1px;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-icon{
|
||||||
|
height: 100%;
|
||||||
|
content: "🔎︎";
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-clear.hidden{
|
||||||
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* SEARCH RESULTS */
|
/* SEARCH RESULTS */
|
||||||
|
|
||||||
.search-results{
|
|
||||||
display: flex; flex-direction: column;
|
|
||||||
width: 100%;
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
.search-results h2{
|
.search-results h2{
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
@ -243,9 +262,13 @@ header{
|
|||||||
list-style: none;
|
list-style: none;
|
||||||
z-index: 1;
|
z-index: 1;
|
||||||
border-style: solid; border-color: var(--thin-border); border-width: 1px; border-top: 0; border-bottom: 0;
|
border-style: solid; border-color: var(--thin-border); border-width: 1px; border-top: 0; border-bottom: 0;
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
cursor: pointer;
|
||||||
|
overflow: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-results li{
|
.search-results li, .suggest-search-results{
|
||||||
display: flex; align-items: center;
|
display: flex; align-items: center;
|
||||||
min-height: 2.4rem;
|
min-height: 2.4rem;
|
||||||
border-style: solid; border-width: 1px; border-color: var(--thin-border); border-left: 0; border-top: 0; border-right: 0;
|
border-style: solid; border-width: 1px; border-color: var(--thin-border); border-left: 0; border-top: 0; border-right: 0;
|
||||||
@ -255,7 +278,7 @@ header{
|
|||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-icon{
|
.search-results .search-icon{
|
||||||
min-width: 2.6rem;
|
min-width: 2.6rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -372,6 +395,7 @@ footer{
|
|||||||
|
|
||||||
.sort-header{
|
.sort-header{
|
||||||
border-style: solid; border-top: 0; border-left: 0; border-right: 0; border-width: 1px; border-color: var(--thin-border);
|
border-style: solid; border-top: 0; border-left: 0; border-right: 0; border-width: 1px; border-color: var(--thin-border);
|
||||||
|
font-size: calc(1.1rem + .1vw);
|
||||||
}
|
}
|
||||||
|
|
||||||
.sort-header.album{
|
.sort-header.album{
|
||||||
@ -586,12 +610,14 @@ footer{
|
|||||||
display: flex; flex-direction: column;
|
display: flex; flex-direction: column;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
justify-content: center;
|
justify-content: center;
|
||||||
|
margin-left: 1.2rem; margin-right: 1.2rem;
|
||||||
}
|
}
|
||||||
.song-location h2{
|
.song-location h2{
|
||||||
text-align: center;
|
text-align: center;
|
||||||
margin-bottom: 1.2rem;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
.entrypage-connections{
|
.entrypage-connections{
|
||||||
display: flex; flex-direction: column;
|
display: flex; flex-direction: column;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
@ -633,13 +659,16 @@ footer{
|
|||||||
/* SUGGEST PAGE */
|
/* SUGGEST PAGE */
|
||||||
|
|
||||||
.suggestbox{
|
.suggestbox{
|
||||||
display: flex; flex-wrap: wrap; justify-content: center; gap: 4.8rem;
|
display: flex; flex-wrap: wrap; align-items: center; gap: 2.4rem; flex-direction: column;
|
||||||
margin-top: 2.4rem;
|
margin-top: 2.4rem;
|
||||||
|
overflow: hidden;
|
||||||
|
height: 36rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.suggestbox h2{
|
.suggestbox h2{
|
||||||
width: 100%;
|
width: 100%;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
text-decoration: underline;
|
||||||
}
|
}
|
||||||
|
|
||||||
.search-items.suggest{
|
.search-items.suggest{
|
||||||
@ -651,17 +680,31 @@ footer{
|
|||||||
}
|
}
|
||||||
|
|
||||||
.suggest-desc textarea{
|
.suggest-desc textarea{
|
||||||
width: 100%;
|
width: calc(100% - 8px);
|
||||||
|
resize: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.suggest-button{
|
.suggest-button{
|
||||||
width: 100%;
|
margin-bottom: 2.4rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
#connection-1{
|
.suggest-selection{
|
||||||
display: none;
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
border-style: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
#connection-1-desc{
|
.suggest{
|
||||||
|
width: clamp(24rem, 24rem, 100%);
|
||||||
|
}
|
||||||
|
|
||||||
|
.suggest-search{
|
||||||
|
display: flex; justify-content: center; flex-wrap: wrap; gap: 2.4rem; align-items: center;
|
||||||
|
margin-left: 1.2rem;
|
||||||
|
margin-right: 1.2rem;
|
||||||
|
width: 80%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-number{
|
||||||
display: none;
|
display: none;
|
||||||
}
|
}
|
||||||
@ -1,4 +0,0 @@
|
|||||||
2023-06-27T15:35:08.245616,Testing the form
|
|
||||||
2023-06-27T15:35:34.195039,testing again
|
|
||||||
2023-06-27T21:54:35.835288,"Hello from Moss and Nat's
|
|
||||||
"
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
<li class="entrypage-clip">
|
<li class="entrypage-clip">
|
||||||
<audio
|
<audio
|
||||||
controls
|
controls
|
||||||
src = "{{ url_for('static', filename='clip/') }}{{ '%04d' % song_id }}-{{ '%03d' % motif_id }}.flac" type="audio/flac">
|
src = "{{ url_for('static', filename='clip/') }}{{ '%04d' % song_id }}-{{ '%03d' % motif_id }}.mp3" type="audio/flac">
|
||||||
</audio>
|
</audio>
|
||||||
<span class="clip-pointer">
|
<span class="clip-pointer">
|
||||||
|
|
||||||
|
|||||||
@ -9,7 +9,7 @@
|
|||||||
<hgroup class="home-title">
|
<hgroup class="home-title">
|
||||||
<h1>The Eorzea Songbook</h1>
|
<h1>The Eorzea Songbook</h1>
|
||||||
<h3>An unofficial library of motifs in the Final Fantasy XIV soundtrack.</h3>
|
<h3>An unofficial library of motifs in the Final Fantasy XIV soundtrack.</h3>
|
||||||
<p>Last updated: 26/06/2023</p>
|
<!-- <p>Last updated: 26/06/2023</p> -->
|
||||||
</hgroup>
|
</hgroup>
|
||||||
|
|
||||||
<div class="home-nav">
|
<div class="home-nav">
|
||||||
@ -32,7 +32,7 @@
|
|||||||
<div class="entrypage-clip">
|
<div class="entrypage-clip">
|
||||||
<audio
|
<audio
|
||||||
controls
|
controls
|
||||||
src = "{{ url_for('static', filename='clip/') }}0288-024.flac" type="audio/flac">
|
src = "{{ url_for('static', filename='clip/') }}0288-024.mp3" type="audio/flac">
|
||||||
</audio>
|
</audio>
|
||||||
<span class="clip-pointer">
|
<span class="clip-pointer">
|
||||||
<img src="{{ url_for('static', filename='songicon.png') }}" alt="Song Icon" class="connection-icon"/>
|
<img src="{{ url_for('static', filename='songicon.png') }}" alt="Song Icon" class="connection-icon"/>
|
||||||
@ -43,7 +43,7 @@
|
|||||||
<div class="entrypage-clip">
|
<div class="entrypage-clip">
|
||||||
<audio
|
<audio
|
||||||
controls
|
controls
|
||||||
src = "{{ url_for('static', filename='clip/') }}0317-024.flac" type="audio/flac">
|
src = "{{ url_for('static', filename='clip/') }}0317-024.mp3" type="audio/flac">
|
||||||
</audio>
|
</audio>
|
||||||
<span class="clip-pointer">
|
<span class="clip-pointer">
|
||||||
<img src="{{ url_for('static', filename='songicon.png') }}" alt="Song Icon" class="connection-icon"/>
|
<img src="{{ url_for('static', filename='songicon.png') }}" alt="Song Icon" class="connection-icon"/>
|
||||||
@ -54,7 +54,7 @@
|
|||||||
<div class="entrypage-clip">
|
<div class="entrypage-clip">
|
||||||
<audio
|
<audio
|
||||||
controls
|
controls
|
||||||
src = "{{ url_for('static', filename='clip/') }}0294-024.flac" type="audio/flac">
|
src = "{{ url_for('static', filename='clip/') }}0294-024.mp3" type="audio/flac">
|
||||||
</audio>
|
</audio>
|
||||||
<span class="clip-pointer">
|
<span class="clip-pointer">
|
||||||
<img src="{{ url_for('static', filename='songicon.png') }}" alt="Song Icon" class="connection-icon"/>
|
<img src="{{ url_for('static', filename='songicon.png') }}" alt="Song Icon" class="connection-icon"/>
|
||||||
@ -65,7 +65,7 @@
|
|||||||
<div class="entrypage-clip">
|
<div class="entrypage-clip">
|
||||||
<audio
|
<audio
|
||||||
controls
|
controls
|
||||||
src = "{{ url_for('static', filename='clip/') }}0337-024.flac" type="audio/flac">
|
src = "{{ url_for('static', filename='clip/') }}0337-024.mp3" type="audio/flac">
|
||||||
</audio>
|
</audio>
|
||||||
<span class="clip-pointer">
|
<span class="clip-pointer">
|
||||||
<img src="{{ url_for('static', filename='songicon.png') }}" alt="Song Icon" class="connection-icon"/>
|
<img src="{{ url_for('static', filename='songicon.png') }}" alt="Song Icon" class="connection-icon"/>
|
||||||
|
|||||||
@ -1,7 +1,7 @@
|
|||||||
<li class="entrypage-clip">
|
<li class="entrypage-clip">
|
||||||
<audio
|
<audio
|
||||||
controls
|
controls
|
||||||
src = "{{ url_for('static', filename='clip/') }}{{ '%04d' % song_id }}-{{ '%03d' % motif_id }}.flac" type="audio/flac">
|
src = "{{ url_for('static', filename='clip/') }}{{ '%04d' % song_id }}-{{ '%03d' % motif_id }}.mp3" type="audio/flac">
|
||||||
</audio>
|
</audio>
|
||||||
<span class="clip-pointer">
|
<span class="clip-pointer">
|
||||||
<img src="{{ url_for('static', filename='songicon.png') }}" alt="Song Icon" class="connection-icon"/>
|
<img src="{{ url_for('static', filename='songicon.png') }}" alt="Song Icon" class="connection-icon"/>
|
||||||
|
|||||||
@ -22,17 +22,20 @@
|
|||||||
</nav>
|
</nav>
|
||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div class="search-bar">
|
<div id="top-search" class="search-bar search-empty">
|
||||||
|
<!-- <span class="search-icon"></span> -->
|
||||||
|
<button id="search-button" class="search-clear hidden" onclick="clearSearch('search-input', 'search-results-header', event)">X</button>
|
||||||
<div class="search-items">
|
<div class="search-items">
|
||||||
<input
|
<input
|
||||||
id="search-input"
|
id="search-input"
|
||||||
type="search"
|
type="text"
|
||||||
name="q"
|
name="q"
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
placeholder="Search..."
|
placeholder=" Search..."
|
||||||
hx-get="/search"
|
hx-get="/search"
|
||||||
hx-trigger="keyup changed delay:500ms, search"
|
hx-trigger="keyup changed delay:250ms, search"
|
||||||
hx-target="#search-results-header"
|
hx-target="#search-results-header"
|
||||||
|
oninput="searchIconChange(event, 'search-button', 'top-search')"
|
||||||
/>
|
/>
|
||||||
<div id="search-results-header" class="search-results header"></div>
|
<div id="search-results-header" class="search-results header"></div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
BIN
templates/reference_clips.ods
Normal file
BIN
templates/reference_clips.ods
Normal file
Binary file not shown.
@ -1,6 +1,6 @@
|
|||||||
{% extends "base.html" %}
|
{% extends "base.html" %}
|
||||||
{% block title %}
|
{% block title %}
|
||||||
{% for name, _ in song_info %}{{ name }}{% endfor %}
|
{% for name, _, _ in song_info %}{{ name }}{% endfor %}
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% set clipmode = "motif" %}
|
{% set clipmode = "motif" %}
|
||||||
@ -11,7 +11,7 @@
|
|||||||
<hgroup class="title-box">
|
<hgroup class="title-box">
|
||||||
<div class="eng-title">
|
<div class="eng-title">
|
||||||
<img src="{{ url_for('static', filename='songicon.png') }}" alt="Song Icon" />
|
<img src="{{ url_for('static', filename='songicon.png') }}" alt="Song Icon" />
|
||||||
{% for name, name_jp in song_info %}
|
{% for name, name_jp, _ in song_info %}
|
||||||
<h1>{{ name }}</h1>
|
<h1>{{ name }}</h1>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
<h3 class="title-album">
|
<h3 class="title-album">
|
||||||
@ -20,7 +20,7 @@
|
|||||||
{% endfor %}
|
{% endfor %}
|
||||||
</h3>
|
</h3>
|
||||||
</div>
|
</div>
|
||||||
{% for name, name_jp in song_info %}
|
{% for name, name_jp, _ in song_info %}
|
||||||
{% if name_jp %}
|
{% if name_jp %}
|
||||||
<h2 class="title-jp">{{name_jp}}</h2>
|
<h2 class="title-jp">{{name_jp}}</h2>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
@ -28,9 +28,9 @@
|
|||||||
</hgroup>
|
</hgroup>
|
||||||
|
|
||||||
|
|
||||||
<!-- Artist info -->
|
|
||||||
|
|
||||||
<div class="track-info" >
|
<div class="track-info" >
|
||||||
|
<!-- Artist info -->
|
||||||
<div class="songpage-detail">
|
<div class="songpage-detail">
|
||||||
<h2 >Artist: </h2>
|
<h2 >Artist: </h2>
|
||||||
<ul>
|
<ul>
|
||||||
@ -60,13 +60,14 @@
|
|||||||
|
|
||||||
<!-- Location -->
|
<!-- Location -->
|
||||||
|
|
||||||
{% if description %}
|
{% for _, _, location in song_info %}
|
||||||
|
{% if location %}
|
||||||
<div class="song-location">
|
<div class="song-location">
|
||||||
<h2>Used In:</h2>
|
<h2>Appearances:</h2>
|
||||||
|
<p class="songpage-location">{{ location }}</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
<!-- Motifs -->
|
<!-- Motifs -->
|
||||||
|
|
||||||
|
|||||||
@ -4,38 +4,48 @@
|
|||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
|
||||||
<p>If you know about a shared motif that you can't find on the website, you can tell me about it here. Just pick the two songs that share a motif - or the motif itself, if it already has a page - and tell me what to listen out for.</p>
|
<p>If you know about songs in the Final Fantasy XIV soundtrack that share a connection, and you can't find it on the website, tell me about it here. Just pick the two songs that share a motif - or the motif itself, if it already has a page - and tell me what to listen out for.</p>
|
||||||
|
|
||||||
<form action="/sent" method="post" >
|
<form action="/sent" method="post" >
|
||||||
<div class="suggestbox">
|
<div class="suggestbox">
|
||||||
<div class="search-items suggest">
|
<div class="suggest-search">
|
||||||
<h2>Song / Motif 1</h2>
|
{% for i in range(2) %}
|
||||||
|
<div class="suggest">
|
||||||
|
<h2>Song / Motif {{ i + 1 }}</h2>
|
||||||
|
|
||||||
|
<div id="connection-{{ i }}" class="suggest-search-results suggest-selection">
|
||||||
|
<div>Nothing selected yet.</div>
|
||||||
|
</div>
|
||||||
|
<div id="suggest-bar-{{ i }}" class="search-bar search-empty">
|
||||||
|
<div class="search-items">
|
||||||
|
<button id="suggest-button-{{ i }}" class="search-clear hidden" onclick="clearSearch('search-input-suggest-{{ i }}', 'search-results-{{ i }}', event)">X</button>
|
||||||
<input
|
<input
|
||||||
id="search-input-suggest-1"
|
id="search-input-suggest-{{ i }}"
|
||||||
type="search"
|
type="text"
|
||||||
name="q"
|
name="q"
|
||||||
autocomplete="off"
|
autocomplete="off"
|
||||||
placeholder="Search..."
|
placeholder=" Search..."
|
||||||
hx-get="/suggestsearch"
|
hx-get="/suggestsearch"
|
||||||
hx-trigger="keyup changed delay:500ms, search"
|
hx-trigger="keyup changed delay:250ms, search"
|
||||||
hx-target="#search-results-1"
|
hx-target="#search-results-{{ i }}"
|
||||||
|
oninput="searchIconChange(event, 'suggest-button-{{ i }}', 'suggest-bar-{{ i }}')"
|
||||||
/>
|
/>
|
||||||
<div id="search-results-1" class="search-results"></div>
|
<div id="search-results-{{ i }}" class="search-results" data-form="{{ i }}"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<input required type="text" name="connection-{{ i }}-desc" id="connection-{{ i }}-desc" class="search-number"/>
|
||||||
|
<input required type="number" name="connection-{{ i }}-id" id="connection-{{ i }}-id" class="search-number"/>
|
||||||
|
{% endfor %}
|
||||||
</div>
|
</div>
|
||||||
<input type="number" name="connection-1-desc" id="connection-1-desc"/>
|
|
||||||
<input type="number" name="connection-1" id="connection-1" min="1" max="733"/>
|
|
||||||
|
|
||||||
<div class="suggest-desc">
|
<div class="suggest-desc">
|
||||||
<textarea name="suggest-description">
|
<textarea maxlength="10000" rows="6" required name="suggest-description" placeholder="Describe the connection here."></textarea>
|
||||||
Suggest a different connection!
|
|
||||||
</textarea>
|
|
||||||
</div>
|
</div>
|
||||||
<div class="suggest-button">
|
<div class="suggest-button">
|
||||||
<input type="submit" />
|
<input type="submit" value="Submit"/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
@ -1,22 +1,19 @@
|
|||||||
<h2>Search Results:</h2>
|
<h2>Search Results:</h2>
|
||||||
<ul>
|
<ul>
|
||||||
{% for desc, id, name, _ in searchresult %}
|
{% for desc, id, name, _ in searchresult %}
|
||||||
|
<li onclick="suggestform('{{ id }}', '{{ desc }}', event)">
|
||||||
{% if desc == 'song' %}
|
{% if desc == 'song' %}
|
||||||
<li onclick="suggestform('{{ id }}', 1)">
|
<span class="search-icon suggest-icon">
|
||||||
<span class="search-icon">
|
|
||||||
<img src="{{ url_for('static', filename='songicon.png') }}" alt="Song Icon"/>
|
<img src="{{ url_for('static', filename='songicon.png') }}" alt="Song Icon"/>
|
||||||
</span>
|
</span>
|
||||||
<span class="search-type">Song:</span>
|
<span class="search-type">Song:</span>
|
||||||
{{ name }}
|
|
||||||
</li>
|
|
||||||
{% elif desc == 'motif' %}
|
{% elif desc == 'motif' %}
|
||||||
<li onclick="suggestform('{{ id }}', 2)">
|
|
||||||
<span class="search-icon">
|
<span class="search-icon">
|
||||||
<img src="{{ url_for('static', filename='motificon.png') }}" alt="Motif Icon"/>
|
<img src="{{ url_for('static', filename='motificon.png') }}" alt="Motif Icon"/>
|
||||||
</span>
|
</span>
|
||||||
<span class="search-type">Motif:</span>
|
<span class="search-type">Motif:</span>
|
||||||
{{ name }}
|
|
||||||
</li></a>
|
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
{{ name }}
|
||||||
|
</li>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</ul>
|
</ul>
|
||||||
Loading…
Reference in New Issue
Block a user