From 1e115a982b2754fcd4770d28fd0e970d7efee5fd Mon Sep 17 00:00:00 2001 From: jlvihv Date: Fri, 14 Jun 2024 00:23:49 +0800 Subject: [PATCH] fix bug --- bun.lockb | Bin 129391 -> 139909 bytes package.json | 6 +- src-tauri/Cargo.lock | 699 +++++++++++++++++- src-tauri/Cargo.toml | 6 +- src-tauri/capabilities/default.json | 32 +- src-tauri/src/ffmpeg.rs | 53 +- src-tauri/src/lib.rs | 5 + src-tauri/src/manager.rs | 25 + src-tauri/src/media.rs | 29 + src-tauri/tauri.conf.json | 2 +- src/lib/backstage.ts | 6 +- src/lib/components/button.svelte | 21 +- src/lib/components/new-record.svelte | 483 ------------ src/lib/components/sidebar.svelte | 47 +- src/lib/ffmpeg.ts | 161 ++++ src/lib/i18n/cn.json | 9 +- src/lib/i18n/en.json | 9 +- src/lib/model.ts | 2 +- src/lib/platform/youtube.ts | 63 +- src/routes/+layout.svelte | 15 +- src/routes/+page.svelte | 25 +- .../config/+page.svelte} | 8 +- src/routes/live/+page.svelte | 67 ++ src/routes/live/forward/+page.svelte | 263 +++++++ src/routes/record/+page.svelte | 432 +++++++++++ .../record/history/+page.svelte} | 9 +- .../record/plan/+page.svelte} | 9 +- 27 files changed, 1872 insertions(+), 614 deletions(-) create mode 100644 src-tauri/src/media.rs delete mode 100644 src/lib/components/new-record.svelte create mode 100644 src/lib/ffmpeg.ts rename src/{lib/components/config.svelte => routes/config/+page.svelte} (95%) create mode 100644 src/routes/live/+page.svelte create mode 100644 src/routes/live/forward/+page.svelte create mode 100644 src/routes/record/+page.svelte rename src/{lib/components/record-list.svelte => routes/record/history/+page.svelte} (97%) rename src/{lib/components/record-plan.svelte => routes/record/plan/+page.svelte} (94%) diff --git a/bun.lockb b/bun.lockb index f6ce846ff0b8baadf87f5d9feca9f42ace41a4ab..773bc3c650a22c4d1e59e30ce4394b931762b1d0 100755 GIT binary patch delta 28266 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 delta 22416 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 diff --git a/package.json b/package.json index 5233ffc..1a59b8a 100644 --- a/package.json +++ b/package.json @@ -14,10 +14,12 @@ "license": "MIT", "dependencies": { "@tauri-apps/api": "^2.0.0-beta.13", + "@tauri-apps/plugin-dialog": "^2.0.0-beta.5", "@tauri-apps/plugin-shell": "^2.0.0-beta.6", "@types/crypto-js": "^4.2.2", "crypto-js": "^4.2.0", "dayjs": "^1.11.11", + "jsonpath-plus": "^9.0.0", "svelte-sonner": "^0.3.24", "sveltekit-i18n": "^2.4.2" }, @@ -37,12 +39,12 @@ "prettier": "^3.3.2", "prettier-plugin-svelte": "^3.2.4", "prettier-plugin-tailwindcss": "^0.5.14", - "svelte": "^5.0.0-next.153", + "svelte": "^5.0.0-next.154", "svelte-check": "^3.8.0", "tailwindcss": "^3.4.4", "tslib": "^2.6.3", "typescript": "^5.4.5", "unplugin-icons": "^0.19.0", - "vite": "^5.2.13" + "vite": "^5.3.0" } } diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index 0f9811c..71a16eb 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -26,6 +26,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + [[package]] name = "alloc-no-stdlib" version = "2.0.4" @@ -62,6 +68,46 @@ version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "ashpd" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd884d7c72877a94102c3715f3b1cd09ff4fac28221add3e57cfbe25c236d093" +dependencies = [ + "enumflags2", + "futures-channel", + "futures-util", + "rand 0.8.5", + "serde", + "serde_repr", + "tokio", + "url", + "zbus", +] + [[package]] name = "async-broadcast" version = "0.7.1" @@ -241,11 +287,34 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" +[[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876c75a42f6364451a033496a14c44bffe41f5f4a8236f697391f11024e596d2" +dependencies = [ + "arrayvec", +] + [[package]] name = "backtrace" -version = "0.3.72" +version = "0.3.73" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17c6a35df3749d2e8bb1b7b21a976d82b15548788d2735b9d82f329268f71a11" +checksum = "5cc23269a4f8976d0a4d2e7109211a419fe30e8d88d677cd60b6bc79c5732e0a" dependencies = [ "addr2line", "cc", @@ -268,6 +337,12 @@ version = "0.22.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + [[package]] name = "bitflags" version = "1.3.2" @@ -283,6 +358,12 @@ dependencies = [ "serde", ] +[[package]] +name = "bitstream-io" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c12d1856e42f0d817a835fe55853957c85c8c8a470114029143d3f12671446e" + [[package]] name = "block" version = "0.1.6" @@ -341,6 +422,12 @@ dependencies = [ "alloc-stdlib", ] +[[package]] +name = "built" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6a6c0b39c38fd754ac338b00a88066436389c0f029da5d37d1e01091d9b7c17" + [[package]] name = "bumpalo" version = "3.16.0" @@ -359,6 +446,12 @@ version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + [[package]] name = "bytes" version = "1.6.0" @@ -440,6 +533,11 @@ name = "cc" version = "1.0.99" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "96c51067fd44124faa7f870b4b1c969379ad32b2ba805aa959430ceaa384f695" +dependencies = [ + "jobserver", + "libc", + "once_cell", +] [[package]] name = "cesu8" @@ -525,6 +623,12 @@ dependencies = [ "objc", ] +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + [[package]] name = "combine" version = "4.6.7" @@ -617,12 +721,37 @@ dependencies = [ "crossbeam-utils", ] +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + [[package]] name = "crypto-common" version = "0.1.6" @@ -889,6 +1018,12 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0d6ef0072f8a535281e4876be788938b528e9a1d43900b82c2569af7da799125" +[[package]] +name = "either" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dca9240753cf90908d7e4aac30f630662b02aebaa1b58a3cadabdb23385b58b" + [[package]] name = "embed-resource" version = "2.4.2" @@ -982,6 +1117,22 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "exr" +version = "1.72.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" +dependencies = [ + "bit_field", + "flume", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", +] + [[package]] name = "fastrand" version = "2.1.0" @@ -1026,6 +1177,15 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "spin", +] + [[package]] name = "fnv" version = "1.0.7" @@ -1331,6 +1491,16 @@ dependencies = [ "wasi 0.11.0+wasi-snapshot-preview1", ] +[[package]] +name = "gif" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +dependencies = [ + "color_quant", + "weezl", +] + [[package]] name = "gimli" version = "0.29.0" @@ -1504,6 +1674,16 @@ dependencies = [ "tracing", ] +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -1590,9 +1770,9 @@ dependencies = [ [[package]] name = "httparse" -version = "1.9.2" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f3935c160d00ac752e09787e6e6bfc26494c2183cc922f1bc678a60d4733bc2" +checksum = "d0e7a4dd27b9476dc40cb050d3632d3bba3a70ddbff012285f7f8559a1e7e545" [[package]] name = "hyper" @@ -1819,6 +1999,45 @@ dependencies = [ "utf8_iter", ] +[[package]] +name = "image" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd54d660e773627692c524beaad361aca785a4f9f5730ce91f42aabe5bce3d11" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "exr", + "gif", + "image-webp", + "num-traits", + "png", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d730b085583c4d789dfd07fdcf185be59501666a90c97c40162b37e4fdad272d" +dependencies = [ + "byteorder-lite", + "thiserror", +] + +[[package]] +name = "imgref" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126" + [[package]] name = "indexmap" version = "1.9.3" @@ -1859,6 +2078,17 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "ipnet" version = "2.9.0" @@ -1884,6 +2114,15 @@ dependencies = [ "once_cell", ] +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "0.4.8" @@ -1941,6 +2180,21 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +[[package]] +name = "jobserver" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + +[[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" + [[package]] name = "js-sys" version = "0.3.69" @@ -1991,6 +2245,12 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +[[package]] +name = "lebe" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" + [[package]] name = "libappindicator" version = "0.9.0" @@ -2021,6 +2281,17 @@ version = "0.2.155" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" +[[package]] +name = "libfuzzer-sys" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" +dependencies = [ + "arbitrary", + "cc", + "once_cell", +] + [[package]] name = "libloading" version = "0.7.4" @@ -2071,7 +2342,7 @@ checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704" [[package]] name = "liveship" -version = "0.1.15" +version = "0.1.16" dependencies = [ "anyhow", "async-trait", @@ -2079,6 +2350,7 @@ dependencies = [ "dashmap", "dirs", "ffmpeg-sidecar", + "image", "once_cell", "redb", "reqwest", @@ -2088,6 +2360,7 @@ dependencies = [ "strum", "tauri", "tauri-build", + "tauri-plugin-dialog", "tauri-plugin-shell", "tauri-plugin-single-instance", "tokio", @@ -2124,6 +2397,15 @@ dependencies = [ "tracing-subscriber", ] +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + [[package]] name = "mac" version = "0.1.1" @@ -2168,6 +2450,16 @@ version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + [[package]] name = "memchr" version = "2.7.2" @@ -2198,6 +2490,12 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.7.3" @@ -2321,6 +2619,22 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + [[package]] name = "nu-ansi-term" version = "0.46.0" @@ -2331,12 +2645,53 @@ dependencies = [ "winapi", ] +[[package]] +name = "num-bigint" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c165a9ab64cf766f73521c0dd2cfdff64f488b8f0b3e621face3462d3db536d7" +dependencies = [ + "num-integer", + "num-traits", +] + [[package]] name = "num-conv" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + [[package]] name = "num-traits" version = "0.2.19" @@ -2387,6 +2742,17 @@ dependencies = [ "objc_exception", ] +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + [[package]] name = "objc-sys" version = "0.3.5" @@ -2457,6 +2823,7 @@ checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ "bitflags 2.5.0", "block2", + "dispatch", "libc", "objc2", ] @@ -2506,9 +2873,9 @@ dependencies = [ [[package]] name = "object" -version = "0.35.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8ec7ab813848ba4522158d5517a6093db1ded27575b070f4177b8d12b41db5e" +checksum = "576dfe1fc8f9df304abb159d767a29d0476f7750fbf8aa7ad07816004a207434" dependencies = [ "memchr", ] @@ -2660,6 +3027,12 @@ dependencies = [ "windows-targets 0.52.5", ] +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + [[package]] name = "pathdiff" version = "0.2.1" @@ -2974,6 +3347,40 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "profiling" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8021cf59c8ec9c432cfc2526ac6b8aa508ecaf29cd415f271b8406c1b851c3fd" +dependencies = [ + "quote", + "syn 2.0.66", +] + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + [[package]] name = "quick-xml" version = "0.31.0" @@ -3073,6 +3480,56 @@ dependencies = [ "rand_core 0.5.1", ] +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand 0.8.5", + "rand_chacha 0.3.1", + "simd_helpers", + "system-deps", + "thiserror", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc13288f5ab39e6d7c9d501759712e6969fcc9734220846fc9ed26cae2cc4234" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + [[package]] name = "raw-window-handle" version = "0.5.2" @@ -3085,6 +3542,26 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + [[package]] name = "redb" version = "2.1.1" @@ -3202,6 +3679,39 @@ dependencies = [ "winreg", ] +[[package]] +name = "rfd" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a73a7337fc24366edfca76ec521f51877b114e42dab584008209cca6719251" +dependencies = [ + "ashpd", + "block", + "dispatch", + "glib-sys", + "gobject-sys", + "gtk-sys", + "js-sys", + "log", + "objc", + "objc-foundation", + "objc_id", + "raw-window-handle 0.6.2", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-sys 0.48.0", +] + +[[package]] +name = "rgb" +version = "0.8.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05aaa8004b64fd573fc9d002f4e632d51ad4f026c2b5ba95fcb6c2f32c2c47d8" +dependencies = [ + "bytemuck", +] + [[package]] name = "rustbus" version = "0.19.3" @@ -3592,6 +4102,15 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + [[package]] name = "siphasher" version = "0.3.11" @@ -3625,9 +4144,9 @@ dependencies = [ [[package]] name = "softbuffer" -version = "0.4.3" +version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d09e57a5a6b300bf917329da0ff30a58737d83abb7b14f99a419c23e83007cb8" +checksum = "2ae0d2e93c874cca74fe830bccbd1132299318932d273d2a3c77ad77476a3d7e" dependencies = [ "bytemuck", "cfg_aliases", @@ -3673,6 +4192,15 @@ dependencies = [ "system-deps", ] +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + [[package]] name = "stable_deref_trait" version = "1.2.0" @@ -3834,9 +4362,9 @@ dependencies = [ [[package]] name = "tao" -version = "0.28.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12a8121bd5721ebbbe0889f8286d5824673beeb04071519b68916fbed04f3093" +checksum = "ea538df05fbc2dcbbd740ba0cfe8607688535f4798d213cbbfa13ce494f3451f" dependencies = [ "bitflags 2.5.0", "cocoa", @@ -3865,8 +4393,8 @@ dependencies = [ "tao-macros", "unicode-segmentation", "url", - "windows 0.56.0", - "windows-core 0.56.0", + "windows 0.57.0", + "windows-core 0.57.0", "windows-version", "x11-dl", ] @@ -4017,6 +4545,43 @@ dependencies = [ "walkdir", ] +[[package]] +name = "tauri-plugin-dialog" +version = "2.0.0-beta.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed4b22c59f7b04ae2a0bed8241aa715b41973c3f042c84aa67a1f4dc0174a8d" +dependencies = [ + "dunce", + "log", + "raw-window-handle 0.6.2", + "rfd", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "tauri-plugin-fs", + "thiserror", +] + +[[package]] +name = "tauri-plugin-fs" +version = "2.0.0-beta.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aa91955751f329e0aa431b87c199b7378b6f91ec0765d2ad9d4c64e017c3cda" +dependencies = [ + "anyhow", + "glob", + "schemars", + "serde", + "serde_json", + "serde_repr", + "tauri", + "tauri-plugin", + "thiserror", + "url", + "uuid", +] + [[package]] name = "tauri-plugin-shell" version = "2.0.0-beta.7" @@ -4199,6 +4764,17 @@ dependencies = [ "once_cell", ] +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + [[package]] name = "time" version = "0.3.36" @@ -4252,8 +4828,10 @@ dependencies = [ "mio", "num_cpus", "pin-project-lite", + "signal-hook-registry", "socket2", "tokio-macros", + "tracing", "windows-sys 0.48.0", ] @@ -4592,6 +5170,17 @@ dependencies = [ "getrandom 0.2.15", ] +[[package]] +name = "v_frame" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + [[package]] name = "valuable" version = "0.1.0" @@ -4821,8 +5410,8 @@ dependencies = [ "webview2-com-sys", "windows 0.56.0", "windows-core 0.56.0", - "windows-implement", - "windows-interface", + "windows-implement 0.56.0", + "windows-interface 0.56.0", ] [[package]] @@ -4847,6 +5436,12 @@ dependencies = [ "windows-core 0.56.0", ] +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + [[package]] name = "winapi" version = "0.3.9" @@ -4920,6 +5515,16 @@ dependencies = [ "windows-targets 0.52.5", ] +[[package]] +name = "windows" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" +dependencies = [ + "windows-core 0.57.0", + "windows-targets 0.52.5", +] + [[package]] name = "windows-core" version = "0.52.0" @@ -4935,8 +5540,20 @@ version = "0.56.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4698e52ed2d08f8658ab0c39512a7c00ee5fe2688c65f8c0a4f06750d729f2a6" dependencies = [ - "windows-implement", - "windows-interface", + "windows-implement 0.56.0", + "windows-interface 0.56.0", + "windows-result", + "windows-targets 0.52.5", +] + +[[package]] +name = "windows-core" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" +dependencies = [ + "windows-implement 0.57.0", + "windows-interface 0.57.0", "windows-result", "windows-targets 0.52.5", ] @@ -4952,6 +5569,17 @@ dependencies = [ "syn 2.0.66", ] +[[package]] +name = "windows-implement" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "windows-interface" version = "0.56.0" @@ -4963,6 +5591,17 @@ dependencies = [ "syn 2.0.66", ] +[[package]] +name = "windows-interface" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.66", +] + [[package]] name = "windows-result" version = "0.1.2" @@ -5344,6 +5983,7 @@ dependencies = [ "serde_repr", "sha1", "static_assertions", + "tokio", "tracing", "uds_windows", "windows-sys 0.52.0", @@ -5421,6 +6061,30 @@ dependencies = [ "syn 2.0.66", ] +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zune-jpeg" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec866b44a2a1fd6133d363f073ca1b179f438f99e7e5bfb1e33f7181facfe448" +dependencies = [ + "zune-core", +] + [[package]] name = "zvariant" version = "4.0.0" @@ -5431,6 +6095,7 @@ dependencies = [ "enumflags2", "serde", "static_assertions", + "url", "zvariant_derive", ] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 291ba36..171dc80 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "liveship" -version = "0.1.15" +version = "0.1.16" description = "liveship 是一个直播录制工具,目前已支持抖音、虎牙、小红书、tiktok、twitch" authors = ["jlvihv"] email = "imvihv@gmail.com" @@ -18,6 +18,7 @@ tauri-build = { version = "2.0.0-beta", features = [] } [dependencies] tauri = { version = "2.0.0-beta", features = [] } tauri-plugin-shell = "2.0.0-beta" +tauri-plugin-dialog = "2.0.0-beta.9" tauri-plugin-single-instance = "2.0.0-beta" serde = { version = "1", features = ["derive"] } serde_json = "1" @@ -30,9 +31,10 @@ once_cell = "1" redb = "2.1" reqwest = "0.12" strum = { version = "0.26", features = ["derive"] } -tokio = { version = "1.37", features = ["rt-multi-thread", "macros"] } +tokio = { version = "1.38", features = ["rt-multi-thread", "macros"] } showfile = "0.1" ffmpeg-sidecar = "1.1" +image = "0.25" [profile.release] strip = true diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index e14ca1d..61e72a9 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -1,17 +1,19 @@ { - "$schema": "../gen/schemas/desktop-schema.json", - "identifier": "default", - "description": "Capability for the main window", - "windows": ["main"], - "permissions": [ - "path:default", - "event:default", - "window:default", - "app:default", - "image:default", - "resources:default", - "menu:default", - "tray:default", - "shell:allow-open" - ] + "$schema": "../gen/schemas/desktop-schema.json", + "identifier": "default", + "description": "Capability for the main window", + "windows": ["main"], + "permissions": [ + "path:default", + "event:default", + "window:default", + "app:default", + "image:default", + "resources:default", + "menu:default", + "tray:default", + "shell:allow-open", + "dialog:default", + "dialog:allow-open" + ] } diff --git a/src-tauri/src/ffmpeg.rs b/src-tauri/src/ffmpeg.rs index b40158c..8e73a21 100644 --- a/src-tauri/src/ffmpeg.rs +++ b/src-tauri/src/ffmpeg.rs @@ -5,6 +5,55 @@ use std::process::{Child, Stdio}; use crate::config::config_dir; +/// 给定 ffmpeg 命令,这里只负责执行 +pub fn execute_ffmpeg_command(ffmpeg_command: Vec) -> Result { + println!("ffmpeg_command: {:?}", ffmpeg_command); + // 调用 ffmpeg 命令 + let mut cmd = std::process::Command::new("ffmpeg"); + // 特定于 windows 的实现,使用 CommandExt,避免出现黑窗口 + #[cfg(target_os = "windows")] + { + use std::os::windows::process::CommandExt; + cmd.creation_flags(0x08000000); // CREATE_NO_WINDOW + } + // cmd.stdout(Stdio::piped()).stderr(Stdio::piped()); + cmd.args(&ffmpeg_command); + let mut child = cmd.spawn()?; + // 立刻 try_wait 一下,看是否有错误 + if let Some(status) = child.try_wait()? { + let output = child.wait_with_output()?; + let stdout = String::from_utf8_lossy(&output.stdout); + let stderr = String::from_utf8_lossy(&output.stderr); + let error_message = format!( + "status: {:?}\nstdout: {}\nstderr: {}", + status, stdout, stderr + ); + return Err(anyhow::anyhow!(error_message)); + } + println!("录制进程启动:{:?}", child.id()); + Ok(child) +} + +/// 给定 ffmpeg 命令,执行并返回输出 +pub fn execute_ffmpeg_command_return_output(ffmpeg_command: Vec) -> Result { + println!("ffmpeg_command: {:?}", ffmpeg_command); + // 调用 ffmpeg 命令 + let output = std::process::Command::new("ffmpeg") + .args(&ffmpeg_command) + .output()?; + let stdout = String::from_utf8_lossy(&output.stdout); + let stderr = String::from_utf8_lossy(&output.stderr); + if !output.status.success() { + return Err(anyhow::anyhow!( + "status: {:?}\nstdout: {}\nstderr: {}", + output.status, + stdout, + stderr + )); + } + Ok(stdout.to_string()) +} + pub fn record(ffmpeg_path: &str, url: &str, filename: &str) -> Result { println!("开始录制:{} -> {}", url, filename); @@ -17,7 +66,7 @@ pub fn record(ffmpeg_path: &str, url: &str, filename: &str) -> Result { cmd.creation_flags(0x08000000); // CREATE_NO_WINDOW } cmd.stdout(Stdio::piped()).stderr(Stdio::piped()); - let ffmpeg_command = build_ffmpeg_command(url, filename); + let ffmpeg_command = build_ffmpeg_record_command(url, filename); cmd.args(&ffmpeg_command); let mut child = cmd.spawn()?; // 立刻 try_wait 一下,看是否有错误 @@ -40,7 +89,7 @@ pub fn record(ffmpeg_path: &str, url: &str, filename: &str) -> Result { Ok(child) } -fn build_ffmpeg_command(url: &str, filename: &str) -> Vec { +fn build_ffmpeg_record_command(url: &str, filename: &str) -> Vec { let user_agent = r#""Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36""#; let analyzeduration = "20000000"; let probesize = "10000000"; diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index 5e5d139..30a3ce2 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -5,6 +5,7 @@ mod config; mod ffmpeg; pub mod kv; mod manager; +mod media; mod model; mod request; mod utils; @@ -12,6 +13,7 @@ mod utils; #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { tauri::Builder::default() + .plugin(tauri_plugin_dialog::init()) .setup(|app| { let main_window = app.get_webview_window("main").unwrap(); main_window.on_window_event(|event| match event { @@ -47,6 +49,9 @@ pub fn run() { manager::ffmpeg_api::check_ffmpeg_version, manager::ffmpeg_api::check_ffmpeg_availability, manager::ffmpeg_api::download_ffmpeg, + manager::ffmpeg_api::execute_ffmpeg_command, + manager::ffmpeg_api::execute_ffmpeg_command_return_output, + manager::ffmpeg_api::get_image_info, manager::request_api::request, manager::request_api::try_request_get_status, manager::request_api::request_post, diff --git a/src-tauri/src/manager.rs b/src-tauri/src/manager.rs index 227077b..5c054c0 100644 --- a/src-tauri/src/manager.rs +++ b/src-tauri/src/manager.rs @@ -348,6 +348,8 @@ pub mod config { } pub mod ffmpeg_api { + use crate::media::{self, MediaInfo}; + use super::*; /// 检查 ffmpeg @@ -377,6 +379,29 @@ pub mod ffmpeg_api { kv::config::set(&config).map_err(|e| format!("Could not set config: {}", e))?; Ok(path) } + + /// 执行 ffmpeg 命令 + #[tauri::command] + pub async fn execute_ffmpeg_command(ffmpeg_command: Vec) -> Result<(), String> { + ffmpeg::execute_ffmpeg_command(ffmpeg_command) + .map_err(|e| format!("Could not run ffmpeg command: {}", e))?; + Ok(()) + } + + #[tauri::command] + pub async fn execute_ffmpeg_command_return_output( + ffmpeg_command: Vec, + ) -> Result { + let output = ffmpeg::execute_ffmpeg_command_return_output(ffmpeg_command) + .map_err(|e| format!("Could not run ffmpeg command: {}", e))?; + Ok(output) + } + + #[tauri::command] + pub async fn get_image_info(file_path: String) -> Result { + let info = media::get_image_info(&file_path)?; + Ok(info) + } } pub mod request_api { diff --git a/src-tauri/src/media.rs b/src-tauri/src/media.rs new file mode 100644 index 0000000..460c731 --- /dev/null +++ b/src-tauri/src/media.rs @@ -0,0 +1,29 @@ +use std::path::Path; + +use image::GenericImageView; +use serde::{Deserialize, Serialize}; + +#[derive(Debug, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub struct MediaInfo { + path: String, + media_type: String, + width: u32, + height: u32, + fps: Option, + bitrate: Option, +} + +pub fn get_image_info(file_path: &str) -> Result { + let img = image::open(&Path::new(file_path)).map_err(|e| e.to_string())?; + let dimensions = img.dimensions(); + + Ok(MediaInfo { + path: file_path.to_string(), + media_type: "image".to_string(), + width: dimensions.0, + height: dimensions.1, + fps: None, + bitrate: None, + }) +} diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 4f62971..f848c4b 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -1,6 +1,6 @@ { "productName": "liveship", - "version": "0.1.15", + "version": "0.1.16", "identifier": "app.happyship.liveship", "build": { "beforeDevCommand": "bun run dev", diff --git a/src/lib/backstage.ts b/src/lib/backstage.ts index 7423739..1d9661b 100644 --- a/src/lib/backstage.ts +++ b/src/lib/backstage.ts @@ -3,10 +3,12 @@ import { LiveStatus, type RecordingPlan } from './model'; import { getLiveInfoForPlatform } from './utils'; export function checkPlanLoop() { - // 每 60 秒检查一次计划 + // 进入时立刻检查一次计划 + checkPlans(); + // 然后每 60 秒检查一次 setInterval(() => { checkPlans(); - }, 6000); + }, 60000); } function checkPlans() { diff --git a/src/lib/components/button.svelte b/src/lib/components/button.svelte index 594b36f..a74b3cc 100644 --- a/src/lib/components/button.svelte +++ b/src/lib/components/button.svelte @@ -1,10 +1,25 @@ - - - - - - - - - - - -
-
- -
- {#if errorMessage || liveInfo || requesting} -
- -
- {/if} - -
- {#if isFirst} -
-

{$t('tips')}

-
- {/if} - {#if requesting} -
- -
- {/if} - {#if liveInfo} -
-
- {#if liveInfo.status !== LiveStatus.NotLive} -
-

- {liveInfo.title} - {#if recordStatus === RecordingStatus.Recording} - {$t('recording')} - {/if} -

-
- -
-
-
- {liveInfo.anchorName} -
-
-
- {liveInfo.anchorName} -
- {#if liveInfo.status === LiveStatus.Live} -

{$t('living')}

- {:else} -

{$t('notLiving')}

- {/if} -

- {liveInfo.viewerCount ? liveInfo.viewerCount + $t('watching') : ''} -

-
-
-
-
-
- - {#if recordStatus !== RecordingStatus.Recording} - - - {:else} - - - {/if} -
-
-
- {#if loading} -
- -
- {:else if recordStatus === RecordingStatus.Recording} -
- -
- {:else} -
- -
- {/if} -
- {:else} -
-
{$t('anchor')} {liveInfo.anchorName} {$t('notInLive')}
- {#if liveInfo.platformKind == PlatformKind.Huya} -
{$t('forHuyaError')}
- {/if} - -
- {/if} -
-
- {/if} - {#if errorMessage} -
{errorMessage}
- {#if refreshCount >= 5} - - {/if} - {/if} -
-
- - diff --git a/src/lib/components/sidebar.svelte b/src/lib/components/sidebar.svelte index 2e00274..8f510e0 100644 --- a/src/lib/components/sidebar.svelte +++ b/src/lib/components/sidebar.svelte @@ -1,42 +1,47 @@