diff --git a/packages/euterpe/package.json b/packages/euterpe/package.json index af7fc7d..700f0c0 100644 --- a/packages/euterpe/package.json +++ b/packages/euterpe/package.json @@ -1,6 +1,6 @@ { "name": "@euterpe.js/euterpe", - "version": "1.0.11", + "version": "1.0.13", "type": "module", "description": "Fully featured solution for playing music on the web. Support for local library, audio visuals and more!", "main": "./src/index.js", diff --git a/packages/player/package.json b/packages/player/package.json index b8526b3..2d7f274 100644 --- a/packages/player/package.json +++ b/packages/player/package.json @@ -1,6 +1,6 @@ { "name": "@euterpe.js/player", - "version": "1.0.6", + "version": "1.0.8", "type": "module", "description": "A simple, safe AudioContext web music player", "main": "./src/index.js", diff --git a/packages/player/src/index.ts b/packages/player/src/index.ts index 3433942..c83c5a0 100644 --- a/packages/player/src/index.ts +++ b/packages/player/src/index.ts @@ -122,7 +122,7 @@ export class MusicPlayer { */ try_seek_async(new_time: number) { return new Promise((resolve, reject) => { - if (this.track.context.state == "closed" || this.track.context.state == "suspended") { + if (this.track.context.state !== "running") { this.is_playing = false reject(new Error("Can't seek - track not playing")) } @@ -141,9 +141,9 @@ export class MusicPlayer { */ try_play_toggle_async() { return new Promise((resolve, reject) => { - if (this.audio_context.state === "suspended" || this.audio_context.state === "closed") { + if (this.track.context.state !== "running") { this.audio_context.resume().then(undefined, (e) => - reject(new Error("Context closed or suspended" + JSON.stringify(e)))) + reject(e)) } if (this.audio_element.paused) { this.audio_element.play().then((s) => { @@ -151,7 +151,7 @@ export class MusicPlayer { resolve(s) }, (r) => { this.is_playing = false - reject(new Error("failed to play audio elements" + JSON.stringify(r))) + reject(r) }) } else { this.audio_element.pause() @@ -165,7 +165,7 @@ export class MusicPlayer { */ play_toggle_async() { return new Promise((resolve, reject) => { - if (this.audio_context.state === "suspended" || this.audio_context.state === "closed") { + if (this.track.context.state !== "running") { this.audio_context.resume() } if (this.audio_element.paused) { @@ -174,7 +174,7 @@ export class MusicPlayer { resolve(s) }, (r) => { this.is_playing = false - reject(new Error(JSON.stringify(r))) + reject(r) }) } else { this.audio_element.pause() @@ -204,14 +204,14 @@ export class MusicPlayer { try_play_async() { return new Promise((resolve, reject) => { if (this.is_playing) resolve(Error("Already playing")) - if (this.audio_context.state === "suspended" || this.audio_context.state === "closed") { + if (this.track.context.state !== "running") { this.audio_context.resume().then(() => { this.audio_element.play().then((s) => { this.is_playing = true resolve(s) }, (r) => { this.is_playing = false - reject(new Error(JSON.stringify(r))) + reject(r) }) }, (e) => reject(new Error("Context closed or suspended" + JSON.stringify(e)))) @@ -221,7 +221,7 @@ export class MusicPlayer { resolve(s) }, (r) => { this.is_playing = false - reject(new Error(JSON.stringify(r))) + reject(r) }) } }) @@ -237,7 +237,7 @@ export class MusicPlayer { resolve(s) }, (r) => { this.is_playing = false - reject(new Error(JSON.stringify(r))) + reject(r) }) }) } @@ -248,7 +248,7 @@ export class MusicPlayer { if (this.is_playing) return this.audio_element.play().catch((r) => { this.is_playing = false - throw new Error(r) + throw r }) } /** @@ -274,12 +274,12 @@ export class MusicPlayer { this.audio_element.addEventListener("error", function error_listener(e) { controller.abort() - reject(new Error("Failed to load new song, error:" + JSON.stringify(e))) + reject(e) }, { signal: controller.signal }) this.audio_element.addEventListener("stalled", function stalled_listener(e) { controller.abort() - reject(new Error("Failed to load new song, stalled: " + JSON.stringify(e))) + reject(e) }, { signal: controller.signal }) //once aborted, try to set current_song_duration @@ -408,7 +408,7 @@ export class MusicPlayerBuilder { constructor(private audio_element: HTMLAudioElement) { if (audio_element === undefined) throw Error("audio_element was undefined") // ↓ For old browsers - const AudioContext = window.AudioContext || window.webkitAudioContext; + const AudioContext = window.AudioContext; this.#audio_context = new AudioContext() this.#track = this.#audio_context.createMediaElementSource(audio_element) this.#gain = this.#audio_context.createGain() diff --git a/packages/preprocessor/src/media_process.js b/packages/preprocessor/src/media_process.js index 5a8ee1d..7cca222 100644 --- a/packages/preprocessor/src/media_process.js +++ b/packages/preprocessor/src/media_process.js @@ -8,21 +8,33 @@ import filehound from "filehound" import { execSync, exec } from 'child_process' import { fstat, unlinkSync } from "fs" -function generateNewPhotoSizes(file, currentExtention) { +function generate_new_photo_sizes(file, currentExtention) { exec(`start ffmpeg -y -i "${file}.${currentExtention}" -lossless 0 -quality 85 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_ogw.webp" -vf scale=1000:-1 -lossless 0 -quality 85 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_1000w.webp" -vf scale=800:-1 -lossless 0 -quality 85 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_800w.webp" -vf scale=500:-1 -lossless 0 -quality 85 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_500w.webp" -vf scale=320:-1 -lossless 0 -quality 85 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_320w.webp" -vf scale=-1:64,gblur=sigma=10:steps=2 -lossless 0 -compression_level 6 -quality 85 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_placeholder.webp"`) } -function generateNewAnimPhotoSizes(file, currentExtention) { +function generate_new_anim_photo_sizes(file, currentExtention) { exec(`start ffmpeg -y -i "${file}.${currentExtention}" -lossless 0 -frames:v 1 -r 1 -quality 85 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_ogw_static.webp" -vf scale=1000:-1 -lossless 0 -frames:v 1 -r 1 -quality 85 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_1000w_static.webp" -vf scale=800:-1 -lossless 0 -frames:v 1 -r 1 -quality 85 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_800w_static.webp" -vf scale=500:-1 -lossless 0 -frames:v 1 -r 1 -quality 85 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_500w_static.webp" -vf scale=320:-1 -lossless 0 -frames:v 1 -r 1 -quality 85 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_320w_static.webp" -vf scale=-1:64,gblur=sigma=10:steps=2 -lossless 0 -frames:v 1 -r 1 -compression_level 6 -quality 85 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_placeholder_static.webp"`) exec(`start ffmpeg -y -i "${file}.${currentExtention}" -lossless 0 -quality 85 -loop 0 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_ogw.webp" -vf scale=1000:-1 -lossless 0 -quality 85 -loop 0 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_1000w.webp" -vf scale=800:-1 -lossless 0 -quality 85 -loop 0 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_800w.webp" -vf scale=500:-1 -lossless 0 -quality 85 -loop 0 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_500w.webp" -vf scale=320:-1 -lossless 0 -quality 85 -loop 0 -compression_level 6 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_320w.webp" -vf scale=-1:64,gblur=sigma=10:steps=2 -frames:v 1 -lossless 0 -c:v libwebp -compression_level 6 -quality 85 -metadata author="Djkáťo" -metadata copyright="https://djkato.net" "${file}_placeholder.webp"`) } -function generateNewSounds(file, currentExtention) { +function generate_new_sounds_ogg(file, currentExtention) { const path = file.substring(0, file.lastIndexOf("\\")) file = file.substring(file.lastIndexOf("\\") + 1) let command = "" command += `cd "${path}" && start cmd /k "` command += `ffmpeg -y -i "${file}.${currentExtention}" ` - command += `-c:a libopus -b:a 128k "${file}.ogg"` + command += `-c:a libopus -b:a 96k "${file}.ogg"` + command += ` && exit"` + exec(command) + // console.log(command) +} +function generate_new_sounds_mp3(file, currentExtention) { + const path = file.substring(0, file.lastIndexOf("\\")) + file = file.substring(file.lastIndexOf("\\") + 1) + + let command = "" + command += `cd "${path}" && start cmd /k "` + command += `ffmpeg -y -i "${file}.${currentExtention}" ` + command += `-b:a 160k "${file}.mp3"` command += ` && exit"` exec(command) // console.log(command) @@ -70,25 +82,27 @@ for (let i = 0; i < dirs.length; i++) { } for (let current_media of current_folder_files) { current_media = [current_media.substring(0, current_media.lastIndexOf(".")), current_media.substring(current_media.lastIndexOf(".") + 1)] - if (current_media[1] == "wav" || current_media[1] == "mp3") { + if (current_media[1] == "wav") { console.log(`${current_media[0]}.${current_media[1]}\n`) - generateNewSounds(`${current_media[0]}`, `${current_media[1]}`) + generate_new_sounds_ogg(`${current_media[0]}`, `${current_media[1]}`) + generate_new_sounds_mp3(`${current_media[0]}`, `${current_media[1]}`) } + continue if (current_media[1] == "png" || current_media[1] == "jpg") { console.log(`.\\${current_media[0]}.${current_media[1]}\n`) - generateNewPhotoSizes(`.\\${current_media[0]}`, `${current_media[1]}`) + generate_new_photo_sizes(`.\\${current_media[0]}`, `${current_media[1]}`) } else if (current_media[1] == "gif") { console.log(`.\\${current_media[0]}.${current_media[1]}\n`) - generateNewAnimPhotoSizes(`.\\${current_media[0]}`, `${current_media[1]}`) + generate_new_anim_photo_sizes(`.\\${current_media[0]}`, `${current_media[1]}`) } else if (current_media[1] == "webm" || current_media[1] == "mov" || current_media[1] == "avi" || current_media[1] == "mp4") { - //console.log(`Video: ${current_media[0]}.${current_media[1]}\n`) + console.log(`Video: ${current_media[0]}.${current_media[1]}\n`) - // generateNewVideoSizes(`${current_media[0]}`, `${current_media[1]}`, [2560, 1080, 720, 480]) + generateNewVideoSizes(`${current_media[0]}`, `${current_media[1]}`, [2560, 1080, 720, 480]) } } diff --git a/packages/visualizer/package.json b/packages/visualizer/package.json index dde4f2e..ca258e7 100644 --- a/packages/visualizer/package.json +++ b/packages/visualizer/package.json @@ -1,6 +1,6 @@ { "name": "@euterpe.js/visualizer", - "version": "1.0.7", + "version": "1.0.8", "type": "module", "description": "Music visualizer based on SVG and AudioContext", "main": "./src/index.js",