feat: Update the api crate

This commit is contained in:
uttarayan21
2025-11-25 18:48:13 +05:30
parent 77fe7b6bb4
commit ca1fd2e977
9 changed files with 229 additions and 260 deletions

152
Cargo.lock generated
View File

@@ -1009,9 +1009,9 @@ dependencies = [
[[package]] [[package]]
name = "cc" name = "cc"
version = "1.2.46" version = "1.2.47"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b97463e1064cb1b1c1384ad0a0b9c8abd0988e2a91f52606c80ef14aadb63e36" checksum = "cd405d82c84ff7f35739f175f67d8b9fb7687a0e84ccdc78bd3568839827cf07"
dependencies = [ dependencies = [
"find-msvc-tools", "find-msvc-tools",
"jobserver", "jobserver",
@@ -1125,9 +1125,9 @@ dependencies = [
[[package]] [[package]]
name = "clap" name = "clap"
version = "4.5.52" version = "4.5.53"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa8120877db0e5c011242f96806ce3c94e0737ab8108532a76a3300a01db2ab8" checksum = "c9e340e012a1bf4935f5282ed1436d1489548e8f72308207ea5df0e23d2d03f8"
dependencies = [ dependencies = [
"clap_builder", "clap_builder",
"clap_derive", "clap_derive",
@@ -1135,9 +1135,9 @@ dependencies = [
[[package]] [[package]]
name = "clap_builder" name = "clap_builder"
version = "4.5.52" version = "4.5.53"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02576b399397b659c26064fbc92a75fede9d18ffd5f80ca1cd74ddab167016e1" checksum = "d76b5d13eaa18c901fd2f7fca939fefe3a0727a953561fefdf3b2922b8569d00"
dependencies = [ dependencies = [
"anstream", "anstream",
"anstyle", "anstyle",
@@ -1147,9 +1147,9 @@ dependencies = [
[[package]] [[package]]
name = "clap_complete" name = "clap_complete"
version = "4.5.60" version = "4.5.61"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e602857739c5a4291dfa33b5a298aeac9006185229a700e5810a3ef7272d971" checksum = "39615915e2ece2550c0149addac32fb5bd312c657f43845bb9088cb9c8a7c992"
dependencies = [ dependencies = [
"clap", "clap",
] ]
@@ -2457,15 +2457,15 @@ dependencies = [
[[package]] [[package]]
name = "gio-sys" name = "gio-sys"
version = "0.20.10" version = "0.21.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "521e93a7e56fc89e84aea9a52cfc9436816a4b363b030260b699950ff1336c83" checksum = "171ed2f6dd927abbe108cfd9eebff2052c335013f5879d55bab0dc1dee19b706"
dependencies = [ dependencies = [
"glib-sys", "glib-sys",
"gobject-sys", "gobject-sys",
"libc", "libc",
"system-deps", "system-deps",
"windows-sys 0.59.0", "windows-sys 0.61.2",
] ]
[[package]] [[package]]
@@ -2487,9 +2487,9 @@ checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3"
[[package]] [[package]]
name = "glib" name = "glib"
version = "0.20.12" version = "0.21.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ffc4b6e352d4716d84d7dde562dd9aee2a7d48beb872dd9ece7f2d1515b2d683" checksum = "5b9dbecb1c33e483a98be4acfea2ab369e1c28f517c6eadb674537409c25c4b2"
dependencies = [ dependencies = [
"bitflags 2.10.0", "bitflags 2.10.0",
"futures-channel", "futures-channel",
@@ -2508,9 +2508,9 @@ dependencies = [
[[package]] [[package]]
name = "glib-macros" name = "glib-macros"
version = "0.20.12" version = "0.21.4"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8084af62f09475a3f529b1629c10c429d7600ee1398ae12dd3bf175d74e7145" checksum = "880e524e0085f3546cfb38532b2c202c0d64741d9977a6e4aa24704bfc9f19fb"
dependencies = [ dependencies = [
"heck 0.5.0", "heck 0.5.0",
"proc-macro-crate", "proc-macro-crate",
@@ -2521,9 +2521,9 @@ dependencies = [
[[package]] [[package]]
name = "glib-sys" name = "glib-sys"
version = "0.20.10" version = "0.21.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ab79e1ed126803a8fb827e3de0e2ff95191912b8db65cee467edb56fc4cc215" checksum = "d09d3d0fddf7239521674e57b0465dfbd844632fec54f059f7f56112e3f927e1"
dependencies = [ dependencies = [
"libc", "libc",
"system-deps", "system-deps",
@@ -2583,9 +2583,9 @@ dependencies = [
[[package]] [[package]]
name = "gobject-sys" name = "gobject-sys"
version = "0.20.10" version = "0.21.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec9aca94bb73989e3cfdbf8f2e0f1f6da04db4d291c431f444838925c4c63eda" checksum = "538e41d8776173ec107e7b0f2aceced60abc368d7e1d81c1f0e2ecd35f59080d"
dependencies = [ dependencies = [
"glib-sys", "glib-sys",
"libc", "libc",
@@ -2916,9 +2916,9 @@ checksum = "12101ecc8225ea6d675bc70263074eab6169079621c2186fe0c66590b2df9681"
[[package]] [[package]]
name = "gstreamer" name = "gstreamer"
version = "0.23.7" version = "0.24.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8757a87f3706560037a01a9f06a59fcc7bdb0864744dcf73546606e60c4316e1" checksum = "69ac2f12970a2f85a681d2ceaa40c32fe86cc202ead315e0dfa2223a1217cd24"
dependencies = [ dependencies = [
"cfg-if", "cfg-if",
"futures-channel", "futures-channel",
@@ -2927,13 +2927,13 @@ dependencies = [
"glib", "glib",
"gstreamer-sys", "gstreamer-sys",
"itertools 0.14.0", "itertools 0.14.0",
"kstring",
"libc", "libc",
"muldiv", "muldiv",
"num-integer", "num-integer",
"num-rational", "num-rational",
"once_cell",
"option-operations", "option-operations",
"paste", "pastey",
"pin-project-lite", "pin-project-lite",
"smallvec", "smallvec",
"thiserror 2.0.17", "thiserror 2.0.17",
@@ -2941,9 +2941,9 @@ dependencies = [
[[package]] [[package]]
name = "gstreamer-app" name = "gstreamer-app"
version = "0.23.5" version = "0.24.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e9a883eb21aebcf1289158225c05f7aea5da6ecf71fa7f0ff1ce4d25baf004e" checksum = "0af5d403738faf03494dfd502d223444b4b44feb997ba28ab3f118ee6d40a0b2"
dependencies = [ dependencies = [
"futures-core", "futures-core",
"futures-sink", "futures-sink",
@@ -2956,9 +2956,9 @@ dependencies = [
[[package]] [[package]]
name = "gstreamer-app-sys" name = "gstreamer-app-sys"
version = "0.23.5" version = "0.24.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94f7ef838306fe51852d503a14dc79ac42de005a59008a05098de3ecdaf05455" checksum = "aaf1a3af017f9493c34ccc8439cbce5c48f6ddff6ec0514c23996b374ff25f9a"
dependencies = [ dependencies = [
"glib-sys", "glib-sys",
"gstreamer-base-sys", "gstreamer-base-sys",
@@ -2969,9 +2969,9 @@ dependencies = [
[[package]] [[package]]
name = "gstreamer-base" name = "gstreamer-base"
version = "0.23.6" version = "0.24.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f19a74fd04ffdcb847dd322640f2cf520897129d00a7bcb92fd62a63f3e27404" checksum = "71ff9b0bbc8041f0c6c8a53b206a6542f86c7d9fa8a7dff3f27d9c374d9f39b4"
dependencies = [ dependencies = [
"atomic_refcell", "atomic_refcell",
"cfg-if", "cfg-if",
@@ -2983,9 +2983,9 @@ dependencies = [
[[package]] [[package]]
name = "gstreamer-base-sys" name = "gstreamer-base-sys"
version = "0.23.6" version = "0.24.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "87f2fb0037b6d3c5b51f60dea11e667910f33be222308ca5a101450018a09840" checksum = "fed78852b92db1459b8f4288f86e6530274073c20be2f94ba642cddaca08b00e"
dependencies = [ dependencies = [
"glib-sys", "glib-sys",
"gobject-sys", "gobject-sys",
@@ -2996,10 +2996,11 @@ dependencies = [
[[package]] [[package]]
name = "gstreamer-sys" name = "gstreamer-sys"
version = "0.23.6" version = "0.24.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "feea73b4d92dbf9c24a203c9cd0bcc740d584f6b5960d5faf359febf288919b2" checksum = "a24ae2930e683665832a19ef02466094b09d1f2da5673f001515ed5486aa9377"
dependencies = [ dependencies = [
"cfg-if",
"glib-sys", "glib-sys",
"gobject-sys", "gobject-sys",
"libc", "libc",
@@ -3071,9 +3072,9 @@ dependencies = [
[[package]] [[package]]
name = "hashbrown" name = "hashbrown"
version = "0.16.0" version = "0.16.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100"
dependencies = [ dependencies = [
"foldhash 0.2.0", "foldhash 0.2.0",
] ]
@@ -3276,7 +3277,7 @@ dependencies = [
[[package]] [[package]]
name = "iced" name = "iced"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/iced-rs/iced#645643bfd63ed4c01aa281f97992e3c276e71498" source = "git+https://github.com/iced-rs/iced#8bfd099c5929d927a3fdde666d4c645d0bd83cb7"
dependencies = [ dependencies = [
"iced_core", "iced_core",
"iced_debug", "iced_debug",
@@ -3293,7 +3294,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_beacon" name = "iced_beacon"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/iced-rs/iced#645643bfd63ed4c01aa281f97992e3c276e71498" source = "git+https://github.com/iced-rs/iced#8bfd099c5929d927a3fdde666d4c645d0bd83cb7"
dependencies = [ dependencies = [
"bincode", "bincode",
"futures", "futures",
@@ -3308,7 +3309,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_core" name = "iced_core"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/iced-rs/iced#645643bfd63ed4c01aa281f97992e3c276e71498" source = "git+https://github.com/iced-rs/iced#8bfd099c5929d927a3fdde666d4c645d0bd83cb7"
dependencies = [ dependencies = [
"bitflags 2.10.0", "bitflags 2.10.0",
"bytes", "bytes",
@@ -3326,7 +3327,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_debug" name = "iced_debug"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/iced-rs/iced#645643bfd63ed4c01aa281f97992e3c276e71498" source = "git+https://github.com/iced-rs/iced#8bfd099c5929d927a3fdde666d4c645d0bd83cb7"
dependencies = [ dependencies = [
"iced_beacon", "iced_beacon",
"iced_core", "iced_core",
@@ -3337,7 +3338,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_devtools" name = "iced_devtools"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/iced-rs/iced#645643bfd63ed4c01aa281f97992e3c276e71498" source = "git+https://github.com/iced-rs/iced#8bfd099c5929d927a3fdde666d4c645d0bd83cb7"
dependencies = [ dependencies = [
"iced_debug", "iced_debug",
"iced_program", "iced_program",
@@ -3348,7 +3349,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_futures" name = "iced_futures"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/iced-rs/iced#645643bfd63ed4c01aa281f97992e3c276e71498" source = "git+https://github.com/iced-rs/iced#8bfd099c5929d927a3fdde666d4c645d0bd83cb7"
dependencies = [ dependencies = [
"futures", "futures",
"iced_core", "iced_core",
@@ -3362,7 +3363,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_graphics" name = "iced_graphics"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/iced-rs/iced#645643bfd63ed4c01aa281f97992e3c276e71498" source = "git+https://github.com/iced-rs/iced#8bfd099c5929d927a3fdde666d4c645d0bd83cb7"
dependencies = [ dependencies = [
"bitflags 2.10.0", "bitflags 2.10.0",
"bytemuck", "bytemuck",
@@ -3383,7 +3384,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_program" name = "iced_program"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/iced-rs/iced#645643bfd63ed4c01aa281f97992e3c276e71498" source = "git+https://github.com/iced-rs/iced#8bfd099c5929d927a3fdde666d4c645d0bd83cb7"
dependencies = [ dependencies = [
"iced_graphics", "iced_graphics",
"iced_runtime", "iced_runtime",
@@ -3392,7 +3393,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_renderer" name = "iced_renderer"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/iced-rs/iced#645643bfd63ed4c01aa281f97992e3c276e71498" source = "git+https://github.com/iced-rs/iced#8bfd099c5929d927a3fdde666d4c645d0bd83cb7"
dependencies = [ dependencies = [
"iced_graphics", "iced_graphics",
"iced_tiny_skia", "iced_tiny_skia",
@@ -3404,7 +3405,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_runtime" name = "iced_runtime"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/iced-rs/iced#645643bfd63ed4c01aa281f97992e3c276e71498" source = "git+https://github.com/iced-rs/iced#8bfd099c5929d927a3fdde666d4c645d0bd83cb7"
dependencies = [ dependencies = [
"bytes", "bytes",
"iced_core", "iced_core",
@@ -3417,7 +3418,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_tiny_skia" name = "iced_tiny_skia"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/iced-rs/iced#645643bfd63ed4c01aa281f97992e3c276e71498" source = "git+https://github.com/iced-rs/iced#8bfd099c5929d927a3fdde666d4c645d0bd83cb7"
dependencies = [ dependencies = [
"bytemuck", "bytemuck",
"cosmic-text 0.15.0", "cosmic-text 0.15.0",
@@ -3441,14 +3442,14 @@ dependencies = [
"iced", "iced",
"iced_wgpu", "iced_wgpu",
"log", "log",
"thiserror 1.0.69", "thiserror 2.0.17",
"url", "url",
] ]
[[package]] [[package]]
name = "iced_wgpu" name = "iced_wgpu"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/iced-rs/iced#645643bfd63ed4c01aa281f97992e3c276e71498" source = "git+https://github.com/iced-rs/iced#8bfd099c5929d927a3fdde666d4c645d0bd83cb7"
dependencies = [ dependencies = [
"bitflags 2.10.0", "bitflags 2.10.0",
"bytemuck", "bytemuck",
@@ -3468,7 +3469,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_widget" name = "iced_widget"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/iced-rs/iced#645643bfd63ed4c01aa281f97992e3c276e71498" source = "git+https://github.com/iced-rs/iced#8bfd099c5929d927a3fdde666d4c645d0bd83cb7"
dependencies = [ dependencies = [
"iced_renderer", "iced_renderer",
"log", "log",
@@ -3481,7 +3482,7 @@ dependencies = [
[[package]] [[package]]
name = "iced_winit" name = "iced_winit"
version = "0.14.0-dev" version = "0.14.0-dev"
source = "git+https://github.com/iced-rs/iced#645643bfd63ed4c01aa281f97992e3c276e71498" source = "git+https://github.com/iced-rs/iced#8bfd099c5929d927a3fdde666d4c645d0bd83cb7"
dependencies = [ dependencies = [
"iced_debug", "iced_debug",
"iced_program", "iced_program",
@@ -3646,12 +3647,12 @@ checksum = "e7c5cedc30da3a610cac6b4ba17597bdf7152cf974e8aab3afb3d54455e371c8"
[[package]] [[package]]
name = "indexmap" name = "indexmap"
version = "2.12.0" version = "2.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" checksum = "0ad4bb2b565bca0645f4d68c5c9af97fba094e9791da685bf83cb5f3ce74acf2"
dependencies = [ dependencies = [
"equivalent", "equivalent",
"hashbrown 0.16.0", "hashbrown 0.16.1",
"serde", "serde",
"serde_core", "serde_core",
] ]
@@ -3930,6 +3931,15 @@ version = "3.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc"
[[package]]
name = "kstring"
version = "2.0.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "558bf9508a558512042d3095138b1f7b8fe90c5467d94f9f1da28b3731c5dbd1"
dependencies = [
"static_assertions",
]
[[package]] [[package]]
name = "kurbo" name = "kurbo"
version = "0.10.4" version = "0.10.4"
@@ -4402,7 +4412,7 @@ dependencies = [
"cfg_aliases", "cfg_aliases",
"codespan-reporting", "codespan-reporting",
"half", "half",
"hashbrown 0.16.0", "hashbrown 0.16.1",
"hexf-parse", "hexf-parse",
"indexmap", "indexmap",
"libm", "libm",
@@ -5174,11 +5184,11 @@ checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d"
[[package]] [[package]]
name = "option-operations" name = "option-operations"
version = "0.5.0" version = "0.6.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7c26d27bb1aeab65138e4bf7666045169d1717febcc9ff870166be8348b223d0" checksum = "b31ce827892359f23d3cd1cc4c75a6c241772bbd2db17a92dcf27cbefdf52689"
dependencies = [ dependencies = [
"paste", "pastey",
] ]
[[package]] [[package]]
@@ -7789,9 +7799,9 @@ checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
[[package]] [[package]]
name = "value-bag" name = "value-bag"
version = "1.11.1" version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "943ce29a8a743eb10d6082545d861b24f9d1b160b7d741e0f2cdf726bec909c5" checksum = "7ba6f5989077681266825251a52748b8c1d8a4ad098cc37e440103d0ea717fc0"
dependencies = [ dependencies = [
"value-bag-serde1", "value-bag-serde1",
"value-bag-sval2", "value-bag-sval2",
@@ -7799,20 +7809,20 @@ dependencies = [
[[package]] [[package]]
name = "value-bag-serde1" name = "value-bag-serde1"
version = "1.11.1" version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "35540706617d373b118d550d41f5dfe0b78a0c195dc13c6815e92e2638432306" checksum = "16530907bfe2999a1773ca5900a65101e092c70f642f25cc23ca0c43573262c5"
dependencies = [ dependencies = [
"erased-serde", "erased-serde",
"serde", "serde_core",
"serde_fmt", "serde_fmt",
] ]
[[package]] [[package]]
name = "value-bag-sval2" name = "value-bag-sval2"
version = "1.11.1" version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6fe7e140a2658cc16f7ee7a86e413e803fc8f9b5127adc8755c19f9fefa63a52" checksum = "d00ae130edd690eaa877e4f40605d534790d1cf1d651e7685bd6a144521b251f"
dependencies = [ dependencies = [
"sval", "sval",
"sval_buffer", "sval_buffer",
@@ -8183,7 +8193,7 @@ dependencies = [
"cfg-if", "cfg-if",
"cfg_aliases", "cfg_aliases",
"document-features", "document-features",
"hashbrown 0.16.0", "hashbrown 0.16.1",
"js-sys", "js-sys",
"log", "log",
"naga 27.0.3", "naga 27.0.3",
@@ -8214,7 +8224,7 @@ dependencies = [
"bytemuck", "bytemuck",
"cfg_aliases", "cfg_aliases",
"document-features", "document-features",
"hashbrown 0.16.0", "hashbrown 0.16.1",
"indexmap", "indexmap",
"log", "log",
"naga 27.0.3", "naga 27.0.3",
@@ -8281,7 +8291,7 @@ dependencies = [
"gpu-alloc", "gpu-alloc",
"gpu-allocator", "gpu-allocator",
"gpu-descriptor", "gpu-descriptor",
"hashbrown 0.16.0", "hashbrown 0.16.1",
"js-sys", "js-sys",
"khronos-egl", "khronos-egl",
"libc", "libc",
@@ -9373,18 +9383,18 @@ checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524"
[[package]] [[package]]
name = "zerocopy" name = "zerocopy"
version = "0.8.27" version = "0.8.28"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" checksum = "43fa6694ed34d6e57407afbccdeecfa268c470a7d2a5b0cf49ce9fcc345afb90"
dependencies = [ dependencies = [
"zerocopy-derive", "zerocopy-derive",
] ]
[[package]] [[package]]
name = "zerocopy-derive" name = "zerocopy-derive"
version = "0.8.27" version = "0.8.28"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" checksum = "c640b22cd9817fae95be82f0d2f90b11f7605f6c319d16705c459b27ac2cbc26"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",

View File

@@ -4,7 +4,7 @@ pub async fn main() {
let config = std::fs::read_to_string("config.toml").expect("Config.toml"); let config = std::fs::read_to_string("config.toml").expect("Config.toml");
let config: JellyfinConfig = toml::from_str(&config).expect("Failed to parse config.toml"); let config: JellyfinConfig = toml::from_str(&config).expect("Failed to parse config.toml");
let mut jellyfin = JellyfinClient::new(config); let mut jellyfin = JellyfinClient::new_with_config(config);
jellyfin jellyfin
.authenticate_with_cached_token(".session") .authenticate_with_cached_token(".session")
.await .await

View File

@@ -566,7 +566,7 @@ pub struct BaseItemDto {
#[serde(rename = "SeriesThumbImageTag")] #[serde(rename = "SeriesThumbImageTag")]
pub series_thumb_image_tag: Option<String>, pub series_thumb_image_tag: Option<String>,
/** Gets or sets the blurhashes for the image tags. /** Gets or sets the blurhashes for the image tags.
Maps image type to dictionary mapping image tag to blurhash value.*/ Maps image type to dictionary mapping image tag to blurhash value.*/
#[serde(rename = "ImageBlurHashes")] #[serde(rename = "ImageBlurHashes")]
pub image_blur_hashes: BaseItemDtoImageBlurHashes, pub image_blur_hashes: BaseItemDtoImageBlurHashes,
/// Gets or sets the series studio. /// Gets or sets the series studio.
@@ -590,10 +590,7 @@ Maps image type to dictionary mapping image tag to blurhash value.*/
/// Gets or sets the trickplay manifest. /// Gets or sets the trickplay manifest.
#[serde(rename = "Trickplay")] #[serde(rename = "Trickplay")]
pub trickplay: Option< pub trickplay: Option<
std::collections::HashMap< std::collections::HashMap<String, Option<std::collections::HashMap<String, TrickplayInfo>>>,
String,
Option<std::collections::HashMap<String, TrickplayInfo>>,
>,
>, >,
/// Gets or sets the type of the location. /// Gets or sets the type of the location.
#[serde(rename = "LocationType")] #[serde(rename = "LocationType")]
@@ -1525,9 +1522,7 @@ pub struct EncodingOptions {
pub hardware_decoding_codecs: Option<Vec<String>>, pub hardware_decoding_codecs: Option<Vec<String>>,
/// Gets or sets the file extensions on-demand metadata based keyframe extraction is enabled for. /// Gets or sets the file extensions on-demand metadata based keyframe extraction is enabled for.
#[serde(rename = "AllowOnDemandMetadataBasedKeyframeExtractionForExtensions")] #[serde(rename = "AllowOnDemandMetadataBasedKeyframeExtractionForExtensions")]
pub allow_on_demand_metadata_based_keyframe_extraction_for_extensions: Option< pub allow_on_demand_metadata_based_keyframe_extraction_for_extensions: Option<Vec<String>>,
Vec<String>,
>,
} }
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct EndPointInfo { pub struct EndPointInfo {
@@ -1546,9 +1541,9 @@ pub struct ExternalIdInfo {
#[serde(rename = "Key")] #[serde(rename = "Key")]
pub key: String, pub key: String,
/** Gets or sets the specific media type for this id. This is used to distinguish between the different /** Gets or sets the specific media type for this id. This is used to distinguish between the different
external id types for providers with multiple ids. external id types for providers with multiple ids.
A null value indicates there is no specific media type associated with the external id, or this is the A null value indicates there is no specific media type associated with the external id, or this is the
default id for the external provider so there is no need to specify a type.*/ default id for the external provider so there is no need to specify a type.*/
#[serde(rename = "Type")] #[serde(rename = "Type")]
pub _type: Option<ExternalIdMediaType>, pub _type: Option<ExternalIdMediaType>,
/// Gets or sets the URL format string. /// Gets or sets the URL format string.
@@ -2444,7 +2439,7 @@ pub struct MediaSourceInfo {
#[serde(rename = "Name")] #[serde(rename = "Name")]
pub name: Option<String>, pub name: Option<String>,
/** Gets or sets a value indicating whether the media is remote. /** Gets or sets a value indicating whether the media is remote.
Differentiate internet url vs local network.*/ Differentiate internet url vs local network.*/
#[serde(rename = "IsRemote")] #[serde(rename = "IsRemote")]
pub is_remote: bool, pub is_remote: bool,
#[serde(rename = "ETag")] #[serde(rename = "ETag")]
@@ -2506,7 +2501,7 @@ Differentiate internet url vs local network.*/
#[serde(rename = "TranscodingUrl")] #[serde(rename = "TranscodingUrl")]
pub transcoding_url: Option<String>, pub transcoding_url: Option<String>,
/** Media streaming protocol. /** Media streaming protocol.
Lowercase for backwards compatibility.*/ Lowercase for backwards compatibility.*/
#[serde(rename = "TranscodingSubProtocol")] #[serde(rename = "TranscodingSubProtocol")]
pub transcoding_sub_protocol: MediaStreamProtocol, pub transcoding_sub_protocol: MediaStreamProtocol,
#[serde(rename = "TranscodingContainer")] #[serde(rename = "TranscodingContainer")]
@@ -2657,8 +2652,8 @@ pub struct MediaStream {
#[serde(rename = "RealFrameRate")] #[serde(rename = "RealFrameRate")]
pub real_frame_rate: Option<f32>, pub real_frame_rate: Option<f32>,
/** Gets the framerate used as reference. /** Gets the framerate used as reference.
Prefer AverageFrameRate, if that is null or an unrealistic value Prefer AverageFrameRate, if that is null or an unrealistic value
then fallback to RealFrameRate.*/ then fallback to RealFrameRate.*/
#[serde(rename = "ReferenceFrameRate")] #[serde(rename = "ReferenceFrameRate")]
pub reference_frame_rate: Option<f32>, pub reference_frame_rate: Option<f32>,
/// Gets or sets the profile. /// Gets or sets the profile.
@@ -2720,7 +2715,7 @@ pub struct MediaUpdateInfoPathDto {
#[serde(rename = "Path")] #[serde(rename = "Path")]
pub path: Option<String>, pub path: Option<String>,
/** Gets or sets media update type. /** Gets or sets media update type.
Created, Modified, Deleted.*/ Created, Modified, Deleted.*/
#[serde(rename = "UpdateType")] #[serde(rename = "UpdateType")]
pub update_type: Option<String>, pub update_type: Option<String>,
} }
@@ -2969,7 +2964,7 @@ pub struct NetworkConfiguration {
#[serde(rename = "EnablePublishedServerUriByRequest")] #[serde(rename = "EnablePublishedServerUriByRequest")]
pub enable_published_server_uri_by_request: bool, pub enable_published_server_uri_by_request: bool,
/** Gets or sets the PublishedServerUriBySubnet /** Gets or sets the PublishedServerUriBySubnet
Gets or sets PublishedServerUri to advertise for specific subnets.*/ Gets or sets PublishedServerUri to advertise for specific subnets.*/
#[serde(rename = "PublishedServerUriBySubnet")] #[serde(rename = "PublishedServerUriBySubnet")]
pub published_server_uri_by_subnet: Vec<String>, pub published_server_uri_by_subnet: Vec<String>,
/// Gets or sets the filter for remote IP connectivity. Used in conjunction with <seealso cref="P:MediaBrowser.Common.Net.NetworkConfiguration.IsRemoteIPFilterBlacklist" />. /// Gets or sets the filter for remote IP connectivity. Used in conjunction with <seealso cref="P:MediaBrowser.Common.Net.NetworkConfiguration.IsRemoteIPFilterBlacklist" />.
@@ -3033,11 +3028,11 @@ pub struct OpenLiveStreamDto {
#[serde(rename = "AlwaysBurnInSubtitleWhenTranscoding")] #[serde(rename = "AlwaysBurnInSubtitleWhenTranscoding")]
pub always_burn_in_subtitle_when_transcoding: Option<bool>, pub always_burn_in_subtitle_when_transcoding: Option<bool>,
/** A MediaBrowser.Model.Dlna.DeviceProfile represents a set of metadata which determines which content a certain device is able to play. /** A MediaBrowser.Model.Dlna.DeviceProfile represents a set of metadata which determines which content a certain device is able to play.
<br /> <br />
Specifically, it defines the supported <see cref="P:MediaBrowser.Model.Dlna.DeviceProfile.ContainerProfiles">containers</see> and Specifically, it defines the supported <see cref="P:MediaBrowser.Model.Dlna.DeviceProfile.ContainerProfiles">containers</see> and
<see cref="P:MediaBrowser.Model.Dlna.DeviceProfile.CodecProfiles">codecs</see> (video and/or audio, including codec profiles and levels) <see cref="P:MediaBrowser.Model.Dlna.DeviceProfile.CodecProfiles">codecs</see> (video and/or audio, including codec profiles and levels)
the device is able to direct play (without transcoding or remuxing), the device is able to direct play (without transcoding or remuxing),
as well as which <see cref="P:MediaBrowser.Model.Dlna.DeviceProfile.TranscodingProfiles">containers/codecs to transcode to</see> in case it isn't.*/ as well as which <see cref="P:MediaBrowser.Model.Dlna.DeviceProfile.TranscodingProfiles">containers/codecs to transcode to</see> in case it isn't.*/
#[serde(rename = "DeviceProfile")] #[serde(rename = "DeviceProfile")]
pub device_profile: Option<DeviceProfile>, pub device_profile: Option<DeviceProfile>,
/// Gets or sets the device play protocols. /// Gets or sets the device play protocols.
@@ -3073,7 +3068,7 @@ pub struct PackageInfo {
#[serde(rename = "category")] #[serde(rename = "category")]
pub category: String, pub category: String,
/** Gets or sets the guid of the assembly associated with this plugin. /** Gets or sets the guid of the assembly associated with this plugin.
This is used to identify the proper item for automatic updates.*/ This is used to identify the proper item for automatic updates.*/
#[serde(rename = "guid")] #[serde(rename = "guid")]
pub guid: uuid::Uuid, pub guid: uuid::Uuid,
/// Gets or sets the versions. /// Gets or sets the versions.
@@ -3192,11 +3187,11 @@ pub struct PlaybackInfoDto {
#[serde(rename = "LiveStreamId")] #[serde(rename = "LiveStreamId")]
pub live_stream_id: Option<String>, pub live_stream_id: Option<String>,
/** A MediaBrowser.Model.Dlna.DeviceProfile represents a set of metadata which determines which content a certain device is able to play. /** A MediaBrowser.Model.Dlna.DeviceProfile represents a set of metadata which determines which content a certain device is able to play.
<br /> <br />
Specifically, it defines the supported <see cref="P:MediaBrowser.Model.Dlna.DeviceProfile.ContainerProfiles">containers</see> and Specifically, it defines the supported <see cref="P:MediaBrowser.Model.Dlna.DeviceProfile.ContainerProfiles">containers</see> and
<see cref="P:MediaBrowser.Model.Dlna.DeviceProfile.CodecProfiles">codecs</see> (video and/or audio, including codec profiles and levels) <see cref="P:MediaBrowser.Model.Dlna.DeviceProfile.CodecProfiles">codecs</see> (video and/or audio, including codec profiles and levels)
the device is able to direct play (without transcoding or remuxing), the device is able to direct play (without transcoding or remuxing),
as well as which <see cref="P:MediaBrowser.Model.Dlna.DeviceProfile.TranscodingProfiles">containers/codecs to transcode to</see> in case it isn't.*/ as well as which <see cref="P:MediaBrowser.Model.Dlna.DeviceProfile.TranscodingProfiles">containers/codecs to transcode to</see> in case it isn't.*/
#[serde(rename = "DeviceProfile")] #[serde(rename = "DeviceProfile")]
pub device_profile: Option<DeviceProfile>, pub device_profile: Option<DeviceProfile>,
/// Gets or sets a value indicating whether to enable direct play. /// Gets or sets a value indicating whether to enable direct play.
@@ -4393,7 +4388,7 @@ pub struct ServerConfiguration {
#[serde(rename = "PreviousVersion")] #[serde(rename = "PreviousVersion")]
pub previous_version: Option<String>, pub previous_version: Option<String>,
/** Gets or sets the stringified PreviousVersion to be stored/loaded, /** Gets or sets the stringified PreviousVersion to be stored/loaded,
because System.Version itself isn't xml-serializable.*/ because System.Version itself isn't xml-serializable.*/
#[serde(rename = "PreviousVersionStr")] #[serde(rename = "PreviousVersionStr")]
pub previous_version_str: Option<String>, pub previous_version_str: Option<String>,
/// Gets or sets a value indicating whether to enable prometheus metrics exporting. /// Gets or sets a value indicating whether to enable prometheus metrics exporting.
@@ -4446,12 +4441,12 @@ because System.Version itself isn't xml-serializable.*/
#[serde(rename = "MaxAudiobookResume")] #[serde(rename = "MaxAudiobookResume")]
pub max_audiobook_resume: i32, pub max_audiobook_resume: i32,
/** Gets or sets the threshold in minutes after a inactive session gets closed automatically. /** Gets or sets the threshold in minutes after a inactive session gets closed automatically.
If set to 0 the check for inactive sessions gets disabled.*/ If set to 0 the check for inactive sessions gets disabled.*/
#[serde(rename = "InactiveSessionThreshold")] #[serde(rename = "InactiveSessionThreshold")]
pub inactive_session_threshold: i32, pub inactive_session_threshold: i32,
/** Gets or sets the delay in seconds that we will wait after a file system change to try and discover what has been added/removed /** Gets or sets the delay in seconds that we will wait after a file system change to try and discover what has been added/removed
Some delay is necessary with some items because their creation is not atomic. It involves the creation of several Some delay is necessary with some items because their creation is not atomic. It involves the creation of several
different directories and files.*/ different directories and files.*/
#[serde(rename = "LibraryMonitorDelay")] #[serde(rename = "LibraryMonitorDelay")]
pub library_monitor_delay: i32, pub library_monitor_delay: i32,
/// Gets or sets the duration in seconds that we will wait after a library updated event before executing the library changed notification. /// Gets or sets the duration in seconds that we will wait after a library updated event before executing the library changed notification.
@@ -5420,7 +5415,7 @@ pub struct TrickplayOptions {
#[serde(rename = "EnableHwEncoding")] #[serde(rename = "EnableHwEncoding")]
pub enable_hw_encoding: bool, pub enable_hw_encoding: bool,
/** Gets or sets a value indicating whether to only extract key frames. /** Gets or sets a value indicating whether to only extract key frames.
Significantly faster, but is not compatible with all decoders and/or video files.*/ Significantly faster, but is not compatible with all decoders and/or video files.*/
#[serde(rename = "EnableKeyFrameOnlyExtraction")] #[serde(rename = "EnableKeyFrameOnlyExtraction")]
pub enable_key_frame_only_extraction: bool, pub enable_key_frame_only_extraction: bool,
/// Gets or sets the behavior used by trickplay provider on library scan/update. /// Gets or sets the behavior used by trickplay provider on library scan/update.
@@ -5712,7 +5707,7 @@ pub struct UserDto {
#[serde(rename = "ServerId")] #[serde(rename = "ServerId")]
pub server_id: Option<String>, pub server_id: Option<String>,
/** Gets or sets the name of the server. /** Gets or sets the name of the server.
This is not used by the server and is for client-side usage only.*/ This is not used by the server and is for client-side usage only.*/
#[serde(rename = "ServerName")] #[serde(rename = "ServerName")]
pub server_name: Option<String>, pub server_name: Option<String>,
/// Gets or sets the id. /// Gets or sets the id.

View File

@@ -3,7 +3,7 @@ pub mod jellyfin;
use std::sync::Arc; use std::sync::Arc;
use ::tap::*; use ::tap::*;
use reqwest::Method; use reqwest::{Method, header::InvalidHeaderValue};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
#[derive(thiserror::Error, Debug)] #[derive(thiserror::Error, Debug)]
@@ -15,6 +15,8 @@ pub enum JellyfinApiError {
#[error("IO error: {0}")] #[error("IO error: {0}")]
IoError(#[from] std::io::Error), IoError(#[from] std::io::Error),
#[error("Unknown Jellyfin API error")] #[error("Unknown Jellyfin API error")]
InvalidHeader(#[from] InvalidHeaderValue),
#[error("Unknown Jellyfin API error")]
Unknown, Unknown,
} }
@@ -28,7 +30,49 @@ pub struct JellyfinClient {
} }
impl JellyfinClient { impl JellyfinClient {
pub fn new(config: JellyfinConfig) -> Self { pub async fn authenticate(
username: impl AsRef<str>,
password: impl AsRef<str>,
config: JellyfinConfig,
) -> Result<Self> {
let url = format!("{}/Users/AuthenticateByName", config.server_url);
let client = reqwest::Client::new();
let token = client
.post(url)
.json(&jellyfin::AuthenticateUserByName {
username: Some(username.as_ref().to_string()),
pw: Some(password.as_ref().to_string()),
})
.send()
.await?
.error_for_status()?
.json::<jellyfin::AuthenticationResult>()
.await?
.access_token
.ok_or_else(|| std::io::Error::other("No field access_token in auth response"))?;
Self::pre_authenticated(token, config)
}
pub fn pre_authenticated(token: impl AsRef<str>, config: JellyfinConfig) -> Result<Self> {
let auth_header = core::iter::once((
reqwest::header::HeaderName::from_static("X-Emby-Authorization"),
reqwest::header::HeaderValue::from_str(&format!(
"MediaBrowser Client=\"{}\", Device=\"{}\", DeviceId=\"{}\", Version=\"{}\"",
config.client_name, config.device_name, config.device_id, config.version
))?,
))
.collect();
let client = reqwest::Client::builder()
.default_headers(auth_header)
.build()?;
Ok(Self {
client,
access_token: Some(token.as_ref().to_string().into()),
config: Arc::new(config),
})
}
pub fn new_with_config(config: JellyfinConfig) -> Self {
JellyfinClient { JellyfinClient {
client: reqwest::Client::new(), client: reqwest::Client::new(),
access_token: None, access_token: None,
@@ -119,45 +163,6 @@ impl JellyfinClient {
Ok(out) Ok(out)
} }
pub async fn authenticate(&mut self) -> Result<jellyfin::AuthenticationResult> {
let auth_result: jellyfin::AuthenticationResult = self
.post(
"Users/AuthenticateByName",
&jellyfin::AuthenticateUserByName {
username: Some(self.config.username.clone()),
pw: Some(self.config.password.clone()),
},
)
.await?;
self.access_token = auth_result.access_token.clone().map(Into::into);
Ok(auth_result)
}
pub async fn authenticate_with_cached_token(
&mut self,
path: impl AsRef<std::path::Path>,
) -> Result<String> {
let path = path.as_ref();
if let Ok(token) = self
.load_token(path)
.await
.inspect_err(|err| tracing::warn!("Failed to load cached token: {}", err))
{
tracing::info!("Authenticating with cached token from {:?}", path);
self.access_token = Some(token.clone().into());
Ok(token)
} else {
tracing::info!("No cached token found at {:?}, authenticating...", path);
let token = self
.authenticate()
.await?
.access_token
.ok_or_else(|| JellyfinApiError::Unknown)?;
self.save_token(path).await?;
Ok(token)
}
}
pub async fn raw_items(&self) -> Result<jellyfin::BaseItemDtoQueryResult> { pub async fn raw_items(&self) -> Result<jellyfin::BaseItemDtoQueryResult> {
let text = &self let text = &self
.request_builder(Method::GET, "Items") .request_builder(Method::GET, "Items")
@@ -256,47 +261,11 @@ impl JellyfinClient {
} }
} }
// pub trait Item {
// fn id(&self) -> &str;
// fn name(&self) -> &str;
// fn type_(&self) -> jellyfin::BaseItemKind;
// fn media_type(&self) -> &str;
// }
#[derive(Debug, Serialize, Deserialize, Clone)] #[derive(Debug, Serialize, Deserialize, Clone)]
pub struct JellyfinConfig { pub struct JellyfinConfig {
pub username: String,
pub password: String,
pub server_url: iref::IriBuf, pub server_url: iref::IriBuf,
pub device_id: String, pub device_id: String,
} pub device_name: String,
pub client_name: String,
impl JellyfinConfig { pub version: String,
pub fn new(
username: String,
password: String,
server_url: impl AsRef<str>,
device_id: String,
) -> Self {
JellyfinConfig {
username,
password,
server_url: iref::IriBuf::new(server_url.as_ref().into())
.expect("Failed to parse server URL"),
device_id,
}
}
}
#[test]
fn test_client_authenticate() {
let config = JellyfinConfig {
username: "servius".to_string(),
password: "nfz6yqr_NZD1nxk!faj".to_string(),
server_url: iref::IriBuf::new("https://jellyfin.tsuba.darksailor.dev".into()).unwrap(),
device_id: "testdeviceid".to_string(),
};
let mut client = JellyfinClient::new(config);
let auth_result = tokio_test::block_on(client.authenticate());
assert!(auth_result.is_ok());
} }

View File

@@ -20,12 +20,12 @@ iced = { git = "https://github.com/iced-rs/iced", features = [
"wgpu", "wgpu",
] } ] }
iced_wgpu = { git = "https://github.com/iced-rs/iced" } iced_wgpu = { git = "https://github.com/iced-rs/iced" }
gstreamer = "0.23" gstreamer = { version = "0.24", features = ["v1_26"] }
gstreamer-app = "0.23" # appsink gstreamer-app = { version = "0.24", features = ["v1_26"] } # appsink
gstreamer-base = "0.23" # basesrc gstreamer-base = { version = "0.24", features = ["v1_26"] } # basesrc
glib = "0.20" # gobject traits and error type glib = "0.21" # gobject traits and error type
log = "0.4" log = "0.4"
thiserror = "1" thiserror = "2"
url = "2" # media uri url = "2" # media uri
[package.metadata.nix] [package.metadata.nix]
@@ -46,6 +46,8 @@ runtimeLibs = [
"gst_all_1.gst-plugins-ugly", "gst_all_1.gst-plugins-ugly",
"gst_all_1.gst-plugins-good", "gst_all_1.gst-plugins-good",
"gst_all_1.gst-plugins-base", "gst_all_1.gst-plugins-base",
"glib",
"glib-networking",
] ]
buildInputs = [ buildInputs = [
"libxkbcommon", "libxkbcommon",
@@ -55,6 +57,8 @@ buildInputs = [
"gst_all_1.gst-plugins-ugly", "gst_all_1.gst-plugins-ugly",
"gst_all_1.gst-plugins-good", "gst_all_1.gst-plugins-good",
"gst_all_1.gst-plugins-base", "gst_all_1.gst-plugins-base",
"glib",
"glib-networking",
] ]
[package.metadata.docs.rs] [package.metadata.docs.rs]

View File

@@ -307,7 +307,7 @@ impl Video {
.unwrap_or(0), .unwrap_or(0),
); );
let sync_av = pipeline.has_property("av-offset", None); let sync_av = pipeline.has_property("av-offset");
// NV12 = 12bpp // NV12 = 12bpp
let frame = Arc::new(Mutex::new(Frame::empty())); let frame = Arc::new(Mutex::new(Frame::empty()));

View File

@@ -56,7 +56,7 @@
src = let src = let
filterBySuffix = path: exts: lib.any (ext: lib.hasSuffix ext path) exts; filterBySuffix = path: exts: lib.any (ext: lib.hasSuffix ext path) exts;
sourceFilters = path: type: (craneLib.filterCargoSources path type) || filterBySuffix path [".c" ".h" ".hpp" ".cpp" ".cc"]; sourceFilters = path: type: (craneLib.filterCargoSources path type) || filterBySuffix path [".c" ".h" ".hpp" ".cpp" ".cc" "wgsl"];
in in
lib.cleanSourceWith { lib.cleanSourceWith {
filter = sourceFilters; filter = sourceFilters;
@@ -74,19 +74,24 @@
buildInputs = with pkgs; buildInputs = with pkgs;
[ [
gst_all_1.gst-editing-services
gst_all_1.gst-libav gst_all_1.gst-libav
gst_all_1.gst-plugins-bad
gst_all_1.gst-plugins-base gst_all_1.gst-plugins-base
gst_all_1.gst-plugins-good gst_all_1.gst-plugins-good
gst_all_1.gst-plugins-rs gst_all_1.gst-plugins-bad
gst_all_1.gst-plugins-ugly gst_all_1.gst-plugins-ugly
gst_all_1.gst-rtsp-server gst_all_1.gst-plugins-rs
gst_all_1.gstreamer gst_all_1.gstreamer
glib
glib-networking
libsysprof-capture
pcre2
libunwind
elfutils
zstd
openssl openssl
vulkan-loader vulkan-loader
glib
] ]
++ (lib.optionals pkgs.stdenv.isLinux [ ++ (lib.optionals pkgs.stdenv.isLinux [
gst_all_1.gstreamermm gst_all_1.gstreamermm
@@ -159,8 +164,8 @@
default = pkg; default = pkg;
}; };
devShells = { devShells = rec {
default = rust-shell =
pkgs.mkShell.override { pkgs.mkShell.override {
stdenv = stdenv =
if pkgs.stdenv.isLinux if pkgs.stdenv.isLinux
@@ -168,6 +173,8 @@
else pkgs.clangStdenv; else pkgs.clangStdenv;
} (commonArgs } (commonArgs
// { // {
GST_PLUGIN_PATH = "/run/current-system/sw/lib/gstreamer-1.0/";
GIO_EXTRA_MODULES = "${pkgs.glib-networking}/lib/gio/modules";
packages = with pkgs; packages = with pkgs;
[ [
toolchainWithRustAnalyzer toolchainWithRustAnalyzer
@@ -188,6 +195,7 @@
mold mold
]); ]);
}); });
default = rust-shell;
}; };
} }
) )

View File

@@ -2,24 +2,9 @@ mod errors;
use api::JellyfinConfig; use api::JellyfinConfig;
use errors::*; use errors::*;
fn jellyfin_config_try() -> Result<JellyfinConfig> {
let file = std::fs::read("config.toml").change_context(Error)?;
let config: JellyfinConfig = toml::from_slice(&file)
.change_context(Error)
.attach("Failed to parse Jellyfin Config")?;
Ok(config)
}
fn jellyfin_config() -> JellyfinConfig {
jellyfin_config_try().unwrap_or_else(|err| {
eprintln!("Error loading Jellyfin configuration: {:?}", err);
std::process::exit(1);
})
}
fn main() -> Result<()> { fn main() -> Result<()> {
tracing_subscriber::fmt::init(); tracing_subscriber::fmt::init();
ui_iced::ui(jellyfin_config).change_context(Error)?; ui_iced::ui().change_context(Error)?;
Ok(()) Ok(())
} }

View File

@@ -201,7 +201,7 @@ fn update(state: &mut State, message: Message) -> Task<Message> {
Task::perform( Task::perform(
async move { async move {
let mut client = api::JellyfinClient::new(config); let mut client = api::JellyfinClient::new_with_config(config);
client.authenticate().await client.authenticate().await
}, },
|result| match result { |result| match result {
@@ -662,23 +662,21 @@ fn card(item: &Item) -> Element<'_, Message> {
// fn video(url: &str // fn video(url: &str
fn init(config: impl Fn() -> api::JellyfinConfig + 'static) -> impl Fn() -> (State, Task<Message>) { fn init() -> (State, Task<Message>) {
move || { let mut jellyfin = api::JellyfinClient::new_with_config();
let mut jellyfin = api::JellyfinClient::new(config()); (
( State::new(jellyfin.clone()),
State::new(jellyfin.clone()), Task::perform(
Task::perform( async move { jellyfin.authenticate_with_cached_token(".session").await },
async move { jellyfin.authenticate_with_cached_token(".session").await }, |token| match token {
|token| match token { Ok(token) => Message::SetToken(token),
Ok(token) => Message::SetToken(token), Err(e) => Message::Error(format!("Authentication failed: {}", e)),
Err(e) => Message::Error(format!("Authentication failed: {}", e)), },
},
)
.chain(Task::done(Message::Refresh)),
) )
} .chain(Task::done(Message::Refresh)),
)
} }
pub fn ui(config: impl Fn() -> api::JellyfinConfig + 'static) -> iced::Result { pub fn ui() -> iced::Result {
iced::application(init(config), update, view).run() iced::application(init, update, view).run()
} }