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.
Files changed (132) hide show
  1. package/.env.local +2 -0
  2. package/.vercel/README.txt +11 -0
  3. package/.vercel/project.json +1 -0
  4. package/LICENSE +22 -0
  5. package/README.md +554 -0
  6. package/dist/cli.d.ts +6 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +172 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/generator/embedGenerator.d.ts +38 -0
  11. package/dist/generator/embedGenerator.d.ts.map +1 -0
  12. package/dist/generator/embedGenerator.js +92 -0
  13. package/dist/generator/embedGenerator.js.map +1 -0
  14. package/dist/generator/feedGenerator.d.ts +50 -0
  15. package/dist/generator/feedGenerator.d.ts.map +1 -0
  16. package/dist/generator/feedGenerator.js +167 -0
  17. package/dist/generator/feedGenerator.js.map +1 -0
  18. package/dist/generator/podcastFeedGenerator.d.ts +54 -0
  19. package/dist/generator/podcastFeedGenerator.d.ts.map +1 -0
  20. package/dist/generator/podcastFeedGenerator.js +173 -0
  21. package/dist/generator/podcastFeedGenerator.js.map +1 -0
  22. package/dist/generator/proceduralCoverGenerator.d.ts +51 -0
  23. package/dist/generator/proceduralCoverGenerator.d.ts.map +1 -0
  24. package/dist/generator/proceduralCoverGenerator.js +228 -0
  25. package/dist/generator/proceduralCoverGenerator.js.map +1 -0
  26. package/dist/generator/siteGenerator.d.ts +55 -0
  27. package/dist/generator/siteGenerator.d.ts.map +1 -0
  28. package/dist/generator/siteGenerator.js +539 -0
  29. package/dist/generator/siteGenerator.js.map +1 -0
  30. package/dist/generator/templateEngine.d.ts +13 -0
  31. package/dist/generator/templateEngine.d.ts.map +1 -0
  32. package/dist/generator/templateEngine.js +146 -0
  33. package/dist/generator/templateEngine.js.map +1 -0
  34. package/dist/index.d.ts +12 -0
  35. package/dist/index.d.ts.map +1 -0
  36. package/dist/index.js +32 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/parser/catalogParser.d.ts +13 -0
  39. package/dist/parser/catalogParser.d.ts.map +1 -0
  40. package/dist/parser/catalogParser.js +120 -0
  41. package/dist/parser/catalogParser.js.map +1 -0
  42. package/dist/tools/generate-codes.d.ts +14 -0
  43. package/dist/tools/generate-codes.d.ts.map +1 -0
  44. package/dist/tools/generate-codes.js +274 -0
  45. package/dist/tools/generate-codes.js.map +1 -0
  46. package/dist/tools/generate-sea-pair.d.ts +14 -0
  47. package/dist/tools/generate-sea-pair.d.ts.map +1 -0
  48. package/dist/tools/generate-sea-pair.js +111 -0
  49. package/dist/tools/generate-sea-pair.js.map +1 -0
  50. package/dist/types/index.d.ts +117 -0
  51. package/dist/types/index.d.ts.map +1 -0
  52. package/dist/types/index.js +5 -0
  53. package/dist/types/index.js.map +1 -0
  54. package/dist/utils/audioUtils.d.ts +9 -0
  55. package/dist/utils/audioUtils.d.ts.map +1 -0
  56. package/dist/utils/audioUtils.js +67 -0
  57. package/dist/utils/audioUtils.js.map +1 -0
  58. package/dist/utils/configUtils.d.ts +11 -0
  59. package/dist/utils/configUtils.d.ts.map +1 -0
  60. package/dist/utils/configUtils.js +50 -0
  61. package/dist/utils/configUtils.js.map +1 -0
  62. package/dist/utils/fileUtils.d.ts +14 -0
  63. package/dist/utils/fileUtils.d.ts.map +1 -0
  64. package/dist/utils/fileUtils.js +73 -0
  65. package/dist/utils/fileUtils.js.map +1 -0
  66. package/examples/artist-free/README.md +36 -0
  67. package/examples/artist-paycurtain/README.md +49 -0
  68. package/examples/label/README.md +33 -0
  69. package/gundb-keypair.json +8 -0
  70. package/logo.svg +30 -0
  71. package/package-lock.json +1176 -0
  72. package/package.json +42 -0
  73. package/public/assets/community-registry.js +291 -0
  74. package/public/assets/download-stats.js +263 -0
  75. package/public/assets/player.js +219 -0
  76. package/public/assets/style.css +1170 -0
  77. package/public/assets/theme-widget.js +353 -0
  78. package/public/assets/unlock-codes.js +225 -0
  79. package/public/atom.xml +22 -0
  80. package/public/catalog.m3u +3 -0
  81. package/public/feed.xml +22 -0
  82. package/public/image.png +0 -0
  83. package/public/index.html +249 -0
  84. package/public/logo.svg +30 -0
  85. package/public/releases/chirichetto/Homologo - Chirichetto.wav +0 -0
  86. package/public/releases/chirichetto/cover.png +0 -0
  87. package/public/releases/chirichetto/embed-code.txt +16 -0
  88. package/public/releases/chirichetto/embed-compact.txt +8 -0
  89. package/public/releases/chirichetto/embed.html +39 -0
  90. package/public/releases/chirichetto/index.html +389 -0
  91. package/public/releases/chirichetto/playlist.m3u +3 -0
  92. package/templates/dark/assets/community-registry.js +291 -0
  93. package/templates/dark/assets/download-stats.js +263 -0
  94. package/templates/dark/assets/player.js +219 -0
  95. package/templates/dark/assets/style.css +740 -0
  96. package/templates/dark/index.hbs +73 -0
  97. package/templates/dark/layout.hbs +84 -0
  98. package/templates/dark/release.hbs +212 -0
  99. package/templates/default/assets/community-registry.js +291 -0
  100. package/templates/default/assets/download-stats.js +263 -0
  101. package/templates/default/assets/player.js +219 -0
  102. package/templates/default/assets/style.css +1170 -0
  103. package/templates/default/assets/theme-widget.js +353 -0
  104. package/templates/default/assets/unlock-codes.js +225 -0
  105. package/templates/default/index.hbs +188 -0
  106. package/templates/default/layout.hbs +117 -0
  107. package/templates/default/release.hbs +553 -0
  108. package/templates/minimal/assets/community-registry.js +291 -0
  109. package/templates/minimal/assets/download-stats.js +263 -0
  110. package/templates/minimal/assets/player.js +219 -0
  111. package/templates/minimal/assets/style.css +796 -0
  112. package/templates/minimal/index.hbs +73 -0
  113. package/templates/minimal/layout.hbs +84 -0
  114. package/templates/minimal/release.hbs +212 -0
  115. package/templates/retro/assets/community-registry.js +291 -0
  116. package/templates/retro/assets/download-stats.js +263 -0
  117. package/templates/retro/assets/player.js +219 -0
  118. package/templates/retro/assets/style.css +872 -0
  119. package/templates/retro/index.hbs +73 -0
  120. package/templates/retro/layout.hbs +84 -0
  121. package/templates/retro/release.hbs +212 -0
  122. package/templates/translucent/assets/community-registry.js +291 -0
  123. package/templates/translucent/assets/download-stats.js +263 -0
  124. package/templates/translucent/assets/player.js +219 -0
  125. package/templates/translucent/assets/style.css +1352 -0
  126. package/templates/translucent/index.hbs +73 -0
  127. package/templates/translucent/layout.hbs +84 -0
  128. package/templates/translucent/release.hbs +212 -0
  129. package/website/community.html +492 -0
  130. package/website/index.html +195 -0
  131. package/website/styles.css +396 -0
  132. package/website/tunecamp.svg +30 -0
@@ -0,0 +1,219 @@
1
+ // Tunecamp Audio Player
2
+
3
+ class AudioPlayer {
4
+ constructor() {
5
+ this.audio = new Audio();
6
+ this.currentTrack = 0;
7
+ this.isPlaying = false;
8
+ this.tracks = window.tracks || [];
9
+
10
+ this.initElements();
11
+ this.attachListeners();
12
+ this.loadTrack(0);
13
+ }
14
+
15
+ initElements() {
16
+ this.playBtn = document.getElementById('playBtn');
17
+ this.prevBtn = document.getElementById('prevBtn');
18
+ this.nextBtn = document.getElementById('nextBtn');
19
+ this.progressBar = document.getElementById('progressBar');
20
+ this.volumeBar = document.getElementById('volumeBar');
21
+ this.currentTimeEl = document.getElementById('currentTime');
22
+ this.durationEl = document.getElementById('duration');
23
+ this.playerTitle = document.getElementById('playerTitle');
24
+ this.playerArtist = document.getElementById('playerArtist');
25
+ }
26
+
27
+ attachListeners() {
28
+ // Play/Pause
29
+ if (this.playBtn) {
30
+ this.playBtn.addEventListener('click', () => this.togglePlay());
31
+ }
32
+
33
+ // Previous track
34
+ if (this.prevBtn) {
35
+ this.prevBtn.addEventListener('click', () => this.previousTrack());
36
+ }
37
+
38
+ // Next track
39
+ if (this.nextBtn) {
40
+ this.nextBtn.addEventListener('click', () => this.nextTrack());
41
+ }
42
+
43
+ // Progress bar
44
+ if (this.progressBar) {
45
+ this.progressBar.addEventListener('input', (e) => {
46
+ const time = (this.audio.duration / 100) * e.target.value;
47
+ this.audio.currentTime = time;
48
+ });
49
+ }
50
+
51
+ // Volume
52
+ if (this.volumeBar) {
53
+ this.volumeBar.addEventListener('input', (e) => {
54
+ this.audio.volume = e.target.value / 100;
55
+ });
56
+ this.audio.volume = this.volumeBar.value / 100;
57
+ }
58
+
59
+ // Audio events
60
+ this.audio.addEventListener('timeupdate', () => this.updateProgress());
61
+ this.audio.addEventListener('loadedmetadata', () => this.updateDuration());
62
+ this.audio.addEventListener('ended', () => this.nextTrack());
63
+
64
+ // Track click listeners
65
+ document.querySelectorAll('.track-item').forEach((item, index) => {
66
+ item.addEventListener('click', (e) => {
67
+ if (!e.target.closest('.track-download-btn')) {
68
+ this.playTrack(index);
69
+ }
70
+ });
71
+ });
72
+ }
73
+
74
+ loadTrack(index) {
75
+ if (!this.tracks[index]) return;
76
+
77
+ this.currentTrack = index;
78
+ const track = this.tracks[index];
79
+
80
+ this.audio.src = track.url;
81
+
82
+ if (this.playerTitle) {
83
+ this.playerTitle.textContent = track.title;
84
+ }
85
+
86
+ if (this.playerArtist && track.artist) {
87
+ this.playerArtist.textContent = track.artist;
88
+ }
89
+
90
+ // Update active track in list
91
+ document.querySelectorAll('.track-item').forEach((item, i) => {
92
+ if (i === index) {
93
+ item.classList.add('playing');
94
+ } else {
95
+ item.classList.remove('playing');
96
+ }
97
+ });
98
+ }
99
+
100
+ togglePlay() {
101
+ if (this.isPlaying) {
102
+ this.pause();
103
+ } else {
104
+ this.play();
105
+ }
106
+ }
107
+
108
+ play() {
109
+ this.audio.play();
110
+ this.isPlaying = true;
111
+
112
+ if (this.playBtn) {
113
+ this.playBtn.innerHTML = '<i class="fas fa-pause"></i>';
114
+ }
115
+ }
116
+
117
+ pause() {
118
+ this.audio.pause();
119
+ this.isPlaying = false;
120
+
121
+ if (this.playBtn) {
122
+ this.playBtn.innerHTML = '<i class="fas fa-play"></i>';
123
+ }
124
+ }
125
+
126
+ playTrack(index) {
127
+ this.loadTrack(index);
128
+ this.play();
129
+ }
130
+
131
+ previousTrack() {
132
+ let prev = this.currentTrack - 1;
133
+ if (prev < 0) {
134
+ prev = this.tracks.length - 1;
135
+ }
136
+ this.playTrack(prev);
137
+ }
138
+
139
+ nextTrack() {
140
+ let next = this.currentTrack + 1;
141
+ if (next >= this.tracks.length) {
142
+ next = 0;
143
+ }
144
+ this.playTrack(next);
145
+ }
146
+
147
+ updateProgress() {
148
+ if (!this.audio.duration) return;
149
+
150
+ const percent = (this.audio.currentTime / this.audio.duration) * 100;
151
+
152
+ if (this.progressBar) {
153
+ this.progressBar.value = percent;
154
+ }
155
+
156
+ if (this.currentTimeEl) {
157
+ this.currentTimeEl.textContent = this.formatTime(this.audio.currentTime);
158
+ }
159
+ }
160
+
161
+ updateDuration() {
162
+ if (this.durationEl) {
163
+ this.durationEl.textContent = this.formatTime(this.audio.duration);
164
+ }
165
+ }
166
+
167
+ formatTime(seconds) {
168
+ if (!seconds || isNaN(seconds)) return '0:00';
169
+
170
+ const mins = Math.floor(seconds / 60);
171
+ const secs = Math.floor(seconds % 60);
172
+ return `${mins}:${secs.toString().padStart(2, '0')}`;
173
+ }
174
+ }
175
+
176
+ // Initialize player when DOM is ready
177
+ if (document.readyState === 'loading') {
178
+ document.addEventListener('DOMContentLoaded', () => {
179
+ if (window.tracks && window.tracks.length > 0) {
180
+ window.player = new AudioPlayer();
181
+ }
182
+ });
183
+ } else {
184
+ if (window.tracks && window.tracks.length > 0) {
185
+ window.player = new AudioPlayer();
186
+ }
187
+ }
188
+
189
+ // Global function for track buttons
190
+ function playTrack(index) {
191
+ if (window.player) {
192
+ window.player.playTrack(index);
193
+ }
194
+ }
195
+
196
+ // Download all function
197
+ function downloadAll() {
198
+ // Call tracking hook if registered (for download stats)
199
+ if (typeof window.onDownloadAll === 'function') {
200
+ try {
201
+ window.onDownloadAll();
202
+ } catch (e) {
203
+ console.warn('Download tracking error:', e);
204
+ }
205
+ }
206
+
207
+ // Perform the actual downloads
208
+ if (window.tracks) {
209
+ window.tracks.forEach(track => {
210
+ const a = document.createElement('a');
211
+ a.href = track.url;
212
+ a.download = track.title;
213
+ document.body.appendChild(a);
214
+ a.click();
215
+ document.body.removeChild(a);
216
+ });
217
+ }
218
+ }
219
+