From f165c6cae8c58463d4049169450bd234eca936b2 Mon Sep 17 00:00:00 2001 From: Elias Projahn Date: Sun, 23 Jan 2022 13:18:37 +0100 Subject: [PATCH] Remove server synchronization code This commit (tries to) remove all code for synchronyzing to a music metadata server. Because the intended use cases of the application have shifted over time, this isn't a central feature anymore. However, it may well be decided to reintroduce the functionality at some point in the future. --- Cargo.lock | 868 +----------------- Cargo.toml | 2 +- backend/Cargo.toml | 2 - backend/src/error.rs | 9 +- backend/src/lib.rs | 111 +-- backend/src/secure.rs | 112 --- client/Cargo.toml | 12 - client/src/ensembles.rs | 20 - client/src/error.rs | 34 - client/src/instruments.rs | 21 - client/src/lib.rs | 184 ---- client/src/mediums.rs | 32 - client/src/persons.rs | 20 - client/src/recordings.rs | 21 - client/src/register.rs | 56 -- client/src/works.rs | 20 - de.johrpan.musicus.json | 84 +- musicus/data/de.johrpan.musicus.gschema.xml | 12 - musicus/res/musicus.gresource.xml | 2 - musicus/res/ui/import_screen.ui | 6 - musicus/res/ui/login_dialog.ui | 223 ----- musicus/res/ui/medium_editor.ui | 13 - musicus/res/ui/preferences.ui | 42 - musicus/res/ui/recording_editor.ui | 13 - musicus/res/ui/selector.ui | 58 -- musicus/res/ui/server_dialog.ui | 59 -- musicus/res/ui/work_editor.ui | 35 +- musicus/src/editors/ensemble.rs | 14 +- musicus/src/editors/instrument.rs | 18 +- musicus/src/editors/person.rs | 13 +- musicus/src/editors/recording.rs | 12 +- musicus/src/editors/work.rs | 12 +- musicus/src/import/import_screen.rs | 20 +- musicus/src/import/medium_editor.rs | 17 +- musicus/src/navigator/window.rs | 6 - .../{preferences/mod.rs => preferences.rs} | 50 - musicus/src/preferences/login.rs | 98 -- musicus/src/preferences/register.rs | 118 --- musicus/src/preferences/server.rs | 65 -- musicus/src/selectors/ensemble.rs | 8 +- musicus/src/selectors/instrument.rs | 8 +- musicus/src/selectors/medium.rs | 24 +- musicus/src/selectors/person.rs | 8 +- musicus/src/selectors/recording.rs | 20 +- musicus/src/selectors/selector.rs | 70 +- musicus/src/selectors/work.rs | 14 +- musicus/src/widgets/mod.rs | 3 - musicus/src/widgets/upload_section.rs | 60 -- 48 files changed, 96 insertions(+), 2633 deletions(-) delete mode 100644 backend/src/secure.rs delete mode 100644 client/Cargo.toml delete mode 100644 client/src/ensembles.rs delete mode 100644 client/src/error.rs delete mode 100644 client/src/instruments.rs delete mode 100644 client/src/lib.rs delete mode 100644 client/src/mediums.rs delete mode 100644 client/src/persons.rs delete mode 100644 client/src/recordings.rs delete mode 100644 client/src/register.rs delete mode 100644 client/src/works.rs delete mode 100644 musicus/res/ui/login_dialog.ui delete mode 100644 musicus/res/ui/server_dialog.ui rename musicus/src/{preferences/mod.rs => preferences.rs} (59%) delete mode 100644 musicus/src/preferences/login.rs delete mode 100644 musicus/src/preferences/register.rs delete mode 100644 musicus/src/preferences/server.rs delete mode 100644 musicus/src/widgets/upload_section.rs diff --git a/Cargo.lock b/Cargo.lock index 203a9ac..b602f30 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,37 +2,6 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "aes" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "884391ef1066acaa41e766ba8f596341b96e93ce34f9a43e7d24bf0a0eaf0561" -dependencies = [ - "aes-soft", - "aesni", - "cipher", -] - -[[package]] -name = "aes-soft" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be14c7498ea50828a38d0e24a765ed2effe92a705885b57d029cd67d45744072" -dependencies = [ - "cipher", - "opaque-debug", -] - -[[package]] -name = "aesni" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2e11f5e94c2f7d386164cc2aa1f97823fed6f259e486940a71c174dd01b0ce" -dependencies = [ - "cipher", - "opaque-debug", -] - [[package]] name = "aho-corasick" version = "0.7.18" @@ -48,37 +17,6 @@ version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "15af2628f6890fe2609a3b91bef4c83450512802e59489f9c1cb1fa5df064a61" -[[package]] -name = "async-channel" -version = "1.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2114d64672151c0c5eaa5e131ec84a74f06e1e559830dabba01ca30605d66319" -dependencies = [ - "concurrent-queue", - "event-listener", - "futures-core", -] - -[[package]] -name = "async-io" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4bbfd5cf2794b1e908ea8457e6c45f8f8f1f6ec5f74617bf4662623f47503c3b" -dependencies = [ - "concurrent-queue", - "fastrand", - "futures-lite", - "libc", - "log", - "once_cell", - "parking", - "polling", - "slab", - "socket2", - "waker-fn", - "winapi", -] - [[package]] name = "async-trait" version = "0.1.50" @@ -123,40 +61,12 @@ dependencies = [ "generic-array", ] -[[package]] -name = "block-modes" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57a0e8073e8baa88212fb5823574c02ebccb395136ba9a164ab89379ec6072f0" -dependencies = [ - "block-padding", - "cipher", -] - -[[package]] -name = "block-padding" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d696c370c750c948ada61c69a0ee2cbbb9c50b1019ddb86d9317157a99c2cae" - [[package]] name = "byteorder" version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" -[[package]] -name = "bytes" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040" - -[[package]] -name = "cache-padded" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "631ae5198c9be5e753e5cc215e1bd73c2b466a3565173db433f52bb9d3e66dba" - [[package]] name = "cairo-rs" version = "0.14.0" @@ -205,36 +115,12 @@ dependencies = [ "smallvec", ] -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - [[package]] name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "cipher" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12f8e7987cbd042a63249497f41aed09f8e65add917ea6566effbc56578d6801" -dependencies = [ - "generic-array", -] - -[[package]] -name = "concurrent-queue" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3" -dependencies = [ - "cache-padded", -] - [[package]] name = "cpufeatures" version = "0.1.5" @@ -244,57 +130,6 @@ dependencies = [ "libc", ] -[[package]] -name = "crossbeam-utils" -version = "0.8.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" -dependencies = [ - "cfg-if 1.0.0", - "lazy_static", -] - -[[package]] -name = "crypto-mac" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4857fd85a0c34b3c3297875b747c1e02e06b6a0ea32dd892d8192b9ce0813ea6" -dependencies = [ - "generic-array", - "subtle", -] - -[[package]] -name = "curl" -version = "0.4.38" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "003cb79c1c6d1c93344c7e1201bb51c2148f24ec2bd9c253709d6b2efb796515" -dependencies = [ - "curl-sys", - "libc", - "openssl-probe", - "openssl-sys", - "schannel", - "socket2", - "winapi", -] - -[[package]] -name = "curl-sys" -version = "0.4.44+curl-7.77.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b6d85e9322b193f117c966e79c2d6929ec08c02f339f950044aba12e20bbaf1" -dependencies = [ - "cc", - "libc", - "libnghttp2-sys", - "libz-sys", - "openssl-sys", - "pkg-config", - "vcpkg", - "winapi", -] - [[package]] name = "dbus" version = "0.6.5" @@ -305,17 +140,6 @@ dependencies = [ "libdbus-sys", ] -[[package]] -name = "derivative" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "diesel" version = "1.4.7" @@ -363,51 +187,6 @@ version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" -[[package]] -name = "encoding_rs" -version = "0.8.28" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80df024fbc5ac80f87dfef0d9f5209a252f2a497f7f42944cff24d8253cac065" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "enumflags2" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83c8d82922337cd23a15f88b70d8e4ef5f11da38dd7cdb55e84dd5de99695da0" -dependencies = [ - "enumflags2_derive", - "serde", -] - -[[package]] -name = "enumflags2_derive" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "946ee94e3dbf58fdd324f9ce245c7b238d46a66f00e86a020b71996349e46cce" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "event-listener" -version = "2.5.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7531096570974c3a9dcf9e4b8e1cede1ec26cf5046219fb3b9d897503b9be59" - -[[package]] -name = "fastrand" -version = "1.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77b705829d1e87f762c2df6da140b26af5839e1033aa84aa5f56bb688e4e1bdb" -dependencies = [ - "instant", -] - [[package]] name = "field-offset" version = "0.3.4" @@ -418,43 +197,12 @@ dependencies = [ "rustc_version", ] -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - -[[package]] -name = "form_urlencoded" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191" -dependencies = [ - "matches", - "percent-encoding", -] - [[package]] name = "fragile" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69a039c3498dc930fe810151a34ba0c1c70b02b8625035592e74432f678591f2" -[[package]] -name = "futures" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0e7e43a803dae2fa37c1f6a8fe121e1f7bf9548b4dfc0522a42f34145dadfc27" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - [[package]] name = "futures-channel" version = "0.3.15" @@ -462,7 +210,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e682a68b29a882df0545c143dc3646daefe80ba479bcdede94d5a703de2871e2" dependencies = [ "futures-core", - "futures-sink", ] [[package]] @@ -488,21 +235,6 @@ version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acc499defb3b348f8d8f3f66415835a9131856ff7714bf10dadfc4ec4bdb29a1" -[[package]] -name = "futures-lite" -version = "1.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7694489acd39452c77daa48516b894c153f192c3578d5a839b62c58099fcbf48" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "memchr", - "parking", - "pin-project-lite", - "waker-fn", -] - [[package]] name = "futures-macro" version = "0.3.15" @@ -516,12 +248,6 @@ dependencies = [ "syn", ] -[[package]] -name = "futures-sink" -version = "0.3.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a57bead0ceff0d6dde8f465ecd96c9338121bb7717d3e7b108059531870c4282" - [[package]] name = "futures-task" version = "0.3.15" @@ -535,13 +261,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "feb5c238d27e2bf94ffdfd27b2c29e3df4a68c4193bb6427384259e2bf191967" dependencies = [ "autocfg", - "futures-channel", "futures-core", - "futures-io", "futures-macro", - "futures-sink", "futures-task", - "memchr", "pin-project-lite", "pin-utils", "proc-macro-hack", @@ -623,7 +345,7 @@ version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "wasi 0.9.0+wasi-snapshot-preview1", ] @@ -634,7 +356,7 @@ version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "libc", "wasi 0.10.2+wasi-snapshot-preview1", ] @@ -861,7 +583,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2163b09b359d8b651d627d9c83dcce5550929ad678b8ce7ec750787affa93ec" dependencies = [ "bitflags", - "cfg-if 1.0.0", + "cfg-if", "futures-channel", "futures-core", "futures-util", @@ -870,7 +592,7 @@ dependencies = [ "libc", "muldiv", "num-integer", - "num-rational 0.4.0", + "num-rational", "once_cell", "paste", "pretty-hex", @@ -898,7 +620,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5cf50118e1933d9e9e043036f2306d0b9660182ea61a75f266cd9fb3607b7a19" dependencies = [ "bitflags", - "cfg-if 1.0.0", + "cfg-if", "glib 0.14.0", "gstreamer", "gstreamer-base-sys", @@ -995,7 +717,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "500442ed0ba5f8f2b28942470b136a3dcb2df93b586e9acdd2d14687ece272ff" dependencies = [ "bitflags", - "cfg-if 1.0.0", + "cfg-if", "futures-channel", "glib 0.14.0", "gstreamer", @@ -1092,83 +814,6 @@ dependencies = [ "unicode-segmentation", ] -[[package]] -name = "hkdf" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51ab2f639c231793c5f6114bdb9bbe50a7dbbfcd7c7c6bd8475dec2d991e964f" -dependencies = [ - "digest", - "hmac", -] - -[[package]] -name = "hmac" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15" -dependencies = [ - "crypto-mac", - "digest", -] - -[[package]] -name = "http" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "527e8c9ac747e28542699a951517aa9a6945af506cd1f2e1b53a576c17b6cc11" -dependencies = [ - "bytes", - "fnv", - "itoa", -] - -[[package]] -name = "idna" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8" -dependencies = [ - "matches", - "unicode-bidi", - "unicode-normalization", -] - -[[package]] -name = "instant" -version = "0.1.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" -dependencies = [ - "cfg-if 1.0.0", -] - -[[package]] -name = "isahc" -version = "1.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81c01404730bb4574bbacb59ca0855f969f8eabd688ca22866f2cc333f1a4f69" -dependencies = [ - "async-channel", - "crossbeam-utils", - "curl", - "curl-sys", - "encoding_rs", - "event-listener", - "futures-lite", - "http", - "log", - "mime", - "once_cell", - "polling", - "slab", - "sluice", - "tracing", - "tracing-futures", - "url", - "waker-fn", -] - [[package]] name = "itertools" version = "0.9.0" @@ -1248,16 +893,6 @@ dependencies = [ "pkg-config", ] -[[package]] -name = "libnghttp2-sys" -version = "0.1.6+1.43.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0af55541a8827e138d59ec9e5877fb6095ece63fb6f4da45e7491b4fbd262855" -dependencies = [ - "cc", - "libc", -] - [[package]] name = "libsqlite3-sys" version = "0.22.2" @@ -1268,18 +903,6 @@ dependencies = [ "vcpkg", ] -[[package]] -name = "libz-sys" -version = "1.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de5435b8549c16d423ed0c03dbaafe57cf6c3344744f1242520d59c9d8ecec66" -dependencies = [ - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "locale_config" version = "0.3.0" @@ -1299,7 +922,7 @@ version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -1311,12 +934,6 @@ dependencies = [ "libc", ] -[[package]] -name = "matches" -version = "0.1.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" - [[package]] name = "memchr" version = "2.4.0" @@ -1353,12 +970,6 @@ dependencies = [ "syn", ] -[[package]] -name = "mime" -version = "0.3.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d" - [[package]] name = "mpris-player" version = "0.6.1" @@ -1393,7 +1004,7 @@ dependencies = [ "log", "musicus_backend", "once_cell", - "rand 0.7.3", + "rand", "sanitize-filename", ] @@ -1408,26 +1019,12 @@ dependencies = [ "gstreamer-player", "log", "mpris-player", - "musicus_client", "musicus_database", "musicus_import", - "secret-service", "thiserror", "tokio", ] -[[package]] -name = "musicus_client" -version = "0.1.0" -dependencies = [ - "isahc", - "log", - "musicus_database", - "serde", - "serde_json", - "thiserror", -] - [[package]] name = "musicus_database" version = "0.1.0" @@ -1435,7 +1032,7 @@ dependencies = [ "diesel", "diesel_migrations", "log", - "rand 0.7.3", + "rand", "serde", "serde_json", "thiserror", @@ -1453,69 +1050,12 @@ dependencies = [ "gstreamer-pbutils", "log", "once_cell", - "rand 0.7.3", + "rand", "sha2", "thiserror", "tokio", ] -[[package]] -name = "nb-connect" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1bb540dc6ef51cfe1916ec038ce7a620daf3a111e2502d745197cd53d6bca15" -dependencies = [ - "libc", - "socket2", -] - -[[package]] -name = "nix" -version = "0.17.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e4785f2c3b7589a0d0c1dd60285e1188adac4006e8abd6dd578e1567027363" -dependencies = [ - "bitflags", - "cc", - "cfg-if 0.1.10", - "libc", - "void", -] - -[[package]] -name = "num" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b7a8e9be5e039e2ff869df49155f1c06bd01ade2117ec783e56ab0932b67a8f" -dependencies = [ - "num-bigint", - "num-complex", - "num-integer", - "num-iter", - "num-rational 0.3.2", - "num-traits", -] - -[[package]] -name = "num-bigint" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d0a3d5e207573f948a9e5376662aa743a2ea13f7c50a554d7af443a73fbfeba" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-complex" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "747d632c0c558b87dbabbe6a82f3b4ae03720d0646ac5b7b4dae89394be5f2c5" -dependencies = [ - "num-traits", -] - [[package]] name = "num-integer" version = "0.1.44" @@ -1526,29 +1066,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "num-iter" -version = "0.1.42" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12ac428b1cb17fce6f731001d307d351ec70a6d202fc2e60f7d4c5e42d8f4f07" -dependencies = [ - "autocfg", - "num-bigint", - "num-integer", - "num-traits", -] - [[package]] name = "num-rational" version = "0.4.0" @@ -1610,25 +1127,6 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" -[[package]] -name = "openssl-probe" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28988d872ab76095a6e6ac88d99b54fd267702734fd7ffe610ca27f533ddb95a" - -[[package]] -name = "openssl-sys" -version = "0.9.65" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a7907e3bfa08bb85105209cdfcb6c63d109f8f6c1ed6ca318fff5c1853fbc1d" -dependencies = [ - "autocfg", - "cc", - "libc", - "pkg-config", - "vcpkg", -] - [[package]] name = "pango" version = "0.14.0" @@ -1654,24 +1152,12 @@ dependencies = [ "system-deps 3.1.1", ] -[[package]] -name = "parking" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "427c3892f9e783d91cc128285287e70a59e206ca452770ece88a76f7a3eddd72" - [[package]] name = "paste" version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "acbf547ad0c65e31259204bd90935776d1c693cec2f4ff7abb7a1bbbd40dfe58" -[[package]] -name = "percent-encoding" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" - [[package]] name = "pest" version = "2.1.3" @@ -1681,26 +1167,6 @@ dependencies = [ "ucd-trie", ] -[[package]] -name = "pin-project" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7509cc106041c40a4518d2af7a61530e1eed0e6285296a3d8c5472806ccc4a4" -dependencies = [ - "pin-project-internal", -] - -[[package]] -name = "pin-project-internal" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "48c950132583b500556b1efd71d45b319029f2b71518d979fcc208e16b42426f" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "pin-project-lite" version = "0.2.6" @@ -1719,19 +1185,6 @@ version = "0.3.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3831453b3449ceb48b6d9c7ad7c96d5ea673e9b470a1dc578c2ce6521230884c" -[[package]] -name = "polling" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92341d779fa34ea8437ef4d82d440d5e1ce3f3ff7f824aa64424cd481f9a1f25" -dependencies = [ - "cfg-if 1.0.0", - "libc", - "log", - "wepoll-ffi", - "winapi", -] - [[package]] name = "ppv-lite86" version = "0.2.10" @@ -1825,21 +1278,9 @@ checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ "getrandom 0.1.16", "libc", - "rand_chacha 0.2.2", - "rand_core 0.5.1", - "rand_hc 0.2.0", -] - -[[package]] -name = "rand" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" -dependencies = [ - "libc", - "rand_chacha 0.3.1", - "rand_core 0.6.3", - "rand_hc 0.3.1", + "rand_chacha", + "rand_core", + "rand_hc", ] [[package]] @@ -1849,17 +1290,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core 0.5.1", -] - -[[package]] -name = "rand_chacha" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" -dependencies = [ - "ppv-lite86", - "rand_core 0.6.3", + "rand_core", ] [[package]] @@ -1871,31 +1302,13 @@ dependencies = [ "getrandom 0.1.16", ] -[[package]] -name = "rand_core" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" -dependencies = [ - "getrandom 0.2.3", -] - [[package]] name = "rand_hc" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core 0.5.1", -] - -[[package]] -name = "rand_hc" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" -dependencies = [ - "rand_core 0.6.3", + "rand_core", ] [[package]] @@ -1940,42 +1353,6 @@ dependencies = [ "regex", ] -[[package]] -name = "schannel" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75" -dependencies = [ - "lazy_static", - "winapi", -] - -[[package]] -name = "scoped-tls" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" - -[[package]] -name = "secret-service" -version = "2.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2400fb1bf2a87b303ada204946294f932ade4929477e9e2bf66d7b49a66656ec" -dependencies = [ - "aes", - "block-modes", - "hkdf", - "lazy_static", - "num", - "rand 0.8.4", - "serde", - "sha2", - "zbus", - "zbus_macros", - "zvariant", - "zvariant_derive", -] - [[package]] name = "semver" version = "0.11.0" @@ -2025,17 +1402,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_repr" -version = "0.1.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98d0516900518c29efa217c298fa1f4e6c6ffc85ae29fd7f4ee48f176e1a9ed5" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - [[package]] name = "sha2" version = "0.9.5" @@ -2043,7 +1409,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b362ae5752fd2137731f9fa25fd4d9058af34666ca1966fb969119cc35719f12" dependencies = [ "block-buffer", - "cfg-if 1.0.0", + "cfg-if", "cpufeatures", "digest", "opaque-debug", @@ -2055,39 +1421,12 @@ version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527" -[[package]] -name = "sluice" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fa0333a60ff2e3474a6775cc611840c2a55610c831dd366503474c02f1a28f5" -dependencies = [ - "futures-channel", - "futures-core", - "futures-io", -] - [[package]] name = "smallvec" version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" -[[package]] -name = "socket2" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e3dfc207c526015c632472a77be09cf1b6e46866581aecae5cc38fb4235dea2" -dependencies = [ - "libc", - "winapi", -] - -[[package]] -name = "static_assertions" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" - [[package]] name = "strum" version = "0.18.0" @@ -2124,12 +1463,6 @@ dependencies = [ "syn", ] -[[package]] -name = "subtle" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e81da0851ada1f3e9d4312c704aa4f8806f0f9d69faaf8df2f3464b4a9437c2" - [[package]] name = "syn" version = "1.0.73" @@ -2207,21 +1540,6 @@ dependencies = [ "syn", ] -[[package]] -name = "tinyvec" -version = "1.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b5220f05bb7de7f3f53c7c065e1199b3172696fe2db9f9c4d8ad9b4ee74c342" -dependencies = [ - "tinyvec_macros", -] - -[[package]] -name = "tinyvec_macros" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c" - [[package]] name = "tokio" version = "1.7.1" @@ -2241,49 +1559,6 @@ dependencies = [ "serde", ] -[[package]] -name = "tracing" -version = "0.1.26" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09adeb8c97449311ccd28a427f96fb563e7fd31aabf994189879d9da2394b89d" -dependencies = [ - "cfg-if 1.0.0", - "log", - "pin-project-lite", - "tracing-attributes", - "tracing-core", -] - -[[package]] -name = "tracing-attributes" -version = "0.1.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "tracing-core" -version = "0.1.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9ff14f98b1a4b289c6248a023c1c2fa1491062964e9fed67ab29c4e4da4a052" -dependencies = [ - "lazy_static", -] - -[[package]] -name = "tracing-futures" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2" -dependencies = [ - "pin-project", - "tracing", -] - [[package]] name = "typenum" version = "1.13.0" @@ -2296,24 +1571,6 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" -[[package]] -name = "unicode-bidi" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeb8be209bb1c96b7c177c7420d26e04eccacb0eeae6b980e35fcb74678107e0" -dependencies = [ - "matches", -] - -[[package]] -name = "unicode-normalization" -version = "0.1.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9" -dependencies = [ - "tinyvec", -] - [[package]] name = "unicode-segmentation" version = "1.7.1" @@ -2326,18 +1583,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" -[[package]] -name = "url" -version = "2.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" -dependencies = [ - "form_urlencoded", - "idna", - "matches", - "percent-encoding", -] - [[package]] name = "uuid" version = "0.8.2" @@ -2371,18 +1616,6 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" -[[package]] -name = "void" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" - -[[package]] -name = "waker-fn" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca" - [[package]] name = "wasi" version = "0.9.0+wasi-snapshot-preview1" @@ -2395,15 +1628,6 @@ version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" -[[package]] -name = "wepoll-ffi" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d743fdedc5c64377b5fc2bc036b01c7fd642205a0d96356034ae3404d49eb7fb" -dependencies = [ - "cc", -] - [[package]] name = "winapi" version = "0.3.9" @@ -2425,63 +1649,3 @@ name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "zbus" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2326acc379a3ac4e34b794089f5bdb17086bf29a5fdf619b7b4cc772dc2e9dad" -dependencies = [ - "async-io", - "byteorder", - "derivative", - "enumflags2", - "fastrand", - "futures", - "nb-connect", - "nix", - "once_cell", - "polling", - "scoped-tls", - "serde", - "serde_repr", - "zbus_macros", - "zvariant", -] - -[[package]] -name = "zbus_macros" -version = "1.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a482c56029e48681b89b92b5db3c446db0915e8dd1052c0328a574eda38d5f93" -dependencies = [ - "proc-macro-crate 0.1.5", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zvariant" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa9a0fc1c0ea8400723fdaddd3b381147d50991a40da39e6ea935b7d63204722" -dependencies = [ - "byteorder", - "enumflags2", - "serde", - "static_assertions", - "zvariant_derive", -] - -[[package]] -name = "zvariant_derive" -version = "2.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4cf1d7953d902d1bad61878a7c79bd224d4a83bdfc93c84cc703ec760b8b70e9" -dependencies = [ - "proc-macro-crate 1.0.0", - "proc-macro2", - "quote", - "syn", -] diff --git a/Cargo.toml b/Cargo.toml index 92a9b42..a1f6940 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,2 +1,2 @@ [workspace] -members = ["backend", "client", "database", "import", "musicus"] +members = ["backend", "database", "import", "musicus"] diff --git a/backend/Cargo.toml b/backend/Cargo.toml index 81f2c72..27c716b 100644 --- a/backend/Cargo.toml +++ b/backend/Cargo.toml @@ -10,7 +10,6 @@ glib = "0.14.0" gstreamer = "0.17.0" gstreamer-player = "0.17.0" log = { version = "0.4.14", features = ["std"] } -musicus_client = { version = "0.1.0", path = "../client" } musicus_database = { version = "0.1.0", path = "../database" } musicus_import = { version = "0.1.0", path = "../import" } thiserror = "1.0.23" @@ -18,4 +17,3 @@ tokio = { version = "1.4.0", features = ["sync"] } [target.'cfg(target_os = "linux")'.dependencies] mpris-player = "0.6.0" -secret-service = "2.0.1" diff --git a/backend/src/error.rs b/backend/src/error.rs index 0fbb735..4e64332 100644 --- a/backend/src/error.rs +++ b/backend/src/error.rs @@ -1,16 +1,9 @@ -/// An error that can happened within the backend. +/// An error that happened within the backend. #[derive(thiserror::Error, Debug)] pub enum Error { - #[error(transparent)] - ClientError(#[from] musicus_client::Error), - #[error(transparent)] DatabaseError(#[from] musicus_database::Error), - #[cfg(target_os = "linux")] - #[error("An error happened using the SecretService.")] - SecretServiceError(#[from] secret_service::Error), - #[error("An error happened while decoding to UTF-8.")] Utf8Error(#[from] std::str::Utf8Error), diff --git a/backend/src/lib.rs b/backend/src/lib.rs index b0350b0..e7158c1 100644 --- a/backend/src/lib.rs +++ b/backend/src/lib.rs @@ -1,13 +1,9 @@ -use gio::prelude::*; -use log::warn; -use musicus_client::{Client, LoginData}; use musicus_database::DbThread; -use std::cell::{Cell, RefCell}; +use std::cell::RefCell; use std::path::PathBuf; use std::rc::Rc; use tokio::sync::{broadcast, broadcast::Sender}; -pub use musicus_client as client; pub use musicus_database as db; pub use musicus_import as import; @@ -22,9 +18,6 @@ mod logger; pub mod player; pub use player::*; -#[cfg(all(feature = "dbus"))] -mod secure; - /// General states the application can be in. #[derive(Debug, Clone)] pub enum BackendState { @@ -49,9 +42,6 @@ pub struct Backend { /// Access to GSettings. settings: gio::Settings, - /// Whether the server should be used by default when searching for or changing items. - use_server: Cell, - /// The current path to the music library, which is used by the player and the database. This /// is guaranteed to be Some, when the state is set to BackendState::Ready. music_library_path: RefCell>, @@ -65,9 +55,6 @@ pub struct Backend { /// The player handling playlist and playback. This can be assumed to exist, when the state is /// set to BackendState::Ready. player: RefCell>>, - - /// A client for the Wolfgang server. - client: Client, } impl Backend { @@ -83,12 +70,10 @@ impl Backend { Backend { state_sender, settings: gio::Settings::new("de.johrpan.musicus"), - use_server: Cell::new(true), music_library_path: RefCell::new(None), library_updated_sender, database: RefCell::new(None), - player: RefCell::new(None), - client: Client::new(), + player: RefCell::new(None) } } @@ -102,24 +87,6 @@ impl Backend { pub async fn init(&self) -> Result<()> { self.init_library().await?; - let url = self.settings.string("server-url"); - if !url.is_empty() { - self.client.set_server_url(&url); - } - - #[cfg(all(feature = "dbus"))] - match Self::load_login_data().await { - Ok(Some(data)) => self.client.set_login_data(Some(data)), - Err(err) => warn!( - "The login data could not be loaded from SecretService. It will not \ - be available. Error message: {}", - err - ), - _ => (), - } - - self.use_server.set(self.settings.boolean("use-server")); - if self.get_music_library_path().is_none() { self.set_state(BackendState::NoMusicLibrary); } else { @@ -129,80 +96,6 @@ impl Backend { Ok(()) } - /// Whether the server should be used by default. - /// - /// This will return `false` if no server URL is set up. Otherwise, the - /// value is based on the users "use-server" preference. - pub fn use_server(&self) -> bool { - self.client.get_server_url().is_some() && self.use_server.get() - } - - /// Set whether the server should be used by default. - pub fn set_use_server(&self, enabled: bool) { - self.use_server.set(enabled); - - if let Err(err) = self.settings.set_boolean("use-server", enabled) { - warn!( - "An error happened whilte trying to save the \"use-server\" setting to GSettings. \ - Error message: {}", - err - ) - } - } - - /// Set the URL of the Musicus server to connect to. - pub fn set_server_url(&self, url: &str) { - if let Err(err) = self.settings.set_string("server-url", url) { - warn!( - "An error happened while trying to save the server URL to GSettings. Most \ - likely it will not be available at the next startup. Error message: {}", - err - ); - } - - self.client.set_server_url(url); - } - - /// Get the currently set server URL. - pub fn get_server_url(&self) -> Option { - self.client.get_server_url() - } - - /// Set the user credentials to use. - pub async fn set_login_data(&self, data: Option) { - #[cfg(all(feature = "dbus"))] - if let Some(data) = &data { - if let Err(err) = Self::store_login_data(data.clone()).await { - warn!( - "An error happened while trying to store the login data using SecretService. \ - This means, that they will not be available at the next startup most likely. \ - Error message: {}", - err - ); - } - } else { - if let Err(err) = Self::delete_secrets().await { - warn!( - "An error happened while trying to delete the login data from SecretService. \ - This may result in the login data being reloaded at the next startup. Error \ - message: {}", - err - ); - } - } - - self.client.set_login_data(data); - } - - pub fn cl(&self) -> &Client { - &self.client - } - - /// Get the currently stored login credentials. - pub fn get_login_data(&self) -> Option { - self.client.get_login_data() - } - /// Set the current state and notify the user interface. fn set_state(&self, state: BackendState) { self.state_sender.send(state).unwrap(); diff --git a/backend/src/secure.rs b/backend/src/secure.rs deleted file mode 100644 index 6ab018e..0000000 --- a/backend/src/secure.rs +++ /dev/null @@ -1,112 +0,0 @@ -use crate::{Backend, Error, Result}; -use futures_channel::oneshot; -use musicus_client::LoginData; -use secret_service::{Collection, EncryptionType, SecretService}; -use std::collections::HashMap; -use std::thread; - -impl Backend { - /// Get the login credentials from secret storage. - pub(super) async fn load_login_data() -> Result> { - let (sender, receiver) = oneshot::channel(); - thread::spawn(move || sender.send(Self::load_login_data_priv()).unwrap()); - receiver.await? - } - - /// Savely store the user's current login credentials. - pub(super) async fn store_login_data(data: LoginData) -> Result<()> { - let (sender, receiver) = oneshot::channel(); - thread::spawn(move || sender.send(Self::store_login_data_priv(data)).unwrap()); - receiver.await? - } - - /// Delete all stored secrets. - pub(super) async fn delete_secrets() -> Result<()> { - let (sender, receiver) = oneshot::channel(); - thread::spawn(move || sender.send(Self::delete_secrets_priv()).unwrap()); - receiver.await? - } - - /// Get the login credentials from secret storage. - fn load_login_data_priv() -> Result> { - let ss = SecretService::new(EncryptionType::Dh)?; - let collection = Self::get_collection(&ss)?; - - let items = collection.get_all_items()?; - - let key = "musicus-login-data"; - let item = items - .iter() - .find(|item| item.get_label().unwrap_or_default() == key); - - Ok(match item { - Some(item) => { - let username = item - .get_attributes()? - .get("username") - .ok_or(Error::Other( - "Missing username in SecretService attributes.", - ))? - .to_owned(); - - let password = std::str::from_utf8(&item.get_secret()?)?.to_owned(); - - Some(LoginData { username, password }) - } - None => None, - }) - } - - /// Savely store the user's current login credentials. - fn store_login_data_priv(data: LoginData) -> Result<()> { - let ss = SecretService::new(EncryptionType::Dh)?; - let collection = Self::get_collection(&ss)?; - - let key = "musicus-login-data"; - Self::delete_secrets_for_key(&collection, key)?; - - let mut attributes = HashMap::new(); - attributes.insert("username", data.username.as_str()); - collection.create_item( - key, - attributes, - data.password.as_bytes(), - true, - "text/plain", - )?; - - Ok(()) - } - - /// Delete all stored secrets. - fn delete_secrets_priv() -> Result<()> { - let ss = SecretService::new(EncryptionType::Dh)?; - let collection = Self::get_collection(&ss)?; - - let key = "musicus-login-data"; - Self::delete_secrets_for_key(&collection, key)?; - - Ok(()) - } - - /// Delete all stored secrets for the provided key. - fn delete_secrets_for_key(collection: &Collection, key: &str) -> Result<()> { - let items = collection.get_all_items()?; - - for item in items { - if item.get_label().unwrap_or_default() == key { - item.delete()?; - } - } - - Ok(()) - } - - /// Get the default SecretService collection and unlock it. - fn get_collection<'a>(ss: &'a SecretService) -> Result> { - let collection = ss.get_default_collection()?; - collection.unlock()?; - - Ok(collection) - } -} diff --git a/client/Cargo.toml b/client/Cargo.toml deleted file mode 100644 index b6c2bc9..0000000 --- a/client/Cargo.toml +++ /dev/null @@ -1,12 +0,0 @@ -[package] -name = "musicus_client" -version = "0.1.0" -edition = "2021" - -[dependencies] -isahc = "1.1.0" -log = "0.4.14" -musicus_database = { version = "0.1.0", path = "../database" } -serde = { version = "1.0.117", features = ["derive"] } -serde_json = "1.0.59" -thiserror = "1.0.23" diff --git a/client/src/ensembles.rs b/client/src/ensembles.rs deleted file mode 100644 index 7ff3980..0000000 --- a/client/src/ensembles.rs +++ /dev/null @@ -1,20 +0,0 @@ -use crate::{Client, Result}; -use log::info; -use musicus_database::Ensemble; - -impl Client { - /// Get all available ensembles from the server. - pub async fn get_ensembles(&self) -> Result> { - info!("Get ensembles"); - let body = self.get("ensembles").await?; - let ensembles: Vec = serde_json::from_str(&body)?; - Ok(ensembles) - } - - /// Post a new ensemble to the server. - pub async fn post_ensemble(&self, data: &Ensemble) -> Result<()> { - info!("Post ensemble {:?}", data); - self.post("ensembles", serde_json::to_string(data)?).await?; - Ok(()) - } -} diff --git a/client/src/error.rs b/client/src/error.rs deleted file mode 100644 index b3c30c8..0000000 --- a/client/src/error.rs +++ /dev/null @@ -1,34 +0,0 @@ -use isahc::http::StatusCode; - -/// An error within the client. -#[derive(thiserror::Error, Debug)] -pub enum Error { - #[error("The users login credentials were wrong.")] - LoginFailed, - - #[error("The user has to be logged in to perform this action.")] - Unauthorized, - - #[error("The user is not allowed to perform this action.")] - Forbidden, - - #[error("The server returned an unexpected status code: {0}.")] - UnexpectedResponse(StatusCode), - - #[error("A networking error happened.")] - NetworkError(#[from] isahc::Error), - - #[error("A networking error happened.")] - HttpError(#[from] isahc::http::Error), - - #[error("An error happened when serializing/deserializing.")] - SerdeError(#[from] serde_json::Error), - - #[error("An IO error happened.")] - IoError(#[from] std::io::Error), - - #[error("An error happened: {0}")] - Other(&'static str), -} - -pub type Result = std::result::Result; diff --git a/client/src/instruments.rs b/client/src/instruments.rs deleted file mode 100644 index 13b28dc..0000000 --- a/client/src/instruments.rs +++ /dev/null @@ -1,21 +0,0 @@ -use crate::{Client, Result}; -use log::info; -use musicus_database::Instrument; - -impl Client { - /// Get all available instruments from the server. - pub async fn get_instruments(&self) -> Result> { - info!("Get instruments"); - let body = self.get("instruments").await?; - let instruments: Vec = serde_json::from_str(&body)?; - Ok(instruments) - } - - /// Post a new instrument to the server. - pub async fn post_instrument(&self, data: &Instrument) -> Result<()> { - info!("Post instrument {:?}", data); - self.post("instruments", serde_json::to_string(data)?) - .await?; - Ok(()) - } -} diff --git a/client/src/lib.rs b/client/src/lib.rs deleted file mode 100644 index 21decc0..0000000 --- a/client/src/lib.rs +++ /dev/null @@ -1,184 +0,0 @@ -use isahc::http::StatusCode; -use isahc::prelude::*; -use isahc::{AsyncBody, Request, Response}; -use log::info; -use serde::Serialize; -use std::cell::RefCell; -use std::time::Duration; - -pub mod ensembles; -pub use ensembles::*; - -pub mod error; -pub use error::*; - -pub mod instruments; -pub use instruments::*; - -pub mod mediums; -pub use mediums::*; - -pub mod persons; -pub use persons::*; - -pub mod recordings; -pub use recordings::*; - -pub mod register; -pub use register::*; - -pub mod works; -pub use works::*; - -/// Credentials used for login. -#[derive(Serialize, Debug, Clone)] -#[serde(rename_all = "camelCase")] -pub struct LoginData { - pub username: String, - pub password: String, -} - -/// A client for accessing the Wolfgang API. -pub struct Client { - server_url: RefCell>, - login_data: RefCell>, - token: RefCell>, -} - -impl Client { - /// Create a new client. - pub fn new() -> Self { - Self { - server_url: RefCell::new(None), - login_data: RefCell::new(None), - token: RefCell::new(None), - } - } - - /// Set the URL of the Musicus server to connect to. - pub fn set_server_url(&self, url: &str) { - self.server_url.replace(Some(url.to_owned())); - } - - /// Get the currently set server URL. - pub fn get_server_url(&self) -> Option { - self.server_url.borrow().clone() - } - - /// Set the user credentials to use. - pub fn set_login_data(&self, data: Option) { - self.login_data.replace(data); - self.token.replace(None); - } - - /// Get the currently stored login credentials. - pub fn get_login_data(&self) -> Option { - self.login_data.borrow().clone() - } - - /// Try to login a user with the provided credentials and return, wether the login suceeded. - pub async fn login(&self) -> Result { - info!("Login"); - - let server_url = self.server_url()?; - let data = self.login_data()?; - - let request = Request::post(format!("{}/login", server_url)) - .timeout(Duration::from_secs(10)) - .header("Content-Type", "application/json") - .body(serde_json::to_string(&data)?)?; - - let mut response = isahc::send_async(request).await?; - - let success = match response.status() { - StatusCode::OK => { - let token = response.text().await?; - self.token.replace(Some(token)); - true - } - StatusCode::UNAUTHORIZED => false, - status_code => return Err(Error::UnexpectedResponse(status_code)), - }; - - Ok(success) - } - - /// Make an unauthenticated get request to the server. - async fn get(&self, url: &str) -> Result { - let server_url = self.server_url()?; - - let mut response = Request::get(format!("{}/{}", server_url, url)) - .timeout(Duration::from_secs(10)) - .body(())? - .send_async() - .await?; - - match response.status() { - StatusCode::OK => Ok(response.text().await?), - status_code => Err(Error::UnexpectedResponse(status_code)), - } - } - - /// Make an authenticated post request to the server. - async fn post(&self, url: &str, body: String) -> Result { - // Try to do the request using a cached login token. - if self.token.borrow().is_some() { - let mut response = self.post_priv(url, body.clone()).await?; - - // If authorization failed, try again below. Else, return early. - match response.status() { - StatusCode::UNAUTHORIZED => info!("Token may be expired"), - StatusCode::OK => return Ok(response.text().await?), - status_code => return Err(Error::UnexpectedResponse(status_code)), - } - } - - if self.login().await? { - let mut response = self.post_priv(url, body).await?; - - match response.status() { - StatusCode::OK => Ok(response.text().await?), - StatusCode::UNAUTHORIZED => Err(Error::Unauthorized), - status_code => Err(Error::UnexpectedResponse(status_code)), - } - } else { - Err(Error::LoginFailed) - } - } - - /// Post something to the server assuming there is a valid login token. - async fn post_priv(&self, url: &str, body: String) -> Result> { - let server_url = self.server_url()?; - let token = self.token()?; - - let response = Request::post(format!("{}/{}", server_url, url)) - .timeout(Duration::from_secs(10)) - .header("Authorization", format!("Bearer {}", token)) - .header("Content-Type", "application/json") - .body(body)? - .send_async() - .await?; - - Ok(response) - } - - /// Require the server URL to be set. - fn server_url(&self) -> Result { - self.get_server_url() - .ok_or(Error::Other("The server URL is not available!")) - } - - /// Require the login data to be set. - fn login_data(&self) -> Result { - self.get_login_data() - .ok_or(Error::Other("The login data is unset!")) - } - - /// Require a login token to be set. - fn token(&self) -> Result { - self.token - .borrow() - .clone() - .ok_or(Error::Other("No login token found!")) - } -} diff --git a/client/src/mediums.rs b/client/src/mediums.rs deleted file mode 100644 index 244f4b5..0000000 --- a/client/src/mediums.rs +++ /dev/null @@ -1,32 +0,0 @@ -use crate::{Client, Result}; -use log::info; -use musicus_database::Medium; - -impl Client { - /// Get all available mediums from the server, that contain the specified - /// recording. - pub async fn get_mediums_for_recording(&self, recording_id: &str) -> Result> { - info!("Get mediums for recording {}", recording_id); - let body = self - .get(&format!("recordings/{}/mediums", recording_id)) - .await?; - let mediums: Vec = serde_json::from_str(&body)?; - Ok(mediums) - } - - /// Get all available mediums from the server, that match the specified - /// DiscID. - pub async fn get_mediums_by_discid(&self, discid: &str) -> Result> { - info!("Get mediums by discid {}", discid); - let body = self.get(&format!("discids/{}/mediums", discid)).await?; - let mediums: Vec = serde_json::from_str(&body)?; - Ok(mediums) - } - - /// Post a new medium to the server. - pub async fn post_medium(&self, data: &Medium) -> Result<()> { - info!("Post medium {:?}", data); - self.post("mediums", serde_json::to_string(data)?).await?; - Ok(()) - } -} diff --git a/client/src/persons.rs b/client/src/persons.rs deleted file mode 100644 index 4e1ab84..0000000 --- a/client/src/persons.rs +++ /dev/null @@ -1,20 +0,0 @@ -use crate::{Client, Result}; -use log::info; -use musicus_database::Person; - -impl Client { - /// Get all available persons from the server. - pub async fn get_persons(&self) -> Result> { - info!("Get persons"); - let body = self.get("persons").await?; - let persons: Vec = serde_json::from_str(&body)?; - Ok(persons) - } - - /// Post a new person to the server. - pub async fn post_person(&self, data: &Person) -> Result<()> { - info!("Post person {:?}", data); - self.post("persons", serde_json::to_string(data)?).await?; - Ok(()) - } -} diff --git a/client/src/recordings.rs b/client/src/recordings.rs deleted file mode 100644 index e83bd6e..0000000 --- a/client/src/recordings.rs +++ /dev/null @@ -1,21 +0,0 @@ -use crate::{Client, Result}; -use log::info; -use musicus_database::Recording; - -impl Client { - /// Get all available recordings from the server. - pub async fn get_recordings_for_work(&self, work_id: &str) -> Result> { - info!("Get recordings for work {}", work_id); - let body = self.get(&format!("works/{}/recordings", work_id)).await?; - let recordings: Vec = serde_json::from_str(&body)?; - Ok(recordings) - } - - /// Post a new recording to the server. - pub async fn post_recording(&self, data: &Recording) -> Result<()> { - info!("Post recording {:?}", data); - self.post("recordings", serde_json::to_string(data)?) - .await?; - Ok(()) - } -} diff --git a/client/src/register.rs b/client/src/register.rs deleted file mode 100644 index ff3ce24..0000000 --- a/client/src/register.rs +++ /dev/null @@ -1,56 +0,0 @@ -use crate::{Client, Result}; -use isahc::http::StatusCode; -use isahc::prelude::*; -use isahc::Request; -use log::info; -use serde::{Deserialize, Serialize}; -use std::time::Duration; - -/// Response body data for captcha requests. -#[derive(Clone, Debug, Deserialize)] -#[serde(rename_all = "camelCase")] -pub struct Captcha { - pub id: String, - pub question: String, -} - -/// Request body data for user registration. -#[derive(Serialize, Clone)] -#[serde(rename_all = "camelCase")] -pub struct UserRegistration { - pub username: String, - pub password: String, - pub email: Option, - pub captcha_id: String, - pub answer: String, -} - -impl Client { - /// Request a new captcha for registration. - pub async fn get_captcha(&self) -> Result { - info!("Get captcha"); - let body = self.get("captcha").await?; - let captcha = serde_json::from_str(&body)?; - Ok(captcha) - } - - /// Register a new user and return whether the process suceeded. This will - /// not store the new login credentials. - pub async fn register(&self, data: UserRegistration) -> Result { - // Make sure to not log the password accidentally! - info!("Register user '{}'", data.username); - info!("Captcha ID: {}", data.captcha_id); - info!("Captcha answer: {}", data.answer); - - let server_url = self.server_url()?; - - let response = Request::post(format!("{}/users", server_url)) - .timeout(Duration::from_secs(10)) - .header("Content-Type", "application/json") - .body(serde_json::to_string(&data)?)? - .send_async() - .await?; - - Ok(response.status() == StatusCode::OK) - } -} diff --git a/client/src/works.rs b/client/src/works.rs deleted file mode 100644 index b59bbc1..0000000 --- a/client/src/works.rs +++ /dev/null @@ -1,20 +0,0 @@ -use crate::{Client, Result}; -use log::info; -use musicus_database::Work; - -impl Client { - /// Get all available works from the server. - pub async fn get_works(&self, composer_id: &str) -> Result> { - info!("Get works by composer {}", composer_id); - let body = self.get(&format!("persons/{}/works", composer_id)).await?; - let works: Vec = serde_json::from_str(&body)?; - Ok(works) - } - - /// Post a new work to the server. - pub async fn post_work(&self, data: &Work) -> Result<()> { - info!("Post work {:?}", data); - self.post("works", serde_json::to_string(data)?).await?; - Ok(()) - } -} diff --git a/de.johrpan.musicus.json b/de.johrpan.musicus.json index 77cb5a8..4d8b3fe 100644 --- a/de.johrpan.musicus.json +++ b/de.johrpan.musicus.json @@ -1,37 +1,36 @@ { - "app-id" : "de.johrpan.musicus", - "runtime" : "org.gnome.Platform", - "runtime-version" : "master", - "sdk" : "org.gnome.Sdk", - "sdk-extensions" : [ + "app-id": "de.johrpan.musicus", + "runtime": "org.gnome.Platform", + "runtime-version": "master", + "sdk": "org.gnome.Sdk", + "sdk-extensions": [ "org.freedesktop.Sdk.Extension.rust-stable" ], - "command" : "musicus", - "finish-args" : [ + "command": "musicus", + "finish-args": [ "--share=network", "--share=ipc", "--socket=x11", "--socket=wayland", "--socket=pulseaudio", "--filesystem=host", - "--talk-name=org.freedesktop.secrets", - "--talk-name=org.mpris.MediaPlayer2.Player", + "--talk-name=org.mpris.MediaPlayer2.Player", "--own-name=org.mpris.MediaPlayer2.de.johrpan.musicus", "--device=all" ], - "build-options" : { - "append-path" : "/usr/lib/sdk/rust-stable/bin", - "build-args" : [ + "build-options": { + "append-path": "/usr/lib/sdk/rust-stable/bin", + "build-args": [ "--share=network" ], - "env" : { - "RUSTFLAGS" : "-L=/app/lib", - "CARGO_HOME" : "/run/build/musicus/cargo", - "RUST_BACKTRACE" : "1", - "RUST_LOG" : "musicus=debug" + "env": { + "RUSTFLAGS": "-L=/app/lib", + "CARGO_HOME": "/run/build/musicus/cargo", + "RUST_BACKTRACE": "1", + "RUST_LOG": "musicus=debug" } }, - "cleanup" : [ + "cleanup": [ "/include", "/lib/pkgconfig", "/man", @@ -42,8 +41,7 @@ "*.la", "*.a" ], - "modules" : [ - { + "modules": [{ "name": "cdparanoia", "buildsystem": "simple", "build-commands": [ @@ -52,13 +50,11 @@ "make all slib", "make install" ], - "sources": [ - { - "type": "archive", - "url": "http://downloads.xiph.org/releases/cdparanoia/cdparanoia-III-10.2.src.tgz", - "sha256": "005db45ef4ee017f5c32ec124f913a0546e77014266c6a1c50df902a55fe64df" - } - ] + "sources": [{ + "type": "archive", + "url": "http://downloads.xiph.org/releases/cdparanoia/cdparanoia-III-10.2.src.tgz", + "sha256": "005db45ef4ee017f5c32ec124f913a0546e77014266c6a1c50df902a55fe64df" + }] }, { "name": "gst-plugins-base", @@ -68,26 +64,22 @@ "-Dauto_features=disabled", "-Dcdparanoia=enabled" ], - "cleanup": [ "*.la", "/share/gtk-doc" ], - "sources": [ - { - "type": "git", - "url": "https://gitlab.freedesktop.org/gstreamer/gst-plugins-base.git", - "branch" : "1.16.2", - "commit" : "9d3581b2e6f12f0b7e790d1ebb63b90cf5b1ef4e" - } - ] + "cleanup": ["*.la", "/share/gtk-doc"], + "sources": [{ + "type": "git", + "url": "https://gitlab.freedesktop.org/gstreamer/gst-plugins-base.git", + "branch": "1.16.2", + "commit": "9d3581b2e6f12f0b7e790d1ebb63b90cf5b1ef4e" + }] }, { - "name" : "musicus", - "builddir" : true, - "buildsystem" : "meson", - "sources" : [ - { - "type" : "git", - "url" : "." - } - ] + "name": "musicus", + "builddir": true, + "buildsystem": "meson", + "sources": [{ + "type": "git", + "url": "." + }] } ] -} +} \ No newline at end of file diff --git a/musicus/data/de.johrpan.musicus.gschema.xml b/musicus/data/de.johrpan.musicus.gschema.xml index 60baa48..2609270 100644 --- a/musicus/data/de.johrpan.musicus.gschema.xml +++ b/musicus/data/de.johrpan.musicus.gschema.xml @@ -5,17 +5,5 @@ "" Path to the music library folder - - "https://wolfgang.johrpan.de" - URL of the Wolfgang server to use - - - true - Whether to use the Wolfgang server - - This setting determines whether the Wolfgang server will be used for - finding new items as well as to upload new additions and edits. - - diff --git a/musicus/res/musicus.gresource.xml b/musicus/res/musicus.gresource.xml index a57529d..3a1933f 100644 --- a/musicus/res/musicus.gresource.xml +++ b/musicus/res/musicus.gresource.xml @@ -3,7 +3,6 @@ ui/editor.ui ui/import_screen.ui - ui/login_dialog.ui ui/main_screen.ui ui/medium_editor.ui ui/medium_preview.ui @@ -16,7 +15,6 @@ ui/screen.ui ui/section.ui ui/selector.ui - ui/server_dialog.ui ui/source_selector.ui ui/track_editor.ui ui/track_selector.ui diff --git a/musicus/res/ui/import_screen.ui b/musicus/res/ui/import_screen.ui index 3f849ec..d7971bd 100644 --- a/musicus/res/ui/import_screen.ui +++ b/musicus/res/ui/import_screen.ui @@ -45,12 +45,6 @@ - - - Use the Musicus server - True - - diff --git a/musicus/res/ui/login_dialog.ui b/musicus/res/ui/login_dialog.ui deleted file mode 100644 index 4442bea..0000000 --- a/musicus/res/ui/login_dialog.ui +++ /dev/null @@ -1,223 +0,0 @@ - - - - - - crossfade - - - content - - - vertical - - - false - false - - - - - - - Cancel - - - - - Login - - - - - - - - False - - - - - true - - - 12 - 12 - 18 - 12 - 800 - - - vertical - 12 - - - start - Login to existing account - - - - - - - - start - - - none - - - False - Username - username_entry - - - center - True - - - - - - - False - Password - password_entry - - - center - True - False - password - - - - - - - - - - - vertical - 12 - - - start - Create a new account - - - - - - - - start - - - none - - - False - Register a new account - register_button - - - Start - center - - - - - - - - - - - - - vertical - 12 - false - - - start - Logout - - - - - - - - start - - - none - - - False - Don't use an account - logout_button - - - Logout - center - - - - - - - - - - - - - - - - - - - - - - - loading - - - vertical - - - false - false - - - Login - - - - - - - - true - true - true - center - center - - - - - - - - diff --git a/musicus/res/ui/medium_editor.ui b/musicus/res/ui/medium_editor.ui index 07c3c60..722185c 100644 --- a/musicus/res/ui/medium_editor.ui +++ b/musicus/res/ui/medium_editor.ui @@ -82,19 +82,6 @@ - - - False - Publish to the server - publish_switch - - - center - True - - - - diff --git a/musicus/res/ui/preferences.ui b/musicus/res/ui/preferences.ui index e980af1..960faca 100644 --- a/musicus/res/ui/preferences.ui +++ b/musicus/res/ui/preferences.ui @@ -29,49 +29,7 @@ - - - Server connection - - - False - Server URL - url_button - Not set - - - Change - True - center - - - - - - - False - Login credentials - login_button - Not logged in - - - Change - True - center - - - - - - - - - - - - - diff --git a/musicus/res/ui/recording_editor.ui b/musicus/res/ui/recording_editor.ui index f1c7aa1..90c79d6 100644 --- a/musicus/res/ui/recording_editor.ui +++ b/musicus/res/ui/recording_editor.ui @@ -99,19 +99,6 @@ - - - False - Publish to the server - upload_switch - - - center - True - - - - diff --git a/musicus/res/ui/selector.ui b/musicus/res/ui/selector.ui index bc3fd41..54e91ca 100644 --- a/musicus/res/ui/selector.ui +++ b/musicus/res/ui/selector.ui @@ -60,13 +60,6 @@ Search … - - - Use the Musicus server - start - True - - @@ -118,57 +111,6 @@ - - - error - - - center - center - 18 - 18 - 18 - 18 - vertical - 18 - - - 0.5 - 80 - network-error-symbolic - - - - - 0.5 - An error occured! - - - - - - - - 0.5 - The server was not reachable or responded with an error. Please check your internet connection. - center - True - 40 - - - - - Try again - center - - - - - - - diff --git a/musicus/res/ui/server_dialog.ui b/musicus/res/ui/server_dialog.ui deleted file mode 100644 index b6e07cf..0000000 --- a/musicus/res/ui/server_dialog.ui +++ /dev/null @@ -1,59 +0,0 @@ - - - - - - True - - - vertical - - - false - false - - - Server - - - - - - Cancel - - - - - Set - True - - - - - - - - none - - - False - URL - url_entry - - - center - True - - - - - - - - - - diff --git a/musicus/res/ui/work_editor.ui b/musicus/res/ui/work_editor.ui index 761f059..7c52d33 100644 --- a/musicus/res/ui/work_editor.ui +++ b/musicus/res/ui/work_editor.ui @@ -1,7 +1,7 @@ - - + + @@ -17,13 +17,13 @@ Work - go-previous-symbolic + go-previous-symbolic @@ -31,7 +31,7 @@ False object-select-symbolic @@ -64,7 +64,7 @@ 6 Overview - + @@ -99,19 +99,6 @@ - - - False - Publish to the server - upload_switch - - - center - True - - - - @@ -128,7 +115,7 @@ True Instruments - + @@ -141,7 +128,7 @@ - + @@ -155,7 +142,7 @@ True Structure - + @@ -174,7 +161,7 @@ - + @@ -200,7 +187,7 @@ Work diff --git a/musicus/src/editors/ensemble.rs b/musicus/src/editors/ensemble.rs index 6947492..2b88b14 100644 --- a/musicus/src/editors/ensemble.rs +++ b/musicus/src/editors/ensemble.rs @@ -1,5 +1,5 @@ use crate::navigator::{NavigationHandle, Screen}; -use crate::widgets::{Editor, EntryRow, Section, UploadSection, Widget}; +use crate::widgets::{Editor, EntryRow, Section, Widget}; use anyhow::Result; use gettextrs::gettext; use glib::clone; @@ -16,7 +16,6 @@ pub struct EnsembleEditor { editor: Editor, name: EntryRow, - upload: Rc, } impl Screen, Ensemble> for EnsembleEditor { @@ -33,10 +32,7 @@ impl Screen, Ensemble> for EnsembleEditor { list.append(&name.widget); let section = Section::new(&gettext("General"), &list); - let upload = UploadSection::new(Rc::clone(&handle.backend)); - editor.add_content(§ion.widget); - editor.add_content(&upload.widget); let id = match ensemble { Some(ensemble) => { @@ -51,7 +47,6 @@ impl Screen, Ensemble> for EnsembleEditor { id, editor, name, - upload, }); // Connect signals and callbacks @@ -91,7 +86,7 @@ impl EnsembleEditor { self.editor.set_may_save(!self.name.get_text().is_empty()); } - /// Save the ensemble and possibly upload it to the server. + /// Save the ensemble. async fn save(&self) -> Result { let name = self.name.get_text(); @@ -100,15 +95,12 @@ impl EnsembleEditor { name, }; - if self.upload.get_active() { - self.handle.backend.cl().post_ensemble(&ensemble).await?; - } - self.handle .backend .db() .update_ensemble(ensemble.clone()) .await?; + self.handle.backend.library_changed(); Ok(ensemble) diff --git a/musicus/src/editors/instrument.rs b/musicus/src/editors/instrument.rs index 6d62a2e..9c78fb8 100644 --- a/musicus/src/editors/instrument.rs +++ b/musicus/src/editors/instrument.rs @@ -1,5 +1,5 @@ use crate::navigator::{NavigationHandle, Screen}; -use crate::widgets::{Editor, EntryRow, Section, UploadSection, Widget}; +use crate::widgets::{Editor, EntryRow, Section, Widget}; use anyhow::Result; use gettextrs::gettext; use glib::clone; @@ -16,7 +16,6 @@ pub struct InstrumentEditor { editor: Editor, name: EntryRow, - upload: Rc, } impl Screen, Instrument> for InstrumentEditor { @@ -33,10 +32,7 @@ impl Screen, Instrument> for InstrumentEditor { list.append(&name.widget); let section = Section::new(&gettext("General"), &list); - let upload = UploadSection::new(Rc::clone(&handle.backend)); - editor.add_content(§ion.widget); - editor.add_content(&upload.widget); let id = match instrument { Some(instrument) => { @@ -51,7 +47,6 @@ impl Screen, Instrument> for InstrumentEditor { id, editor, name, - upload, }); // Connect signals and callbacks @@ -91,7 +86,7 @@ impl InstrumentEditor { self.editor.set_may_save(!self.name.get_text().is_empty()); } - /// Save the instrument and possibly upload it to the server. + /// Save the instrument. async fn save(&self) -> Result { let name = self.name.get_text(); @@ -100,19 +95,12 @@ impl InstrumentEditor { name, }; - if self.upload.get_active() { - self.handle - .backend - .cl() - .post_instrument(&instrument) - .await?; - } - self.handle .backend .db() .update_instrument(instrument.clone()) .await?; + self.handle.backend.library_changed(); Ok(instrument) diff --git a/musicus/src/editors/person.rs b/musicus/src/editors/person.rs index 2b99d1c..ea973d7 100644 --- a/musicus/src/editors/person.rs +++ b/musicus/src/editors/person.rs @@ -1,5 +1,5 @@ use crate::navigator::{NavigationHandle, Screen}; -use crate::widgets::{Editor, EntryRow, Section, UploadSection, Widget}; +use crate::widgets::{Editor, EntryRow, Section, Widget}; use anyhow::Result; use gettextrs::gettext; use glib::clone; @@ -17,7 +17,6 @@ pub struct PersonEditor { editor: Editor, first_name: EntryRow, last_name: EntryRow, - upload: Rc, } impl Screen, Person> for PersonEditor { @@ -37,10 +36,7 @@ impl Screen, Person> for PersonEditor { list.append(&last_name.widget); let section = Section::new(&gettext("General"), &list); - let upload = UploadSection::new(Rc::clone(&handle.backend)); - editor.add_content(§ion.widget); - editor.add_content(&upload.widget); let id = match person { Some(person) => { @@ -58,7 +54,6 @@ impl Screen, Person> for PersonEditor { editor, first_name, last_name, - upload, }); // Connect signals and callbacks @@ -104,7 +99,7 @@ impl PersonEditor { ); } - /// Save the person and possibly upload it to the server. + /// Save the person. async fn save(self: &Rc) -> Result { let first_name = self.first_name.get_text(); let last_name = self.last_name.get_text(); @@ -115,10 +110,6 @@ impl PersonEditor { last_name, }; - if self.upload.get_active() { - self.handle.backend.cl().post_person(&person).await?; - } - self.handle .backend .db() diff --git a/musicus/src/editors/recording.rs b/musicus/src/editors/recording.rs index 0d506fc..21bd47c 100644 --- a/musicus/src/editors/recording.rs +++ b/musicus/src/editors/recording.rs @@ -19,7 +19,6 @@ pub struct RecordingEditor { info_bar: gtk::InfoBar, work_row: adw::ActionRow, comment_entry: gtk::Entry, - upload_switch: gtk::Switch, performance_list: Rc, id: String, work: RefCell>, @@ -40,12 +39,9 @@ impl Screen, Recording> for RecordingEditor { get_widget!(builder, adw::ActionRow, work_row); get_widget!(builder, gtk::Button, work_button); get_widget!(builder, gtk::Entry, comment_entry); - get_widget!(builder, gtk::Switch, upload_switch); get_widget!(builder, gtk::Frame, performance_frame); get_widget!(builder, gtk::Button, add_performer_button); - upload_switch.set_active(handle.backend.use_server()); - let performance_list = List::new(); performance_frame.set_child(Some(&performance_list.widget)); @@ -64,7 +60,6 @@ impl Screen, Recording> for RecordingEditor { info_bar, work_row, comment_entry, - upload_switch, performance_list, id, work: RefCell::new(work), @@ -183,7 +178,7 @@ impl RecordingEditor { self.save_button.set_sensitive(true); } - /// Save the recording and possibly upload it to the server. + /// Save the recording. async fn save(self: &Rc) -> Result { let recording = Recording { id: self.id.clone(), @@ -196,11 +191,6 @@ impl RecordingEditor { performances: self.performances.borrow().clone(), }; - let upload = self.upload_switch.state(); - if upload { - self.handle.backend.cl().post_recording(&recording).await?; - } - self.handle .backend .db() diff --git a/musicus/src/editors/work.rs b/musicus/src/editors/work.rs index 0c0285b..0c87778 100644 --- a/musicus/src/editors/work.rs +++ b/musicus/src/editors/work.rs @@ -36,7 +36,6 @@ pub struct WorkEditor { title_entry: gtk::Entry, info_bar: gtk::InfoBar, composer_row: adw::ActionRow, - upload_switch: gtk::Switch, instrument_list: Rc, part_list: Rc, id: String, @@ -59,7 +58,6 @@ impl Screen, Work> for WorkEditor { get_widget!(builder, gtk::Entry, title_entry); get_widget!(builder, gtk::Button, composer_button); get_widget!(builder, adw::ActionRow, composer_row); - get_widget!(builder, gtk::Switch, upload_switch); get_widget!(builder, gtk::Frame, instrument_frame); get_widget!(builder, gtk::Button, add_instrument_button); get_widget!(builder, gtk::Frame, structure_frame); @@ -92,8 +90,6 @@ impl Screen, Work> for WorkEditor { None => (generate_id(), None, Vec::new(), Vec::new()), }; - upload_switch.set_active(handle.backend.use_server()); - let this = Rc::new(Self { handle, widget, @@ -102,7 +98,6 @@ impl Screen, Work> for WorkEditor { info_bar, title_entry, composer_row, - upload_switch, instrument_list, part_list, composer: RefCell::new(composer), @@ -317,7 +312,7 @@ impl WorkEditor { .set_sensitive(!self.title_entry.text().is_empty() && self.composer.borrow().is_some()); } - /// Save the work and possibly upload it to the server. + /// Save the work. async fn save(self: &Rc) -> Result { let mut section_count: usize = 0; let mut parts = Vec::new(); @@ -348,11 +343,6 @@ impl WorkEditor { sections, }; - let upload = self.upload_switch.state(); - if upload { - self.handle.backend.cl().post_work(&work).await?; - } - self.handle .backend .db() diff --git a/musicus/src/import/import_screen.rs b/musicus/src/import/import_screen.rs index c12782f..03c78f2 100644 --- a/musicus/src/import/import_screen.rs +++ b/musicus/src/import/import_screen.rs @@ -8,7 +8,6 @@ use glib::clone; use gtk_macros::get_widget; use musicus_backend::db::Medium; use musicus_backend::import::ImportSession; -use musicus_backend::Error; use std::rc::Rc; use std::sync::Arc; @@ -17,24 +16,19 @@ pub struct ImportScreen { handle: NavigationHandle<()>, session: Arc, widget: gtk::Box, - server_check_button: gtk::CheckButton, matching_stack: gtk::Stack, error_row: adw::ActionRow, matching_list: gtk::ListBox, } impl ImportScreen { - /// Find matching mediums on the server. + /// Find matching mediums in the library. fn load_matches(self: &Rc) { self.matching_stack.set_visible_child_name("loading"); let this = self; spawn!(@clone this, async move { - let mediums: Result, Error> = if this.server_check_button.is_active() { - this.handle.backend.cl().get_mediums_by_discid(this.session.source_id()).await.map_err(|err| err.into()) - } else { - this.handle.backend.db().get_mediums_by_source_id(this.session.source_id()).await.map_err(|err| err.into()) - }; + let mediums = this.handle.backend.db().get_mediums_by_source_id(this.session.source_id()).await; match mediums { Ok(mediums) => { @@ -113,18 +107,14 @@ impl Screen, ()> for ImportScreen { get_widget!(builder, gtk::Stack, matching_stack); get_widget!(builder, gtk::Button, try_again_button); get_widget!(builder, adw::ActionRow, error_row); - get_widget!(builder, gtk::CheckButton, server_check_button); get_widget!(builder, gtk::ListBox, matching_list); get_widget!(builder, gtk::Button, select_button); get_widget!(builder, gtk::Button, add_button); - server_check_button.set_active(handle.backend.use_server()); - let this = Rc::new(Self { handle, session, widget, - server_check_button, matching_stack, error_row, matching_list, @@ -136,12 +126,6 @@ impl Screen, ()> for ImportScreen { this.handle.pop(None); })); - this.server_check_button - .connect_toggled(clone!(@weak this => move |_| { - this.handle.backend.set_use_server(this.server_check_button.is_active()); - this.load_matches(); - })); - try_again_button.connect_clicked(clone!(@weak this => move |_| { this.load_matches(); })); diff --git a/musicus/src/import/medium_editor.rs b/musicus/src/import/medium_editor.rs index c48f4a2..b5349ae 100644 --- a/musicus/src/import/medium_editor.rs +++ b/musicus/src/import/medium_editor.rs @@ -18,7 +18,6 @@ pub struct MediumEditor { widget: gtk::Stack, done_button: gtk::Button, name_entry: gtk::Entry, - publish_switch: gtk::Switch, status_page: adw::StatusPage, track_set_list: Rc, track_sets: RefCell>, @@ -38,15 +37,12 @@ impl Screen<(Arc, Option), Medium> for MediumEditor { get_widget!(builder, gtk::Button, back_button); get_widget!(builder, gtk::Button, done_button); get_widget!(builder, gtk::Entry, name_entry); - get_widget!(builder, gtk::Switch, publish_switch); get_widget!(builder, gtk::Button, add_button); get_widget!(builder, gtk::Frame, frame); get_widget!(builder, adw::StatusPage, status_page); get_widget!(builder, gtk::Button, try_again_button); get_widget!(builder, gtk::Button, cancel_button); - publish_switch.set_active(handle.backend.use_server()); - let list = List::new(); frame.set_child(Some(&list.widget)); @@ -56,7 +52,6 @@ impl Screen<(Arc, Option), Medium> for MediumEditor { widget, done_button, name_entry, - publish_switch, status_page, track_set_list: list, track_sets: RefCell::new(Vec::new()), @@ -100,11 +95,6 @@ impl Screen<(Arc, Option), Medium> for MediumEditor { }); })); - this.publish_switch - .connect_state_notify(clone!(@weak this => move |_| { - this.handle.backend.set_use_server(this.publish_switch.state()); - })); - this.track_set_list.set_make_widget_cb( clone!(@weak this => @default-panic, move |index| { let track_set = &this.track_sets.borrow()[index]; @@ -188,7 +178,7 @@ impl MediumEditor { ); } - /// Create the medium and, if necessary, upload it to the server. + /// Create the medium. async fn save(&self) -> Result { // Convert the track set data to real track sets. @@ -214,11 +204,6 @@ impl MediumEditor { tracks, }; - let upload = self.publish_switch.state(); - if upload { - self.handle.backend.cl().post_medium(&medium).await?; - } - // The medium is not added to the database, because the track paths are not known until the // medium is actually imported into the music library. This step will be handled by the // medium preview dialog. diff --git a/musicus/src/navigator/window.rs b/musicus/src/navigator/window.rs index 39a2cfa..83a13ce 100644 --- a/musicus/src/navigator/window.rs +++ b/musicus/src/navigator/window.rs @@ -29,10 +29,4 @@ impl NavigatorWindow { this } - - /// Make the wrapped window transient. This will make the window modal. - pub fn set_transient_for>(&self, window: &W) { - self.window.set_modal(true); - self.window.set_transient_for(Some(window)); - } } diff --git a/musicus/src/preferences/mod.rs b/musicus/src/preferences.rs similarity index 59% rename from musicus/src/preferences/mod.rs rename to musicus/src/preferences.rs index 98524b4..6e62b89 100644 --- a/musicus/src/preferences/mod.rs +++ b/musicus/src/preferences.rs @@ -1,4 +1,3 @@ -use crate::navigator::NavigatorWindow; use adw::prelude::*; use gettextrs::gettext; use glib::clone; @@ -6,21 +5,11 @@ use gtk_macros::get_widget; use musicus_backend::Backend; use std::rc::Rc; -mod login; -use login::LoginDialog; - -mod server; -use server::ServerDialog; - -mod register; - /// A dialog for configuring the app. pub struct Preferences { backend: Rc, window: adw::Window, music_library_path_row: adw::ActionRow, - url_row: adw::ActionRow, - login_row: adw::ActionRow, } impl Preferences { @@ -32,10 +21,6 @@ impl Preferences { get_widget!(builder, adw::Window, window); get_widget!(builder, adw::ActionRow, music_library_path_row); get_widget!(builder, gtk::Button, select_music_library_path_button); - get_widget!(builder, adw::ActionRow, url_row); - get_widget!(builder, gtk::Button, url_button); - get_widget!(builder, adw::ActionRow, login_row); - get_widget!(builder, gtk::Button, login_button); window.set_transient_for(Some(parent)); @@ -43,8 +28,6 @@ impl Preferences { backend, window, music_library_path_row, - url_row, - login_row, }); // Connect signals and callbacks @@ -80,31 +63,6 @@ impl Preferences { dialog.show(); })); - url_button.connect_clicked(clone!(@strong this => move |_| { - let dialog = ServerDialog::new(this.backend.clone(), &this.window); - - dialog.set_selected_cb(clone!(@strong this => move |url| { - this.url_row.set_subtitle(&url); - })); - - dialog.show(); - })); - - login_button.connect_clicked(clone!(@strong this => move |_| { - let window = NavigatorWindow::new(this.backend.clone()); - window.set_transient_for(&this.window); - - spawn!(@clone this, async move { - if let Some(data) = replace!(window.navigator, LoginDialog, this.backend.get_login_data()).await { - if let Some(data) = data { - this.login_row.set_subtitle(&data.username); - } else { - this.login_row.set_subtitle(&gettext("Not logged in")); - } - } - }); - })); - // Initialize if let Some(path) = this.backend.get_music_library_path() { @@ -112,14 +70,6 @@ impl Preferences { .set_subtitle(path.to_str().unwrap()); } - if let Some(url) = this.backend.get_server_url() { - this.url_row.set_subtitle(&url); - } - - if let Some(data) = this.backend.get_login_data() { - this.login_row.set_subtitle(&data.username); - } - this } diff --git a/musicus/src/preferences/login.rs b/musicus/src/preferences/login.rs deleted file mode 100644 index c73a8c6..0000000 --- a/musicus/src/preferences/login.rs +++ /dev/null @@ -1,98 +0,0 @@ -use super::register::RegisterDialog; -use crate::navigator::{NavigationHandle, Screen}; -use crate::push; -use crate::widgets::Widget; -use glib::clone; -use gtk::prelude::*; -use gtk_macros::get_widget; -use musicus_backend::client::LoginData; -use std::rc::Rc; - -/// A dialog for entering login credentials. -pub struct LoginDialog { - handle: NavigationHandle>, - widget: gtk::Stack, - info_bar: gtk::InfoBar, - username_entry: gtk::Entry, - password_entry: gtk::Entry, -} - -impl Screen, Option> for LoginDialog { - fn new(data: Option, handle: NavigationHandle>) -> Rc { - // Create UI - let builder = gtk::Builder::from_resource("/de/johrpan/musicus/ui/login_dialog.ui"); - - get_widget!(builder, gtk::Stack, widget); - get_widget!(builder, gtk::InfoBar, info_bar); - get_widget!(builder, gtk::Button, cancel_button); - get_widget!(builder, gtk::Button, login_button); - get_widget!(builder, gtk::Entry, username_entry); - get_widget!(builder, gtk::Entry, password_entry); - get_widget!(builder, gtk::Box, register_box); - get_widget!(builder, gtk::Button, register_button); - get_widget!(builder, gtk::Box, logout_box); - get_widget!(builder, gtk::Button, logout_button); - - if let Some(data) = data { - username_entry.set_text(&data.username); - register_box.hide(); - logout_box.show(); - } - - let this = Rc::new(Self { - handle, - widget, - info_bar, - username_entry, - password_entry, - }); - - // Connect signals and callbacks - - cancel_button.connect_clicked(clone!(@weak this => move |_| { - this.handle.pop(None); - })); - - login_button.connect_clicked(clone!(@weak this => move |_| { - this.widget.set_visible_child_name("loading"); - - let data = LoginData { - username: this.username_entry.text().to_string(), - password: this.password_entry.text().to_string(), - }; - - spawn!(@clone this, async move { - this.handle.backend.set_login_data(Some(data.clone())).await; - if this.handle.backend.cl().login().await.unwrap() { - this.handle.pop(Some(Some(data))); - } else { - this.widget.set_visible_child_name("content"); - this.info_bar.set_revealed(true); - } - }); - })); - - register_button.connect_clicked(clone!(@weak this => move |_| { - spawn!(@clone this, async move { - if let Some(data) = push!(this.handle, RegisterDialog).await { - this.handle.pop(Some(Some(data))); - } - }); - })); - - logout_button.connect_clicked(clone!(@weak this => move |_| { - spawn!(@clone this, async move { - this.handle.backend.set_login_data(None).await; - this.handle.pop(Some(None)); - }); - })); - - this - } -} - -impl Widget for LoginDialog { - fn get_widget(&self) -> gtk::Widget { - self.widget.clone().upcast() - } -} diff --git a/musicus/src/preferences/register.rs b/musicus/src/preferences/register.rs deleted file mode 100644 index ef8fcdc..0000000 --- a/musicus/src/preferences/register.rs +++ /dev/null @@ -1,118 +0,0 @@ -use crate::navigator::{NavigationHandle, Screen}; -use crate::widgets::Widget; -use adw::prelude::*; -use glib::clone; -use gtk_macros::get_widget; -use musicus_backend::client::{LoginData, UserRegistration}; -use std::cell::RefCell; -use std::rc::Rc; - -/// A dialog for creating a new user account. -pub struct RegisterDialog { - handle: NavigationHandle, - widget: gtk::Stack, - username_entry: gtk::Entry, - email_entry: gtk::Entry, - password_entry: gtk::Entry, - repeat_password_entry: gtk::Entry, - captcha_row: adw::ActionRow, - captcha_entry: gtk::Entry, - captcha_id: RefCell>, -} - -impl Screen<(), LoginData> for RegisterDialog { - /// Create a new register dialog. - fn new(_: (), handle: NavigationHandle) -> Rc { - // Create UI - let builder = gtk::Builder::from_resource("/de/johrpan/musicus/ui/register_dialog.ui"); - - get_widget!(builder, gtk::Stack, widget); - get_widget!(builder, gtk::Button, cancel_button); - get_widget!(builder, gtk::Button, register_button); - get_widget!(builder, gtk::Entry, username_entry); - get_widget!(builder, gtk::Entry, email_entry); - get_widget!(builder, gtk::Entry, password_entry); - get_widget!(builder, gtk::Entry, repeat_password_entry); - get_widget!(builder, adw::ActionRow, captcha_row); - get_widget!(builder, gtk::Entry, captcha_entry); - - let this = Rc::new(Self { - handle, - widget, - username_entry, - email_entry, - password_entry, - repeat_password_entry, - captcha_row, - captcha_entry, - captcha_id: RefCell::new(None), - }); - - // Connect signals and callbacks - - cancel_button.connect_clicked(clone!(@weak this => move |_| { - this.handle.pop(None); - })); - - register_button.connect_clicked(clone!(@weak this => move |_| { - let password = this.password_entry.text().to_string(); - let repeat = this.repeat_password_entry.text().to_string(); - - if password != repeat { - // TODO: Show error and validate other input. - } else { - this.widget.set_visible_child_name("loading"); - - spawn!(@clone this, async move { - let username = this.username_entry.text().to_string(); - let email = this.email_entry.text().to_string(); - let captcha_id = this.captcha_id.borrow().clone().unwrap(); - let answer = this.captcha_entry.text().to_string(); - - let email = if email.is_empty() { - None - } else { - Some(email) - }; - - let registration = UserRegistration { - username: username.clone(), - password: password.clone(), - email, - captcha_id, - answer, - }; - - // TODO: Handle errors. - if this.handle.backend.cl().register(registration).await.unwrap() { - let data = LoginData { - username, - password, - }; - - this.handle.pop(Some(data)); - } else { - this.widget.set_visible_child_name("content"); - } - }); - } - })); - - // Initialize - - spawn!(@clone this, async move { - let captcha = this.handle.backend.cl().get_captcha().await.unwrap(); - this.captcha_row.set_title(&captcha.question); - this.captcha_id.replace(Some(captcha.id)); - this.widget.set_visible_child_name("content"); - }); - - this - } -} - -impl Widget for RegisterDialog { - fn get_widget(&self) -> gtk::Widget { - self.widget.clone().upcast() - } -} diff --git a/musicus/src/preferences/server.rs b/musicus/src/preferences/server.rs deleted file mode 100644 index fa36c71..0000000 --- a/musicus/src/preferences/server.rs +++ /dev/null @@ -1,65 +0,0 @@ -use glib::clone; -use gtk::prelude::*; -use gtk_macros::get_widget; -use musicus_backend::Backend; -use std::cell::RefCell; -use std::rc::Rc; - -/// A dialog for setting up the server. -pub struct ServerDialog { - backend: Rc, - window: adw::Window, - url_entry: gtk::Entry, - selected_cb: RefCell>>, -} - -impl ServerDialog { - /// Create a new server dialog. - pub fn new>(backend: Rc, parent: &P) -> Rc { - // Create UI - let builder = gtk::Builder::from_resource("/de/johrpan/musicus/ui/server_dialog.ui"); - - get_widget!(builder, adw::Window, window); - get_widget!(builder, gtk::Button, cancel_button); - get_widget!(builder, gtk::Button, set_button); - get_widget!(builder, gtk::Entry, url_entry); - - window.set_transient_for(Some(parent)); - - let this = Rc::new(Self { - backend, - window, - url_entry, - selected_cb: RefCell::new(None), - }); - - // Connect signals and callbacks - - cancel_button.connect_clicked(clone!(@strong this => move |_| { - this.window.close(); - })); - - set_button.connect_clicked(clone!(@strong this => move |_| { - let url = this.url_entry.text().to_string(); - this.backend.set_server_url(&url); - - if let Some(cb) = &*this.selected_cb.borrow() { - cb(url); - } - - this.window.close(); - })); - - this - } - - /// The closure to call when the server was set. - pub fn set_selected_cb(&self, cb: F) { - self.selected_cb.replace(Some(Box::new(cb))); - } - - /// Show the server dialog. - pub fn show(&self) { - self.window.show(); - } -} diff --git a/musicus/src/selectors/ensemble.rs b/musicus/src/selectors/ensemble.rs index 1ca37b6..5692c9a 100644 --- a/musicus/src/selectors/ensemble.rs +++ b/musicus/src/selectors/ensemble.rs @@ -19,7 +19,7 @@ impl Screen<(), Ensemble> for EnsembleSelector { fn new(_: (), handle: NavigationHandle) -> Rc { // Create UI - let selector = Selector::::new(Rc::clone(&handle.backend)); + let selector = Selector::::new(); selector.set_title(&gettext("Select ensemble")); let this = Rc::new(Self { handle, selector }); @@ -38,12 +38,6 @@ impl Screen<(), Ensemble> for EnsembleSelector { }); })); - this.selector - .set_load_online(clone!(@weak this => @default-panic, move || { - let clone = this; - async move { Ok(clone.handle.backend.cl().get_ensembles().await?) } - })); - this.selector .set_load_local(clone!(@weak this => @default-panic, move || { let clone = this; diff --git a/musicus/src/selectors/instrument.rs b/musicus/src/selectors/instrument.rs index 20e054c..54a5c83 100644 --- a/musicus/src/selectors/instrument.rs +++ b/musicus/src/selectors/instrument.rs @@ -19,7 +19,7 @@ impl Screen<(), Instrument> for InstrumentSelector { fn new(_: (), handle: NavigationHandle) -> Rc { // Create UI - let selector = Selector::::new(Rc::clone(&handle.backend)); + let selector = Selector::::new(); selector.set_title(&gettext("Select instrument")); let this = Rc::new(Self { handle, selector }); @@ -38,12 +38,6 @@ impl Screen<(), Instrument> for InstrumentSelector { }); })); - this.selector - .set_load_online(clone!(@weak this => @default-panic, move || { - let clone = this; - async move { Ok(clone.handle.backend.cl().get_instruments().await?) } - })); - this.selector .set_load_local(clone!(@weak this => @default-panic, move || { let clone = this; diff --git a/musicus/src/selectors/medium.rs b/musicus/src/selectors/medium.rs index 55469b6..29398e3 100644 --- a/musicus/src/selectors/medium.rs +++ b/musicus/src/selectors/medium.rs @@ -17,7 +17,7 @@ impl Screen<(), Medium> for MediumSelector { fn new(_: (), handle: NavigationHandle) -> Rc { // Create UI - let selector = Selector::::new(Rc::clone(&handle.backend)); + let selector = Selector::::new(); selector.set_title(&gettext("Select performer")); let this = Rc::new(Self { handle, selector }); @@ -28,26 +28,6 @@ impl Screen<(), Medium> for MediumSelector { this.handle.pop(None); })); - this.selector - .set_load_online(clone!(@weak this => @default-panic, move || { - async move { - let mut poes = Vec::new(); - - let persons = this.handle.backend.cl().get_persons().await?; - let ensembles = this.handle.backend.cl().get_ensembles().await?; - - for person in persons { - poes.push(PersonOrEnsemble::Person(person)); - } - - for ensemble in ensembles { - poes.push(PersonOrEnsemble::Ensemble(ensemble)); - } - - Ok(poes) - } - })); - this.selector .set_load_local(clone!(@weak this => @default-panic, move || { async move { @@ -109,7 +89,7 @@ struct MediumSelectorMediumScreen { impl Screen for MediumSelectorMediumScreen { fn new(poe: PersonOrEnsemble, handle: NavigationHandle) -> Rc { - let selector = Selector::::new(Rc::clone(&handle.backend)); + let selector = Selector::::new(); selector.set_title(&gettext("Select medium")); selector.set_subtitle(&poe.get_title()); diff --git a/musicus/src/selectors/person.rs b/musicus/src/selectors/person.rs index 14676d5..96810c2 100644 --- a/musicus/src/selectors/person.rs +++ b/musicus/src/selectors/person.rs @@ -19,7 +19,7 @@ impl Screen<(), Person> for PersonSelector { fn new(_: (), handle: NavigationHandle) -> Rc { // Create UI - let selector = Selector::::new(Rc::clone(&handle.backend)); + let selector = Selector::::new(); selector.set_title(&gettext("Select person")); let this = Rc::new(Self { handle, selector }); @@ -38,12 +38,6 @@ impl Screen<(), Person> for PersonSelector { }); })); - this.selector - .set_load_online(clone!(@weak this => @default-panic, move || { - let clone = this; - async move { Ok(clone.handle.backend.cl().get_persons().await?) } - })); - this.selector .set_load_local(clone!(@weak this => @default-panic, move || { let clone = this; diff --git a/musicus/src/selectors/recording.rs b/musicus/src/selectors/recording.rs index 3fe17a2..2e78688 100644 --- a/musicus/src/selectors/recording.rs +++ b/musicus/src/selectors/recording.rs @@ -18,7 +18,7 @@ impl Screen<(), Recording> for RecordingSelector { fn new(_: (), handle: NavigationHandle) -> Rc { // Create UI - let selector = Selector::::new(Rc::clone(&handle.backend)); + let selector = Selector::::new(); selector.set_title(&gettext("Select composer")); let this = Rc::new(Self { handle, selector }); @@ -50,11 +50,6 @@ impl Screen<(), Recording> for RecordingSelector { }); })); - this.selector - .set_load_online(clone!(@weak this => @default-panic, move || { - async move { Ok(this.handle.backend.cl().get_persons().await?) } - })); - this.selector .set_load_local(clone!(@weak this => @default-panic, move || { async move { this.handle.backend.db().get_persons().await.unwrap() } @@ -108,7 +103,7 @@ struct RecordingSelectorWorkScreen { impl Screen for RecordingSelectorWorkScreen { fn new(person: Person, handle: NavigationHandle) -> Rc { - let selector = Selector::::new(Rc::clone(&handle.backend)); + let selector = Selector::::new(); selector.set_title(&gettext("Select work")); selector.set_subtitle(&person.name_fl()); @@ -131,11 +126,6 @@ impl Screen for RecordingSelectorWorkScreen { }); })); - this.selector - .set_load_online(clone!(@weak this => @default-panic, move || { - async move { Ok(this.handle.backend.cl().get_works(&this.person.id).await?) } - })); - this.selector .set_load_local(clone!(@weak this => @default-panic, move || { async move { this.handle.backend.db().get_works(&this.person.id).await.unwrap() } @@ -178,7 +168,7 @@ struct RecordingSelectorRecordingScreen { impl Screen for RecordingSelectorRecordingScreen { fn new(work: Work, handle: NavigationHandle) -> Rc { - let selector = Selector::::new(Rc::clone(&handle.backend)); + let selector = Selector::::new(); selector.set_title(&gettext("Select recording")); selector.set_subtitle(&work.get_title()); @@ -201,10 +191,6 @@ impl Screen for RecordingSelectorRecordingScreen { }); })); - this.selector.set_load_online(clone!(@weak this => @default-panic, move || { - async move { Ok(this.handle.backend.cl().get_recordings_for_work(&this.work.id).await?) } - })); - this.selector.set_load_local(clone!(@weak this => @default-panic, move || { async move { this.handle.backend.db().get_recordings_for_work(&this.work.id).await.unwrap() } })); diff --git a/musicus/src/selectors/selector.rs b/musicus/src/selectors/selector.rs index 26089e0..53b6399 100644 --- a/musicus/src/selectors/selector.rs +++ b/musicus/src/selectors/selector.rs @@ -2,36 +2,30 @@ use crate::widgets::List; use glib::clone; use gtk::prelude::*; use gtk_macros::get_widget; -use musicus_backend::{Backend, Result}; use std::cell::RefCell; use std::future::Future; use std::pin::Pin; use std::rc::Rc; -/// A screen that presents a list of items. It allows to switch between the server and the local -/// database and to search within the list. +/// A screen that presents a list of items from the library. pub struct Selector { pub widget: gtk::Box, - backend: Rc, title_label: gtk::Label, subtitle_label: gtk::Label, search_entry: gtk::SearchEntry, - server_check_button: gtk::CheckButton, stack: gtk::Stack, list: Rc, items: RefCell>, back_cb: RefCell>>, add_cb: RefCell>>, make_widget: RefCell gtk::Widget>>>, - load_online: RefCell Box>>>>>>, load_local: RefCell Box>>>>>, filter: RefCell bool>>>, } impl Selector { - /// Create a new selector. `use_server` is used to decide whether to search - /// online initially. - pub fn new(backend: Rc) -> Rc { + /// Create a new selector. + pub fn new() -> Rc { // Create UI let builder = gtk::Builder::from_resource("/de/johrpan/musicus/ui/selector.ui"); @@ -42,28 +36,23 @@ impl Selector { get_widget!(builder, gtk::Button, back_button); get_widget!(builder, gtk::Button, add_button); get_widget!(builder, gtk::SearchEntry, search_entry); - get_widget!(builder, gtk::CheckButton, server_check_button); get_widget!(builder, gtk::Stack, stack); get_widget!(builder, gtk::Frame, frame); - get_widget!(builder, gtk::Button, try_again_button); let list = List::new(); frame.set_child(Some(&list.widget)); let this = Rc::new(Self { widget, - backend, title_label, subtitle_label, search_entry, - server_check_button, stack, list, items: RefCell::new(Vec::new()), back_cb: RefCell::new(None), add_cb: RefCell::new(None), make_widget: RefCell::new(None), - load_online: RefCell::new(None), load_local: RefCell::new(None), filter: RefCell::new(None), }); @@ -87,18 +76,6 @@ impl Selector { this.list.invalidate_filter(); })); - this.server_check_button - .connect_toggled(clone!(@strong this => move |_| { - let active = this.server_check_button.is_active(); - this.backend.set_use_server(active); - - if active { - this.clone().load_online(); - } else { - this.clone().load_local(); - } - })); - this.list .set_make_widget_cb(clone!(@strong this => move |index| { if let Some(cb) = &*this.make_widget.borrow() { @@ -121,16 +98,8 @@ impl Selector { } })); - try_again_button.connect_clicked(clone!(@strong this => move |_| { - this.clone().load_online(); - })); - // Initialize - if this.backend.use_server() { - this.clone().load_online(); - } else { - this.server_check_button.set_active(false); - } + this.clone().load_local(); this } @@ -156,17 +125,6 @@ impl Selector { self.add_cb.replace(Some(Box::new(cb))); } - /// Set the async closure to be called to fetch items from the server. If that results in an - /// error, an error screen is shown allowing to try again. - pub fn set_load_online(&self, cb: F) - where - F: (Fn() -> R) + 'static, - R: Future>> + 'static, - { - self.load_online - .replace(Some(Box::new(move || Box::new(cb())))); - } - /// Set the async closure to be called to get local items. pub fn set_load_local(&self, cb: F) where @@ -188,26 +146,6 @@ impl Selector { self.filter.replace(Some(Box::new(filter))); } - fn load_online(self: Rc) { - let context = glib::MainContext::default(); - let clone = self.clone(); - context.spawn_local(async move { - if let Some(cb) = &*self.load_online.borrow() { - self.stack.set_visible_child_name("loading"); - - match Pin::from(cb()).await { - Ok(items) => { - clone.show_items(items); - } - Err(_) => { - clone.show_items(Vec::new()); - clone.stack.set_visible_child_name("error"); - } - } - } - }); - } - fn load_local(self: Rc) { let context = glib::MainContext::default(); let clone = self.clone(); diff --git a/musicus/src/selectors/work.rs b/musicus/src/selectors/work.rs index 7fbd13e..67cf2d0 100644 --- a/musicus/src/selectors/work.rs +++ b/musicus/src/selectors/work.rs @@ -18,7 +18,7 @@ impl Screen<(), Work> for WorkSelector { fn new(_: (), handle: NavigationHandle) -> Rc { // Create UI - let selector = Selector::::new(Rc::clone(&handle.backend)); + let selector = Selector::::new(); selector.set_title(&gettext("Select composer")); let this = Rc::new(Self { handle, selector }); @@ -44,11 +44,6 @@ impl Screen<(), Work> for WorkSelector { }); })); - this.selector - .set_load_online(clone!(@weak this => @default-panic, move || { - async move { Ok(this.handle.backend.cl().get_persons().await?) } - })); - this.selector .set_load_local(clone!(@weak this => @default-panic, move || { async move { this.handle.backend.db().get_persons().await.unwrap() } @@ -98,7 +93,7 @@ struct WorkSelectorWorkScreen { impl Screen for WorkSelectorWorkScreen { fn new(person: Person, handle: NavigationHandle) -> Rc { - let selector = Selector::::new(Rc::clone(&handle.backend)); + let selector = Selector::::new(); selector.set_title(&gettext("Select work")); selector.set_subtitle(&person.name_fl()); @@ -121,11 +116,6 @@ impl Screen for WorkSelectorWorkScreen { }); })); - this.selector - .set_load_online(clone!(@weak this => @default-panic, move || { - async move { Ok(this.handle.backend.cl().get_works(&this.person.id).await?) } - })); - this.selector .set_load_local(clone!(@weak this => @default-panic, move || { async move { this.handle.backend.db().get_works(&this.person.id).await.unwrap() } diff --git a/musicus/src/widgets/mod.rs b/musicus/src/widgets/mod.rs index 07cd38a..c23c8ad 100644 --- a/musicus/src/widgets/mod.rs +++ b/musicus/src/widgets/mod.rs @@ -21,9 +21,6 @@ pub use screen::*; pub mod section; pub use section::*; -pub mod upload_section; -pub use upload_section::*; - mod indexed_list_model; /// Something that can be represented as a GTK widget. diff --git a/musicus/src/widgets/upload_section.rs b/musicus/src/widgets/upload_section.rs deleted file mode 100644 index f5d2362..0000000 --- a/musicus/src/widgets/upload_section.rs +++ /dev/null @@ -1,60 +0,0 @@ -use super::Section; -use adw::prelude::*; -use gettextrs::gettext; -use glib::clone; -use musicus_backend::Backend; -use std::rc::Rc; - -/// A section showing a switch to enable uploading an item. -pub struct UploadSection { - /// The GTK widget of the wrapped section. - pub widget: gtk::Box, - - backend: Rc, - - /// The upload switch. - switch: gtk::Switch, -} - -impl UploadSection { - /// Create a new upload section which will be initially switched on. - pub fn new(backend: Rc) -> Rc { - let list = gtk::ListBoxBuilder::new() - .selection_mode(gtk::SelectionMode::None) - .build(); - - let switch = gtk::SwitchBuilder::new() - .active(backend.use_server()) - .valign(gtk::Align::Center) - .build(); - - let row = adw::ActionRowBuilder::new() - .focusable(false) - .title("Upload changes to the server") - .activatable_widget(&switch) - .build(); - - row.add_suffix(&switch); - list.append(&row); - - let section = Section::new(&gettext("Upload"), &list); - - let this = Rc::new(Self { - widget: section.widget, - backend, - switch, - }); - - this.switch - .connect_state_notify(clone!(@weak this => move |_| { - this.backend.set_use_server(this.switch.state()); - })); - - this - } - - /// Return whether the user has enabled the upload switch. - pub fn get_active(&self) -> bool { - self.switch.state() - } -}