Skip to content

Commit 1281f76

Browse files
committed
Add multiple uploads
1 parent a864388 commit 1281f76

File tree

5 files changed

+55
-46
lines changed

5 files changed

+55
-46
lines changed

api/file/create.php

+33-26
Original file line numberDiff line numberDiff line change
@@ -3,39 +3,46 @@
33
$db = new DB();
44

55
$data = null;
6-
7-
if (!isset($_FILES['file'])) {
8-
echo json_encode(['message' => 'No file found', 'data' => file_get_contents( 'php://input' )]);
6+
if (!isset($_FILES) || count($_FILES) === 0) {
7+
echo json_encode(['message' => 'No files found', 'data' => file_get_contents( 'php://input' )]);
98
return;
109
}
1110
if (!isset($_POST['track_id'])) {
1211
echo json_encode(['message' => 'Missing track id']);
1312
return;
1413
}
1514

16-
$existing = $db->get_file_by_name($_FILES['file']['name']);
17-
if ($existing) {
18-
$db->add_file_to_track($existing, htmlspecialchars($_POST['track_id']));
19-
header("Content-Type: application/json");
20-
http_response_code(200);
21-
echo json_encode($existing);
22-
exit();
23-
}
15+
$results = [];
16+
for ($i = 0; $i < count($_FILES); $i++) {
2417

25-
$allowedFormats = ['mp3', 'flac', 'ogg', 'vorbis', 'wav', 'mp4'];
26-
$extension = pathinfo($_FILES['file']['name'], PATHINFO_EXTENSION);
27-
if (in_array($extension, $allowedFormats)) {
28-
$path = $_SERVER['DOCUMENT_ROOT'] . "/" . $db->get_media_folder();
29-
$filename = $_FILES['file']['name'];
30-
$pathAndFilename = $path . "/" . $filename;
31-
move_uploaded_file($_FILES['file']['tmp_name'], $pathAndFilename);
32-
header("Content-Type: application/json");
33-
http_response_code(200);
34-
echo json_encode($db->create_file(htmlspecialchars($filename), htmlspecialchars($_POST['track_id'])));
35-
} else {
36-
header("Content-Type: application/json");
37-
http_response_code(400);
38-
echo json_encode($extension . " not supported");
39-
}
18+
$existing = $db->get_file_by_name($_FILES["file-$i"]['name']);
19+
if ($existing) {
20+
$results['files'][] = [
21+
'id' => $db->add_file_to_track($existing, htmlspecialchars($_POST['track_id'])),
22+
'name' => $existing,
23+
];
24+
$results['messages'][] = "File $existing already exists. Adding to track.";
25+
}
4026

27+
$allowedFormats = ['mp3', 'flac', 'ogg', 'vorbis', 'wav', 'mp4'];
28+
$extension = pathinfo($_FILES["file-$i"]['name'], PATHINFO_EXTENSION);
29+
if (in_array($extension, $allowedFormats)) {
30+
$path = $_SERVER['DOCUMENT_ROOT'] . "/" . $db->get_media_folder();
31+
$filename = $_FILES["file-$i"]['name'];
32+
$pathAndFilename = $path . "/" . $filename;
33+
move_uploaded_file($_FILES["file-$i"]['tmp_name'], $pathAndFilename);
34+
$db->create_file(htmlspecialchars($filename), htmlspecialchars($_POST['track_id']));
35+
$results['files'][] = [
36+
'id' => $db->create_file(htmlspecialchars($filename), htmlspecialchars($_POST['track_id'])),
37+
'name' => $filename,
38+
];
39+
} else {
40+
$results['messages'][] = "$extension not supported, in file " . $_FILES["file-$i"]['name'];
41+
}
42+
}
43+
header("Content-Type: application/json");
44+
http_response_code(200);
45+
echo json_encode($results);
4146
exit();
47+
48+

assets/js/script.js

+17-13
Original file line numberDiff line numberDiff line change
@@ -625,9 +625,9 @@ document.addEventListener('click', (ev) => {
625625
const empty = dialog.querySelector('.empty')
626626
if (empty) empty.remove()
627627

628-
const file = document.querySelector('#new-file').files[0]
628+
const files = document.querySelector('#new-file').files
629629
const data = new FormData()
630-
data.append('file', file)
630+
Array.from(files).forEach((file, i) => data.append('file-'+i, file))
631631
data.append('track_id', track_id)
632632
fetch('/api/file/create.php', {
633633
method: 'POST',
@@ -636,19 +636,23 @@ document.addEventListener('click', (ev) => {
636636
.then(data => {
637637
const spinner = document.createElement('div')
638638
spinner.classList.add('spinner')
639-
spinner.innerHTML = "Converting..."
639+
spinner.innerHTML = "Creating..."
640640
document.querySelector('.files').appendChild(spinner)
641641
if (data.status === 200) {
642-
data.json().then(id => {
643-
const template = document.querySelector('#file')
644-
const clone = template.content.cloneNode(true)
645-
const li = clone.querySelector('li')
646-
li.setAttribute('data-filename', file.name)
647-
li.setAttribute('data-id', id)
648-
li.querySelector('.file__name').innerHTML = file.name
649-
document.querySelector('.files').appendChild(clone)
650-
tagTracksWithoutFiles()
651-
document.querySelector('.spinner').remove()
642+
data.json().then(res => {
643+
if (res.files) {
644+
res.files.forEach(file => {
645+
const template = document.querySelector('#file')
646+
const clone = template.content.cloneNode(true)
647+
const li = clone.querySelector('li')
648+
li.setAttribute('data-filename', file.name)
649+
li.setAttribute('data-id', file.id)
650+
li.querySelector('.file__name').innerHTML = file.name
651+
document.querySelector('.files').appendChild(clone)
652+
tagTracksWithoutFiles()
653+
document.querySelector('.spinner').remove()
654+
})
655+
}
652656
})
653657
}
654658
})

gmplayer.db

0 Bytes
Binary file not shown.

index.php

+3-5
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<head>
1515
<meta charset="UTF-8">
1616
<meta name="viewport" content="width=device-width, initial-scale=1.0">
17-
<title>Dungeon Master Player</title>
17+
<title>Game Master Player</title>
1818
<link rel="preconnect" href="https://fonts.googleapis.com">
1919
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
2020
<link rel="stylesheet" href="/assets/js/color-picker/index.min.css">
@@ -53,13 +53,13 @@
5353
$title = "Themes";
5454
$data_type = "theme";
5555
$items = $db->get_themes();
56-
$placeholder = "E.g Dungeon, Airship, Mountains, Village";
56+
$placeholder = "E.g The Heart of Flamespike Citadel";
5757
include $partials . "section.php";
5858

5959
$title = "Presets";
6060
$data_type = "preset";
6161
$items = $db->get_presets_by_theme($active_theme_id);
62-
$placeholder = "E.g Busy townsquare, Quiet Night, Execution";
62+
$placeholder = "E.g Tavern, Forest, Temple, Goblin Hideout";
6363
?>
6464
<div class="action-section">
6565
<?php
@@ -76,8 +76,6 @@
7676
</aside>
7777

7878
<?php include $partials . "footer.php"; ?>
79-
<?php // TODO: get from and save to db
80-
?>
8179

8280
<script src="https://cdnjs.cloudflare.com/ajax/libs/color-thief/2.0.1/color-thief.min.js"></script>
8381
<script src="/assets/js/color-picker/index.min.js"></script>

partials/tracks.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,8 @@
6666
<div class="dialog__inner">
6767
<button data-action="close-dialog" aria-label="close dialog" title="Close settings">&times;</button>
6868
<form action="/api/file/create.php" method="post" enctype="multipart/form-data">
69-
<input type="file" id="new-file" name="new-file">
70-
<label class="file-upload" data-action="add-file" for="new-file">Add file to track...</label>
69+
<input type="file" id="new-file" name="new-file" multiple>
70+
<label class="file-upload" data-action="add-file" for="new-file">Add file(s) to track...</label>
7171
</form>
7272
<div class="dialog__files">
7373
<h2>Files in track:</h2>

0 commit comments

Comments
 (0)