tunecamp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.env.local +2 -0
- package/.vercel/README.txt +11 -0
- package/.vercel/project.json +1 -0
- package/LICENSE +22 -0
- package/README.md +554 -0
- package/dist/cli.d.ts +6 -0
- package/dist/cli.d.ts.map +1 -0
- package/dist/cli.js +172 -0
- package/dist/cli.js.map +1 -0
- package/dist/generator/embedGenerator.d.ts +38 -0
- package/dist/generator/embedGenerator.d.ts.map +1 -0
- package/dist/generator/embedGenerator.js +92 -0
- package/dist/generator/embedGenerator.js.map +1 -0
- package/dist/generator/feedGenerator.d.ts +50 -0
- package/dist/generator/feedGenerator.d.ts.map +1 -0
- package/dist/generator/feedGenerator.js +167 -0
- package/dist/generator/feedGenerator.js.map +1 -0
- package/dist/generator/podcastFeedGenerator.d.ts +54 -0
- package/dist/generator/podcastFeedGenerator.d.ts.map +1 -0
- package/dist/generator/podcastFeedGenerator.js +173 -0
- package/dist/generator/podcastFeedGenerator.js.map +1 -0
- package/dist/generator/proceduralCoverGenerator.d.ts +51 -0
- package/dist/generator/proceduralCoverGenerator.d.ts.map +1 -0
- package/dist/generator/proceduralCoverGenerator.js +228 -0
- package/dist/generator/proceduralCoverGenerator.js.map +1 -0
- package/dist/generator/siteGenerator.d.ts +55 -0
- package/dist/generator/siteGenerator.d.ts.map +1 -0
- package/dist/generator/siteGenerator.js +539 -0
- package/dist/generator/siteGenerator.js.map +1 -0
- package/dist/generator/templateEngine.d.ts +13 -0
- package/dist/generator/templateEngine.d.ts.map +1 -0
- package/dist/generator/templateEngine.js +146 -0
- package/dist/generator/templateEngine.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +32 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/catalogParser.d.ts +13 -0
- package/dist/parser/catalogParser.d.ts.map +1 -0
- package/dist/parser/catalogParser.js +120 -0
- package/dist/parser/catalogParser.js.map +1 -0
- package/dist/tools/generate-codes.d.ts +14 -0
- package/dist/tools/generate-codes.d.ts.map +1 -0
- package/dist/tools/generate-codes.js +274 -0
- package/dist/tools/generate-codes.js.map +1 -0
- package/dist/tools/generate-sea-pair.d.ts +14 -0
- package/dist/tools/generate-sea-pair.d.ts.map +1 -0
- package/dist/tools/generate-sea-pair.js +111 -0
- package/dist/tools/generate-sea-pair.js.map +1 -0
- package/dist/types/index.d.ts +117 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +5 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/audioUtils.d.ts +9 -0
- package/dist/utils/audioUtils.d.ts.map +1 -0
- package/dist/utils/audioUtils.js +67 -0
- package/dist/utils/audioUtils.js.map +1 -0
- package/dist/utils/configUtils.d.ts +11 -0
- package/dist/utils/configUtils.d.ts.map +1 -0
- package/dist/utils/configUtils.js +50 -0
- package/dist/utils/configUtils.js.map +1 -0
- package/dist/utils/fileUtils.d.ts +14 -0
- package/dist/utils/fileUtils.d.ts.map +1 -0
- package/dist/utils/fileUtils.js +73 -0
- package/dist/utils/fileUtils.js.map +1 -0
- package/examples/artist-free/README.md +36 -0
- package/examples/artist-paycurtain/README.md +49 -0
- package/examples/label/README.md +33 -0
- package/gundb-keypair.json +8 -0
- package/logo.svg +30 -0
- package/package-lock.json +1176 -0
- package/package.json +42 -0
- package/public/assets/community-registry.js +291 -0
- package/public/assets/download-stats.js +263 -0
- package/public/assets/player.js +219 -0
- package/public/assets/style.css +1170 -0
- package/public/assets/theme-widget.js +353 -0
- package/public/assets/unlock-codes.js +225 -0
- package/public/atom.xml +22 -0
- package/public/catalog.m3u +3 -0
- package/public/feed.xml +22 -0
- package/public/image.png +0 -0
- package/public/index.html +249 -0
- package/public/logo.svg +30 -0
- package/public/releases/chirichetto/Homologo - Chirichetto.wav +0 -0
- package/public/releases/chirichetto/cover.png +0 -0
- package/public/releases/chirichetto/embed-code.txt +16 -0
- package/public/releases/chirichetto/embed-compact.txt +8 -0
- package/public/releases/chirichetto/embed.html +39 -0
- package/public/releases/chirichetto/index.html +389 -0
- package/public/releases/chirichetto/playlist.m3u +3 -0
- package/templates/dark/assets/community-registry.js +291 -0
- package/templates/dark/assets/download-stats.js +263 -0
- package/templates/dark/assets/player.js +219 -0
- package/templates/dark/assets/style.css +740 -0
- package/templates/dark/index.hbs +73 -0
- package/templates/dark/layout.hbs +84 -0
- package/templates/dark/release.hbs +212 -0
- package/templates/default/assets/community-registry.js +291 -0
- package/templates/default/assets/download-stats.js +263 -0
- package/templates/default/assets/player.js +219 -0
- package/templates/default/assets/style.css +1170 -0
- package/templates/default/assets/theme-widget.js +353 -0
- package/templates/default/assets/unlock-codes.js +225 -0
- package/templates/default/index.hbs +188 -0
- package/templates/default/layout.hbs +117 -0
- package/templates/default/release.hbs +553 -0
- package/templates/minimal/assets/community-registry.js +291 -0
- package/templates/minimal/assets/download-stats.js +263 -0
- package/templates/minimal/assets/player.js +219 -0
- package/templates/minimal/assets/style.css +796 -0
- package/templates/minimal/index.hbs +73 -0
- package/templates/minimal/layout.hbs +84 -0
- package/templates/minimal/release.hbs +212 -0
- package/templates/retro/assets/community-registry.js +291 -0
- package/templates/retro/assets/download-stats.js +263 -0
- package/templates/retro/assets/player.js +219 -0
- package/templates/retro/assets/style.css +872 -0
- package/templates/retro/index.hbs +73 -0
- package/templates/retro/layout.hbs +84 -0
- package/templates/retro/release.hbs +212 -0
- package/templates/translucent/assets/community-registry.js +291 -0
- package/templates/translucent/assets/download-stats.js +263 -0
- package/templates/translucent/assets/player.js +219 -0
- package/templates/translucent/assets/style.css +1352 -0
- package/templates/translucent/index.hbs +73 -0
- package/templates/translucent/layout.hbs +84 -0
- package/templates/translucent/release.hbs +212 -0
- package/website/community.html +492 -0
- package/website/index.html +195 -0
- package/website/styles.css +396 -0
- package/website/tunecamp.svg +30 -0
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
<div class="container">
|
|
2
|
+
{{#if artist}}
|
|
3
|
+
<section class="artist-section">
|
|
4
|
+
<div class="artist-header">
|
|
5
|
+
{{#if artist.photo}}
|
|
6
|
+
<img src="{{path artist.photo}}" alt="{{artist.name}}" class="artist-photo">
|
|
7
|
+
{{/if}}
|
|
8
|
+
<div class="artist-info">
|
|
9
|
+
<h2>{{artist.name}}</h2>
|
|
10
|
+
{{#if artist.bio}}
|
|
11
|
+
<p class="artist-bio">{{artist.bio}}</p>
|
|
12
|
+
{{/if}}
|
|
13
|
+
</div>
|
|
14
|
+
</div>
|
|
15
|
+
</section>
|
|
16
|
+
{{/if}}
|
|
17
|
+
|
|
18
|
+
<section class="releases-section">
|
|
19
|
+
<h2>Releases</h2>
|
|
20
|
+
|
|
21
|
+
{{#if releases}}
|
|
22
|
+
<div class="releases-grid">
|
|
23
|
+
{{#each releases}}
|
|
24
|
+
<article class="release-card">
|
|
25
|
+
<a href="{{path url}}" class="release-link">
|
|
26
|
+
{{#if coverUrl}}
|
|
27
|
+
<div class="release-cover">
|
|
28
|
+
<img src="{{path coverUrl}}" alt="{{config.title}}" loading="lazy">
|
|
29
|
+
</div>
|
|
30
|
+
{{else}}
|
|
31
|
+
<div class="release-cover release-cover-placeholder">
|
|
32
|
+
<i class="fas fa-music"></i>
|
|
33
|
+
</div>
|
|
34
|
+
{{/if}}
|
|
35
|
+
|
|
36
|
+
<div class="release-info">
|
|
37
|
+
<h3 class="release-title">{{config.title}}</h3>
|
|
38
|
+
<p class="release-date">{{formatDate config.date}}</p>
|
|
39
|
+
|
|
40
|
+
{{#if config.genres}}
|
|
41
|
+
<div class="release-genres">
|
|
42
|
+
{{#each config.genres}}
|
|
43
|
+
<span class="genre-tag">{{this}}</span>
|
|
44
|
+
{{/each}}
|
|
45
|
+
</div>
|
|
46
|
+
{{/if}}
|
|
47
|
+
|
|
48
|
+
<p class="release-tracks-count">
|
|
49
|
+
{{tracks.length}} track{{#unless (eq tracks.length 1)}}s{{/unless}}
|
|
50
|
+
</p>
|
|
51
|
+
|
|
52
|
+
{{#if config.download}}
|
|
53
|
+
<div class="release-download-badge">
|
|
54
|
+
{{#if (eq config.download "free")}}
|
|
55
|
+
<i class="fas fa-download"></i> Free Download
|
|
56
|
+
{{else if (eq config.download "paycurtain")}}
|
|
57
|
+
<i class="fas fa-dollar-sign"></i> Pay What You Want
|
|
58
|
+
{{else if (eq config.download "codes")}}
|
|
59
|
+
<i class="fas fa-key"></i> Download Codes
|
|
60
|
+
{{/if}}
|
|
61
|
+
</div>
|
|
62
|
+
{{/if}}
|
|
63
|
+
</div>
|
|
64
|
+
</a>
|
|
65
|
+
</article>
|
|
66
|
+
{{/each}}
|
|
67
|
+
</div>
|
|
68
|
+
{{else}}
|
|
69
|
+
<p class="no-releases">No releases yet. Check back soon!</p>
|
|
70
|
+
{{/if}}
|
|
71
|
+
</section>
|
|
72
|
+
</div>
|
|
73
|
+
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
<!DOCTYPE html>
|
|
2
|
+
<html lang="{{catalog.language}}">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8">
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
+
<title>{{#if pageTitle}}{{pageTitle}} - {{/if}}{{catalog.title}}</title>
|
|
7
|
+
{{#if catalog.description}}
|
|
8
|
+
<meta name="description" content="{{catalog.description}}">
|
|
9
|
+
{{/if}}
|
|
10
|
+
{{#if catalog.customFontUrl}}
|
|
11
|
+
<link rel="stylesheet" href="{{catalog.customFontUrl}}">
|
|
12
|
+
{{/if}}
|
|
13
|
+
<link rel="stylesheet" href="{{assetPath "assets/style.css"}}">
|
|
14
|
+
{{#if catalog.customFontFamily}}
|
|
15
|
+
<style>
|
|
16
|
+
:root {
|
|
17
|
+
--custom-font-family: '{{catalog.customFontFamily}}', -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen', 'Ubuntu', 'Cantarell', sans-serif;
|
|
18
|
+
}
|
|
19
|
+
body {
|
|
20
|
+
font-family: var(--custom-font-family);
|
|
21
|
+
}
|
|
22
|
+
</style>
|
|
23
|
+
{{/if}}
|
|
24
|
+
{{#if catalog.customCSSUrl}}
|
|
25
|
+
{{#if (or (startsWith catalog.customCSSUrl "http://") (startsWith catalog.customCSSUrl "https://"))}}
|
|
26
|
+
<link rel="stylesheet" href="{{catalog.customCSSUrl}}">
|
|
27
|
+
{{else}}
|
|
28
|
+
<link rel="stylesheet" href="{{path catalog.customCSSUrl}}">
|
|
29
|
+
{{/if}}
|
|
30
|
+
{{/if}}
|
|
31
|
+
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
|
|
32
|
+
</head>
|
|
33
|
+
<body>
|
|
34
|
+
<header class="site-header">
|
|
35
|
+
<div class="container">
|
|
36
|
+
{{#if catalog.headerImageUrl}}
|
|
37
|
+
<div class="site-header-image">
|
|
38
|
+
<a href="{{#if backUrl}}{{path backUrl}}{{else}}{{path "index.html"}}{{/if}}">
|
|
39
|
+
<img src="{{path catalog.headerImageUrl}}" alt="{{catalog.title}}" class="header-image">
|
|
40
|
+
</a>
|
|
41
|
+
</div>
|
|
42
|
+
{{else}}
|
|
43
|
+
<h1 class="site-title">
|
|
44
|
+
<a href="{{#if backUrl}}{{path backUrl}}{{else}}{{path "index.html"}}{{/if}}">{{catalog.title}}</a>
|
|
45
|
+
</h1>
|
|
46
|
+
{{/if}}
|
|
47
|
+
{{#if catalog.description}}
|
|
48
|
+
{{#unless catalog.headerImageUrl}}
|
|
49
|
+
<p class="site-description">{{catalog.description}}</p>
|
|
50
|
+
{{/unless}}
|
|
51
|
+
{{/if}}
|
|
52
|
+
</div>
|
|
53
|
+
</header>
|
|
54
|
+
|
|
55
|
+
<main class="site-main">
|
|
56
|
+
{{{content}}}
|
|
57
|
+
</main>
|
|
58
|
+
|
|
59
|
+
<footer class="site-footer">
|
|
60
|
+
<div class="container">
|
|
61
|
+
<p>
|
|
62
|
+
{{#if artist}}
|
|
63
|
+
© {{artist.name}} -
|
|
64
|
+
{{/if}}
|
|
65
|
+
Powered by <a href="https://github.com/scobru/tunecamp" target="_blank">Tunecamp</a>
|
|
66
|
+
</p>
|
|
67
|
+
{{#if artist.links}}
|
|
68
|
+
<div class="social-links">
|
|
69
|
+
{{#each artist.links}}
|
|
70
|
+
{{#each this}}
|
|
71
|
+
<a href="{{this}}" target="_blank" rel="noopener" class="social-link">
|
|
72
|
+
<i class="fab fa-{{@key}}"></i>
|
|
73
|
+
</a>
|
|
74
|
+
{{/each}}
|
|
75
|
+
{{/each}}
|
|
76
|
+
</div>
|
|
77
|
+
{{/if}}
|
|
78
|
+
</div>
|
|
79
|
+
</footer>
|
|
80
|
+
|
|
81
|
+
<script src="{{assetPath "assets/player.js"}}"></script>
|
|
82
|
+
</body>
|
|
83
|
+
</html>
|
|
84
|
+
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
<div class="container">
|
|
2
|
+
<nav class="breadcrumb">
|
|
3
|
+
<a href="{{path backUrl}}">← Back to catalog</a>
|
|
4
|
+
</nav>
|
|
5
|
+
|
|
6
|
+
<article class="release-detail">
|
|
7
|
+
<header class="release-header">
|
|
8
|
+
{{#if release.coverUrl}}
|
|
9
|
+
<div class="release-cover-large">
|
|
10
|
+
<img src="{{path release.coverUrl}}" alt="{{release.config.title}}">
|
|
11
|
+
</div>
|
|
12
|
+
{{/if}}
|
|
13
|
+
|
|
14
|
+
<div class="release-metadata">
|
|
15
|
+
<h1>{{release.config.title}}</h1>
|
|
16
|
+
|
|
17
|
+
{{#if artist}}
|
|
18
|
+
<p class="release-artist">by {{artist.name}}</p>
|
|
19
|
+
{{/if}}
|
|
20
|
+
|
|
21
|
+
<p class="release-date">Released {{formatDate release.config.date}}</p>
|
|
22
|
+
|
|
23
|
+
{{#if release.config.genres}}
|
|
24
|
+
<div class="release-genres">
|
|
25
|
+
{{#each release.config.genres}}
|
|
26
|
+
<span class="genre-tag">{{this}}</span>
|
|
27
|
+
{{/each}}
|
|
28
|
+
</div>
|
|
29
|
+
{{/if}}
|
|
30
|
+
|
|
31
|
+
{{#if release.config.description}}
|
|
32
|
+
<p class="release-description">{{release.config.description}}</p>
|
|
33
|
+
{{/if}}
|
|
34
|
+
|
|
35
|
+
{{#if release.config.credits}}
|
|
36
|
+
<div class="release-credits">
|
|
37
|
+
<h3>Credits</h3>
|
|
38
|
+
<ul>
|
|
39
|
+
{{#each release.config.credits}}
|
|
40
|
+
<li><strong>{{role}}:</strong> {{name}}</li>
|
|
41
|
+
{{/each}}
|
|
42
|
+
</ul>
|
|
43
|
+
</div>
|
|
44
|
+
{{/if}}
|
|
45
|
+
|
|
46
|
+
{{#if release.config.license}}
|
|
47
|
+
<div class="release-license">
|
|
48
|
+
<h3>License</h3>
|
|
49
|
+
<p class="license-info">
|
|
50
|
+
{{#if (eq release.config.license "copyright")}}
|
|
51
|
+
<i class="fas fa-copyright"></i> All rights reserved. This work is protected by copyright.
|
|
52
|
+
{{else if (eq release.config.license "cc-by")}}
|
|
53
|
+
<i class="fab fa-creative-commons"></i> Licensed under <a href="https://creativecommons.org/licenses/by/4.0/" target="_blank">CC BY 4.0</a> - Attribution
|
|
54
|
+
{{else if (eq release.config.license "cc-by-sa")}}
|
|
55
|
+
<i class="fab fa-creative-commons"></i> Licensed under <a href="https://creativecommons.org/licenses/by-sa/4.0/" target="_blank">CC BY-SA 4.0</a> - Attribution-ShareAlike
|
|
56
|
+
{{else if (eq release.config.license "cc-by-nc")}}
|
|
57
|
+
<i class="fab fa-creative-commons"></i> Licensed under <a href="https://creativecommons.org/licenses/by-nc/4.0/" target="_blank">CC BY-NC 4.0</a> - Attribution-NonCommercial
|
|
58
|
+
{{else if (eq release.config.license "cc-by-nc-sa")}}
|
|
59
|
+
<i class="fab fa-creative-commons"></i> Licensed under <a href="https://creativecommons.org/licenses/by-nc-sa/4.0/" target="_blank">CC BY-NC-SA 4.0</a> - Attribution-NonCommercial-ShareAlike
|
|
60
|
+
{{else if (eq release.config.license "cc-by-nc-nd")}}
|
|
61
|
+
<i class="fab fa-creative-commons"></i> Licensed under <a href="https://creativecommons.org/licenses/by-nc-nd/4.0/" target="_blank">CC BY-NC-ND 4.0</a> - Attribution-NonCommercial-NoDerivatives
|
|
62
|
+
{{else if (eq release.config.license "cc-by-nd")}}
|
|
63
|
+
<i class="fab fa-creative-commons"></i> Licensed under <a href="https://creativecommons.org/licenses/by-nd/4.0/" target="_blank">CC BY-ND 4.0</a> - Attribution-NoDerivatives
|
|
64
|
+
{{else if (eq release.config.license "public-domain")}}
|
|
65
|
+
<i class="fas fa-globe"></i> Public Domain - This work is in the public domain.
|
|
66
|
+
{{/if}}
|
|
67
|
+
</p>
|
|
68
|
+
</div>
|
|
69
|
+
{{/if}}
|
|
70
|
+
|
|
71
|
+
{{#if release.config.download}}
|
|
72
|
+
<div class="release-download-actions">
|
|
73
|
+
{{#if (eq release.config.download "free")}}
|
|
74
|
+
<button class="btn btn-primary" onclick="downloadAll()">
|
|
75
|
+
<i class="fas fa-download"></i> Download All (Free)
|
|
76
|
+
</button>
|
|
77
|
+
{{else if (eq release.config.download "paycurtain")}}
|
|
78
|
+
<div class="paycurtain">
|
|
79
|
+
<div class="support-message">
|
|
80
|
+
<p><strong>Support the artist!</strong></p>
|
|
81
|
+
<p>Suggested donation: ${{release.config.price}}</p>
|
|
82
|
+
<p class="honor-system">This is an honor system - you can download for free, but your support helps the artist continue creating music.</p>
|
|
83
|
+
</div>
|
|
84
|
+
<div class="payment-buttons">
|
|
85
|
+
{{#if release.config.paypalLink}}
|
|
86
|
+
<a href="{{release.config.paypalLink}}" target="_blank" class="btn btn-primary">
|
|
87
|
+
<i class="fab fa-paypal"></i> Support via PayPal
|
|
88
|
+
</a>
|
|
89
|
+
{{/if}}
|
|
90
|
+
{{#if release.config.stripeLink}}
|
|
91
|
+
<a href="{{release.config.stripeLink}}" target="_blank" class="btn btn-secondary">
|
|
92
|
+
<i class="fab fa-stripe"></i> Support via Stripe
|
|
93
|
+
</a>
|
|
94
|
+
{{/if}}
|
|
95
|
+
<button class="btn btn-outline" onclick="downloadAll()">
|
|
96
|
+
<i class="fas fa-download"></i> Download Free
|
|
97
|
+
</button>
|
|
98
|
+
{{#unless release.config.paypalLink}}
|
|
99
|
+
{{#unless release.config.stripeLink}}
|
|
100
|
+
<p class="payment-info">No payment links configured - download is free</p>
|
|
101
|
+
{{/unless}}
|
|
102
|
+
{{/unless}}
|
|
103
|
+
</div>
|
|
104
|
+
</div>
|
|
105
|
+
{{/if}}
|
|
106
|
+
</div>
|
|
107
|
+
{{/if}}
|
|
108
|
+
</div>
|
|
109
|
+
</header>
|
|
110
|
+
|
|
111
|
+
<section class="tracklist">
|
|
112
|
+
<h2>Tracks</h2>
|
|
113
|
+
|
|
114
|
+
<div class="audio-player" id="audioPlayer">
|
|
115
|
+
<div class="player-track-info">
|
|
116
|
+
<div class="player-cover">
|
|
117
|
+
{{#if release.coverUrl}}
|
|
118
|
+
<img src="{{release.coverUrl}}" alt="{{release.config.title}}" id="playerCover">
|
|
119
|
+
{{else}}
|
|
120
|
+
<i class="fas fa-music"></i>
|
|
121
|
+
{{/if}}
|
|
122
|
+
</div>
|
|
123
|
+
<div class="player-details">
|
|
124
|
+
<div class="player-title" id="playerTitle">Select a track</div>
|
|
125
|
+
<div class="player-artist" id="playerArtist">{{#if artist}}{{artist.name}}{{/if}}</div>
|
|
126
|
+
</div>
|
|
127
|
+
</div>
|
|
128
|
+
|
|
129
|
+
<div class="player-controls">
|
|
130
|
+
<button class="player-btn" id="prevBtn"><i class="fas fa-step-backward"></i></button>
|
|
131
|
+
<button class="player-btn player-btn-play" id="playBtn">
|
|
132
|
+
<i class="fas fa-play"></i>
|
|
133
|
+
</button>
|
|
134
|
+
<button class="player-btn" id="nextBtn"><i class="fas fa-step-forward"></i></button>
|
|
135
|
+
</div>
|
|
136
|
+
|
|
137
|
+
<div class="player-progress">
|
|
138
|
+
<span class="player-time" id="currentTime">0:00</span>
|
|
139
|
+
<input type="range" class="progress-bar" id="progressBar" min="0" max="100" value="0">
|
|
140
|
+
<span class="player-time" id="duration">0:00</span>
|
|
141
|
+
</div>
|
|
142
|
+
|
|
143
|
+
<div class="player-volume">
|
|
144
|
+
<i class="fas fa-volume-up"></i>
|
|
145
|
+
<input type="range" class="volume-bar" id="volumeBar" min="0" max="100" value="80">
|
|
146
|
+
</div>
|
|
147
|
+
</div>
|
|
148
|
+
|
|
149
|
+
<ol class="track-list">
|
|
150
|
+
{{#each release.tracks}}
|
|
151
|
+
<li class="track-item" data-src="{{releasePath url}}" data-index="{{@index}}">
|
|
152
|
+
<div class="track-number">{{@index}}</div>
|
|
153
|
+
<div class="track-info">
|
|
154
|
+
<div class="track-title">{{title}}</div>
|
|
155
|
+
<div class="track-meta">
|
|
156
|
+
{{formatAudioFormat filename}}
|
|
157
|
+
{{#if duration}}
|
|
158
|
+
· {{formatDuration duration}}
|
|
159
|
+
{{/if}}
|
|
160
|
+
</div>
|
|
161
|
+
</div>
|
|
162
|
+
<div class="track-actions">
|
|
163
|
+
<button class="track-play-btn" onclick="playTrack({{@index}})">
|
|
164
|
+
<i class="fas fa-play"></i>
|
|
165
|
+
</button>
|
|
166
|
+
{{#if ../release.config.download}}
|
|
167
|
+
{{#if (eq ../release.config.download "free")}}
|
|
168
|
+
<a href="{{releasePath url}}" download class="track-download-btn">
|
|
169
|
+
<i class="fas fa-download"></i>
|
|
170
|
+
</a>
|
|
171
|
+
{{/if}}
|
|
172
|
+
{{/if}}
|
|
173
|
+
</div>
|
|
174
|
+
</li>
|
|
175
|
+
{{/each}}
|
|
176
|
+
</ol>
|
|
177
|
+
</section>
|
|
178
|
+
|
|
179
|
+
{{#if artist.donationLinks}}
|
|
180
|
+
<section class="donation-section">
|
|
181
|
+
<h2>Support the Artist</h2>
|
|
182
|
+
<p>If you enjoyed this music, consider supporting the artist:</p>
|
|
183
|
+
<div class="donation-links">
|
|
184
|
+
{{#each artist.donationLinks}}
|
|
185
|
+
<a href="{{url}}" target="_blank" class="donation-link">
|
|
186
|
+
<i class="fas fa-heart"></i>
|
|
187
|
+
<span>{{platform}}</span>
|
|
188
|
+
{{#if description}}
|
|
189
|
+
<small>{{description}}</small>
|
|
190
|
+
{{/if}}
|
|
191
|
+
</a>
|
|
192
|
+
{{/each}}
|
|
193
|
+
</div>
|
|
194
|
+
</section>
|
|
195
|
+
{{/if}}
|
|
196
|
+
</article>
|
|
197
|
+
</div>
|
|
198
|
+
|
|
199
|
+
<script>
|
|
200
|
+
// Initialize player with tracks
|
|
201
|
+
window.tracks = [
|
|
202
|
+
{{#each release.tracks}}
|
|
203
|
+
{
|
|
204
|
+
url: '{{releasePath url}}',
|
|
205
|
+
title: '{{title}}',
|
|
206
|
+
artist: '{{#if artist}}{{artist}}{{else}}{{../artist.name}}{{/if}}',
|
|
207
|
+
duration: {{#if duration}}{{duration}}{{else}}0{{/if}}
|
|
208
|
+
}{{#unless @last}},{{/unless}}
|
|
209
|
+
{{/each}}
|
|
210
|
+
];
|
|
211
|
+
</script>
|
|
212
|
+
|