Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package ncspot for openSUSE:Factory checked 
in at 2022-10-17 14:58:32
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ncspot (Old)
 and      /work/SRC/openSUSE:Factory/.ncspot.new.2275 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ncspot"

Mon Oct 17 14:58:32 2022 rev:8 rq:1012063 version:0.11.2

Changes:
--------
--- /work/SRC/openSUSE:Factory/ncspot/ncspot.changes    2022-09-18 
18:48:48.702513158 +0200
+++ /work/SRC/openSUSE:Factory/.ncspot.new.2275/ncspot.changes  2022-10-17 
14:58:33.738192133 +0200
@@ -1,0 +2,11 @@
+Mon Oct 17 10:36:29 UTC 2022 - Jan-Luca Kiok <[email protected]>
+
+- Update to version 0.11.2
+  Maintenance
+  * Cleanup: Remove PlayTrackMenu
+  * Fix: Crash on liked artist but no liked music
+  Features
+  * Improve context menus to make the UX/UI more consistent
+  * Exit gracefully on SIGTERM and SIGHUP
+
+-------------------------------------------------------------------

Old:
----
  ncspot-0.11.1.tar.gz

New:
----
  ncspot-0.11.2.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ ncspot.spec ++++++
--- /var/tmp/diff_new_pack.A7R7jn/_old  2022-10-17 14:58:35.214194969 +0200
+++ /var/tmp/diff_new_pack.A7R7jn/_new  2022-10-17 14:58:35.218194977 +0200
@@ -18,7 +18,7 @@
 
 
 Name:           ncspot
-Version:        0.11.1
+Version:        0.11.2
 Release:        0
 Summary:        Ncurses Spotify client
 License:        BSD-2-Clause

++++++ _service ++++++
--- /var/tmp/diff_new_pack.A7R7jn/_old  2022-10-17 14:58:35.246195030 +0200
+++ /var/tmp/diff_new_pack.A7R7jn/_new  2022-10-17 14:58:35.250195038 +0200
@@ -1,6 +1,6 @@
 <services>
   <service name="cargo_vendor" mode="disabled">
-    <param name="srcdir">ncspot-0.11.1</param>
+    <param name="srcdir">ncspot-0.11.2</param>
   </service>
 </services>
 

++++++ ncspot-0.11.1.tar.gz -> ncspot-0.11.2.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ncspot-0.11.1/Cargo.lock new/ncspot-0.11.2/Cargo.lock
--- old/ncspot-0.11.1/Cargo.lock        2022-09-17 14:27:18.000000000 +0200
+++ new/ncspot-0.11.2/Cargo.lock        2022-10-15 12:48:44.000000000 +0200
@@ -298,9 +298,9 @@
 
 [[package]]
 name = "clang-sys"
-version = "1.3.3"
+version = "1.4.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "5a050e2153c5be08febd6734e29298e844fdb0fa21aeddd63b4eb7baa106c69b"
+checksum = "fa2e27ae6ab525c3d369ded447057bca5438d86dc3a68f6faafb8269ba82ebf3"
 dependencies = [
  "glob",
  "libc",
@@ -309,24 +309,22 @@
 
 [[package]]
 name = "clap"
-version = "3.2.22"
+version = "4.0.15"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "86447ad904c7fb335a790c9d7fe3d0d971dc523b8ccd1561a520de9a85302750"
+checksum = "6bf8832993da70a4c6d13c581f4463c2bdda27b9bf1c5498dc4365543abe6d6f"
 dependencies = [
  "atty",
  "bitflags",
  "clap_lex",
- "indexmap",
  "strsim",
  "termcolor",
- "textwrap",
 ]
 
 [[package]]
 name = "clap_lex"
-version = "0.2.4"
+version = "0.3.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5"
+checksum = "0d4198f73e42b4936b35b5bb248d81d2b595ecb170da0bac7655c54eedfa8da8"
 dependencies = [
  "os_str_bytes",
 ]
@@ -354,6 +352,16 @@
 ]
 
 [[package]]
+name = "codespan-reporting"
+version = "0.11.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e"
+dependencies = [
+ "termcolor",
+ "unicode-width",
+]
+
+[[package]]
 name = "combine"
 version = "4.6.6"
 source = "registry+https://github.com/rust-lang/crates.io-index";
@@ -364,19 +372,13 @@
 ]
 
 [[package]]
-name = "convert_case"
-version = "0.4.0"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e"
-
-[[package]]
 name = "cookie"
-version = "0.16.0"
+version = "0.16.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "94d4706de1b0fa5b132270cddffa8585166037822e260a944fe161acd137ca05"
+checksum = "344adc371239ef32293cb1c4fe519592fcf21206c79c02854320afcdf3ab4917"
 dependencies = [
  "percent-encoding",
- "time 0.3.14",
+ "time 0.3.15",
  "version_check",
 ]
 
@@ -393,7 +395,7 @@
  "publicsuffix",
  "serde",
  "serde_json",
- "time 0.3.14",
+ "time 0.3.15",
  "url",
 ]
 
@@ -478,12 +480,11 @@
 
 [[package]]
 name = "crossbeam-utils"
-version = "0.8.11"
+version = "0.8.12"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "51887d4adc7b564537b15adcfb307936f8075dfcd5f00dde9a9f1d29383682bc"
+checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac"
 dependencies = [
  "cfg-if",
- "once_cell",
 ]
 
 [[package]]
@@ -565,20 +566,74 @@
  "log",
  "num 0.4.0",
  "owning_ref",
- "time 0.3.14",
+ "time 0.3.15",
  "unicode-segmentation",
  "unicode-width",
  "xi-unicode",
 ]
 
 [[package]]
+name = "cxx"
+version = "1.0.78"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "19f39818dcfc97d45b03953c1292efc4e80954e1583c4aa770bac1383e2310a4"
+dependencies = [
+ "cc",
+ "cxxbridge-flags",
+ "cxxbridge-macro",
+ "link-cplusplus",
+]
+
+[[package]]
+name = "cxx-build"
+version = "1.0.78"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "3e580d70777c116df50c390d1211993f62d40302881e54d4b79727acb83d0199"
+dependencies = [
+ "cc",
+ "codespan-reporting",
+ "once_cell",
+ "proc-macro2",
+ "quote",
+ "scratch",
+ "syn",
+]
+
+[[package]]
+name = "cxxbridge-flags"
+version = "1.0.78"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "56a46460b88d1cec95112c8c363f0e2c39afdb237f60583b0b36343bf627ea9c"
+
+[[package]]
+name = "cxxbridge-macro"
+version = "1.0.78"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "747b608fecf06b0d72d440f27acc99288207324b793be2c17991839f3d4995ea"
+dependencies = [
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
 name = "darling"
 version = "0.13.4"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "a01d95850c592940db9b8194bc39f4bc0e89dee5c4265e4b1807c34a9aba453c"
 dependencies = [
- "darling_core",
- "darling_macro",
+ "darling_core 0.13.4",
+ "darling_macro 0.13.4",
+]
+
+[[package]]
+name = "darling"
+version = "0.14.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "4529658bdda7fd6769b8614be250cdcfc3aeb0ee72fe66f9e41e5e5eb73eac02"
+dependencies = [
+ "darling_core 0.14.1",
+ "darling_macro 0.14.1",
 ]
 
 [[package]]
@@ -596,12 +651,36 @@
 ]
 
 [[package]]
+name = "darling_core"
+version = "0.14.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "649c91bc01e8b1eac09fb91e8dbc7d517684ca6be8ebc75bb9cafc894f9fdb6f"
+dependencies = [
+ "fnv",
+ "ident_case",
+ "proc-macro2",
+ "quote",
+ "syn",
+]
+
+[[package]]
 name = "darling_macro"
 version = "0.13.4"
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "9c972679f83bdf9c42bd905396b6c3588a843a17f0f16dfcfa3e2c5d57441835"
 dependencies = [
- "darling_core",
+ "darling_core 0.13.4",
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "darling_macro"
+version = "0.14.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "ddfc69c5bfcbd2fc09a0f38451d2daf0e372e367986a83906d1b0dbc88134fb5"
+dependencies = [
+ "darling_core 0.14.1",
  "quote",
  "syn",
 ]
@@ -638,19 +717,6 @@
 ]
 
 [[package]]
-name = "derive_more"
-version = "0.99.17"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321"
-dependencies = [
- "convert_case",
- "proc-macro2",
- "quote",
- "rustc_version",
- "syn",
-]
-
-[[package]]
 name = "digest"
 version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
@@ -737,20 +803,20 @@
 
 [[package]]
 name = "enumset"
-version = "1.0.11"
+version = "1.0.12"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "4799cdb24d48f1f8a7a98d06b7fde65a85a2d1e42b25a889f5406aa1fbefe074"
+checksum = "19be8061a06ab6f3a6cf21106c873578bf01bd42ad15e0311a9c76161cb1c753"
 dependencies = [
  "enumset_derive",
 ]
 
 [[package]]
 name = "enumset_derive"
-version = "0.6.0"
+version = "0.6.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "ea83a3fbdc1d999ccfbcbee717eab36f8edf2d71693a23ce0d7cca19e085304c"
+checksum = "03e7b551eba279bf0fa88b83a46330168c1560a52a94f5126f892f0b364ab3e0"
 dependencies = [
- "darling",
+ "darling 0.14.1",
  "proc-macro2",
  "quote",
  "syn",
@@ -1110,19 +1176,29 @@
 
 [[package]]
 name = "iana-time-zone"
-version = "0.1.48"
+version = "0.1.51"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "237a0714f28b1ee39ccec0770ccb544eb02c9ef2c82bb096230eefcffa6468b0"
+checksum = "f5a6ef98976b22b3b7f2f3a806f858cb862044cfa66805aa3ad84cb3d3b785ed"
 dependencies = [
  "android_system_properties",
  "core-foundation-sys",
+ "iana-time-zone-haiku",
  "js-sys",
- "once_cell",
  "wasm-bindgen",
  "winapi",
 ]
 
 [[package]]
+name = "iana-time-zone-haiku"
+version = "0.1.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "fde6edd6cef363e9359ed3c98ba64590ba9eecba2293eb5a723ab32aee8926aa"
+dependencies = [
+ "cxx",
+ "cxx-build",
+]
+
+[[package]]
 name = "ident_case"
 version = "1.0.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
@@ -1185,9 +1261,9 @@
 
 [[package]]
 name = "itoa"
-version = "1.0.3"
+version = "1.0.4"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "6c8af84674fe1f223a982c933a0ee1086ac4d4052aa0fb8060c12c6ad838e754"
+checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc"
 
 [[package]]
 name = "jni"
@@ -1211,9 +1287,9 @@
 
 [[package]]
 name = "jobserver"
-version = "0.1.24"
+version = "0.1.25"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa"
+checksum = "068b1ee6743e4d11fb9c6a1e6064b3693a1b600e7f5f5988047d98b3dc9fb90b"
 dependencies = [
  "libc",
 ]
@@ -1252,9 +1328,9 @@
 
 [[package]]
 name = "libc"
-version = "0.2.132"
+version = "0.2.135"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "8371e4e5341c3a96db127eb2465ac681ced4c433e01dd0e938adbef26ba93ba5"
+checksum = "68783febc7782c6c5cb401fbda4de5a9898be1762314da0bb2c10ced61f18b0c"
 
 [[package]]
 name = "libdbus-sys"
@@ -1442,10 +1518,19 @@
 ]
 
 [[package]]
+name = "link-cplusplus"
+version = "1.0.7"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "9272ab7b96c9046fbc5bc56c06c117cb639fe2d509df0c421cad82d2915cf369"
+dependencies = [
+ "cc",
+]
+
+[[package]]
 name = "lock_api"
-version = "0.4.8"
+version = "0.4.9"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9f80bf5aacaf25cbfc8210d1cfb718f2bf3b11c4c54e5afe36c236853a8ec390"
+checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
 dependencies = [
  "autocfg",
  "scopeguard",
@@ -1470,7 +1555,7 @@
  "dirs-next 2.0.0",
  "objc-foundation",
  "objc_id",
- "time 0.3.14",
+ "time 0.3.15",
 ]
 
 [[package]]
@@ -1582,7 +1667,7 @@
 
 [[package]]
 name = "ncspot"
-version = "0.11.1"
+version = "0.11.2"
 dependencies = [
  "chrono",
  "clap",
@@ -1612,6 +1697,7 @@
  "serde",
  "serde_cbor",
  "serde_json",
+ "signal-hook",
  "strum 0.24.1",
  "strum_macros 0.24.3",
  "tokio",
@@ -1673,7 +1759,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "0df7ac00c4672f9d5aece54ee3347520b7e20f158656c7db2e6de01902eb7a6c"
 dependencies = [
- "darling",
+ "darling 0.13.4",
  "proc-macro-crate",
  "proc-macro2",
  "quote",
@@ -1726,13 +1812,13 @@
 
 [[package]]
 name = "notify-rust"
-version = "4.5.8"
+version = "4.5.10"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "a995a3d2834cefa389218e7a35156e8ce544bc95f836900da01ee0b26a07e9d4"
+checksum = "368e89ea58df747ce88be669ae44e79783c1d30bfd540ad0fc520b3f41f0b3b0"
 dependencies = [
  "dbus",
  "mac-notification-sys",
- "winrt-notification",
+ "tauri-winrt-notification",
 ]
 
 [[package]]
@@ -1987,9 +2073,9 @@
 
 [[package]]
 name = "once_cell"
-version = "1.14.0"
+version = "1.15.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "2f7254b99e31cad77da24b08ebf628882739a608578bb1bcdfc1f9c21260d7c0"
+checksum = "e82dad04139b71a90c080c8463fe0dc7902db5192d939bd0950f074d014339e1"
 
 [[package]]
 name = "opaque-debug"
@@ -1999,9 +2085,9 @@
 
 [[package]]
 name = "openssl"
-version = "0.10.41"
+version = "0.10.42"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "618febf65336490dfcf20b73f885f5651a0c89c64c2d4a8c3662585a70bf5bd0"
+checksum = "12fc0523e3bd51a692c8850d075d74dc062ccf251c0110668cbd921917118a13"
 dependencies = [
  "bitflags",
  "cfg-if",
@@ -2031,9 +2117,9 @@
 
 [[package]]
 name = "openssl-sys"
-version = "0.9.75"
+version = "0.9.76"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e5f9bd0c2710541a3cda73d6f9ac4f1b240de4ae261065d309dbe73d9dceb42f"
+checksum = "5230151e44c0f05157effb743e8d517472843121cf9243e8b81393edb5acd9ce"
 dependencies = [
  "autocfg",
  "cc",
@@ -2044,9 +2130,9 @@
 
 [[package]]
 name = "os_pipe"
-version = "1.0.1"
+version = "1.1.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "2c92f2b54f081d635c77e7120862d48db8e91f7f21cef23ab1b4fe9971c59f55"
+checksum = "0dceb7e43f59c35ee1548045b2c72945a5a3bb6ce6d6f07cdc13dc8f6bc4930a"
 dependencies = [
  "libc",
  "winapi",
@@ -2261,33 +2347,33 @@
 
 [[package]]
 name = "proc-macro2"
-version = "1.0.43"
+version = "1.0.47"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "0a2ca2c61bc9f3d74d2886294ab7b9853abd9c1ad903a3ac7815c58989bb7bab"
+checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725"
 dependencies = [
  "unicode-ident",
 ]
 
 [[package]]
 name = "protobuf"
-version = "2.27.1"
+version = "2.28.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "cf7e6d18738ecd0902d30d1ad232c9125985a3422929b16c65517b38adc14f96"
+checksum = "106dd99e98437432fed6519dedecfade6a06a73bb7b2a1e019fdd2bee5778d94"
 
 [[package]]
 name = "protobuf-codegen"
-version = "2.27.1"
+version = "2.28.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "aec1632b7c8f2e620343439a7dfd1f3c47b18906c4be58982079911482b5d707"
+checksum = "033460afb75cf755fcfc16dfaed20b86468082a2ea24e05ac35ab4a099a017d6"
 dependencies = [
  "protobuf",
 ]
 
 [[package]]
 name = "protobuf-codegen-pure"
-version = "2.27.1"
+version = "2.28.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9f8122fdb18e55190c796b088a16bdb70cd7acdcd48f7a8b796b58c62e532cc6"
+checksum = "95a29399fc94bcd3eeaa951c715f7bea69409b2445356b00519740bcd6ddd865"
 dependencies = [
  "protobuf",
  "protobuf-codegen",
@@ -2301,15 +2387,24 @@
 
 [[package]]
 name = "publicsuffix"
-version = "2.2.2"
+version = "2.2.3"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "aeeedb0b429dc462f30ad27ef3de97058b060016f47790c066757be38ef792b4"
+checksum = "96a8c1bda5ae1af7f99a2962e49df150414a43d62404644d98dd5c3a93d07457"
 dependencies = [
- "idna 0.2.3",
+ "idna 0.3.0",
  "psl-types",
 ]
 
 [[package]]
+name = "quick-xml"
+version = "0.23.1"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "11bafc859c6815fbaffbbbf4229ecb767ac913fecb27f9ad4343662e9ef099ea"
+dependencies = [
+ "memchr",
+]
+
+[[package]]
 name = "quote"
 version = "1.0.21"
 source = "registry+https://github.com/rust-lang/crates.io-index";
@@ -2415,9 +2510,9 @@
 
 [[package]]
 name = "reqwest"
-version = "0.11.11"
+version = "0.11.12"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "b75aa69a3f06bbcc66ede33af2af253c6f7a86b1ca0033f60c580a27074fbf92"
+checksum = "431949c384f4e2ae07605ccaa56d1d9d2ecdb5cadd4f9577ccfab29f2e5149fc"
 dependencies = [
  "base64",
  "bytes",
@@ -2431,10 +2526,10 @@
  "hyper-tls",
  "ipnet",
  "js-sys",
- "lazy_static",
  "log",
  "mime",
  "native-tls",
+ "once_cell",
  "percent-encoding",
  "pin-project-lite",
  "serde",
@@ -2604,6 +2699,12 @@
 checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
 
 [[package]]
+name = "scratch"
+version = "1.0.2"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "9c8132065adcfd6e02db789d9285a0deb2f3fcb04002865ab67d5fb103533898"
+
+[[package]]
 name = "sct"
 version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
@@ -2644,9 +2745,9 @@
 
 [[package]]
 name = "serde"
-version = "1.0.144"
+version = "1.0.145"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "0f747710de3dcd43b88c9168773254e809d8ddbdf9653b84e2554ab219f17860"
+checksum = "728eb6351430bccb993660dfffc5a72f91ccc1295abaa8ce19b27ebe4f75568b"
 dependencies = [
  "serde_derive",
 ]
@@ -2663,9 +2764,9 @@
 
 [[package]]
 name = "serde_derive"
-version = "1.0.144"
+version = "1.0.145"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "94ed3a816fb1d101812f83e789f888322c34e291f894f19590dc310963e87a00"
+checksum = "81fa1584d3d1bcacd84c277a0dfe21f5b0f6accf4a23d04d4c6d61f1af522b4c"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2674,9 +2775,9 @@
 
 [[package]]
 name = "serde_json"
-version = "1.0.85"
+version = "1.0.86"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "e55a28e3aaef9d5ce0506d0a14dbba8054ddc7e499ef522dd8b26859ec9d4a44"
+checksum = "41feea4228a6f1cd09ec7a3593a682276702cd67b5273544757dae23c096f074"
 dependencies = [
  "itoa",
  "ryu",
@@ -2781,9 +2882,9 @@
 
 [[package]]
 name = "smallvec"
-version = "1.9.0"
+version = "1.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "2fd0db749597d91ff862fd1d55ea87f7855a744a8425a64695b6fca237d1dad1"
+checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
 
 [[package]]
 name = "socket2"
@@ -2870,9 +2971,9 @@
 
 [[package]]
 name = "syn"
-version = "1.0.99"
+version = "1.0.102"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "58dbef6ec655055e20b86b15a8cc6d439cca19b667537ac6a1369572d151ab13"
+checksum = "3fcd952facd492f9be3ef0d0b7032a6e442ee9b361d4acc2b1d0c4aaa5f613a1"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2880,15 +2981,14 @@
 ]
 
 [[package]]
-name = "synstructure"
-version = "0.12.6"
+name = "tauri-winrt-notification"
+version = "0.1.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "f36bdaa60a83aca3921b5259d5400cbf5e90fc51931376a9bd4a0eb79aa7210f"
+checksum = "c58de036c4d2e20717024de2a3c4bf56c301f07b21bc8ef9b57189fce06f1f3b"
 dependencies = [
- "proc-macro2",
- "quote",
- "syn",
- "unicode-xid",
+ "quick-xml",
+ "strum 0.22.0",
+ "windows",
 ]
 
 [[package]]
@@ -2937,25 +3037,19 @@
 ]
 
 [[package]]
-name = "textwrap"
-version = "0.15.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "949517c0cf1bf4ee812e2e07e08ab448e3ae0d23472aee8a06c985f0c8815b16"
-
-[[package]]
 name = "thiserror"
-version = "1.0.35"
+version = "1.0.37"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "c53f98874615aea268107765aa1ed8f6116782501d18e53d08b471733bea6c85"
+checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e"
 dependencies = [
  "thiserror-impl",
 ]
 
 [[package]]
 name = "thiserror-impl"
-version = "1.0.35"
+version = "1.0.37"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "f8b463991b4eab2d801e724172285ec4195c650e8ec79b149e6c2a8e6dd3f783"
+checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb"
 dependencies = [
  "proc-macro2",
  "quote",
@@ -2986,9 +3080,9 @@
 
 [[package]]
 name = "time"
-version = "0.3.14"
+version = "0.3.15"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "3c3f9a28b618c3a6b9251b6908e9c99e04b9e5c02e6581ccbb67d59c34ef7f9b"
+checksum = "d634a985c4d4238ec39cacaed2e7ae552fbd3c476b552c1deac3021b7d7eaf0c"
 dependencies = [
  "itoa",
  "libc",
@@ -3019,9 +3113,9 @@
 
 [[package]]
 name = "tokio"
-version = "1.21.1"
+version = "1.21.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "0020c875007ad96677dcc890298f4b942882c5d4eb7cc8f439fc3bf813dc9c95"
+checksum = "a9e03c497dc955702ba729190dc4aac6f2a0ce97f913e5b1b5912fc5039d9099"
 dependencies = [
  "autocfg",
  "bytes",
@@ -3029,7 +3123,6 @@
  "memchr",
  "mio",
  "num_cpus",
- "once_cell",
  "parking_lot 0.12.1",
  "pin-project-lite",
  "socket2",
@@ -3060,9 +3153,9 @@
 
 [[package]]
 name = "tokio-stream"
-version = "0.1.9"
+version = "0.1.11"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "df54d54117d6fdc4e4fea40fe1e4e566b3505700e148a6827e59b34b0d2600d9"
+checksum = "d660770404473ccd7bc9f8b28494a811bc18542b915c0855c51e8f419d5223ce"
 dependencies = [
  "futures-core",
  "pin-project-lite",
@@ -3100,9 +3193,9 @@
 
 [[package]]
 name = "tracing"
-version = "0.1.36"
+version = "0.1.37"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "2fce9567bd60a67d08a16488756721ba392f24f29006402881e43b19aac64307"
+checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
 dependencies = [
  "cfg-if",
  "pin-project-lite",
@@ -3111,9 +3204,9 @@
 
 [[package]]
 name = "tracing-core"
-version = "0.1.29"
+version = "0.1.30"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "5aeea4303076558a00714b823f9ad67d58a3bbda1df83d8827d21193156e22f7"
+checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
 dependencies = [
  "once_cell",
 ]
@@ -3152,9 +3245,9 @@
 
 [[package]]
 name = "unicode-ident"
-version = "1.0.4"
+version = "1.0.5"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "dcc811dc4066ac62f84f11307873c4850cb653bfa9b1719cee2bd2204a4bc5dd"
+checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3"
 
 [[package]]
 name = "unicode-normalization"
@@ -3178,12 +3271,6 @@
 checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
 
 [[package]]
-name = "unicode-xid"
-version = "0.2.4"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
-
-[[package]]
 name = "untrusted"
 version = "0.7.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
@@ -3222,9 +3309,9 @@
 
 [[package]]
 name = "uuid"
-version = "1.1.2"
+version = "1.2.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "dd6469f4314d5f1ffec476e05f17cc9a78bc7a27a6a857842170bdf8d6f98d2f"
+checksum = "feb41e78f93363bb2df8b0e86a2ca30eed7806ea16ea0c790d757cf93f79be83"
 dependencies = [
  "getrandom",
 ]
@@ -3432,9 +3519,9 @@
 
 [[package]]
 name = "webpki-roots"
-version = "0.22.4"
+version = "0.22.5"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "f1c760f0d366a6c24a02ed7816e23e691f5d92291f94d15e836006fd11b04daf"
+checksum = "368bfe657969fb01238bb756d351dcade285e0f6fcbd36dcb23359a5169975be"
 dependencies = [
  "webpki",
 ]
@@ -3472,14 +3559,15 @@
 
 [[package]]
 name = "windows"
-version = "0.24.0"
+version = "0.39.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "a9f39345ae0c8ab072c0ac7fe8a8b411636aa34f89be19ddd0d9226544f13944"
+checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a"
 dependencies = [
- "windows_i686_gnu 0.24.0",
- "windows_i686_msvc 0.24.0",
- "windows_x86_64_gnu 0.24.0",
- "windows_x86_64_msvc 0.24.0",
+ "windows_aarch64_msvc 0.39.0",
+ "windows_i686_gnu 0.39.0",
+ "windows_i686_msvc 0.39.0",
+ "windows_x86_64_gnu 0.39.0",
+ "windows_x86_64_msvc 0.39.0",
 ]
 
 [[package]]
@@ -3488,7 +3576,7 @@
 source = "registry+https://github.com/rust-lang/crates.io-index";
 checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2"
 dependencies = [
- "windows_aarch64_msvc",
+ "windows_aarch64_msvc 0.36.1",
  "windows_i686_gnu 0.36.1",
  "windows_i686_msvc 0.36.1",
  "windows_x86_64_gnu 0.36.1",
@@ -3502,10 +3590,10 @@
 checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47"
 
 [[package]]
-name = "windows_i686_gnu"
-version = "0.24.0"
+name = "windows_aarch64_msvc"
+version = "0.39.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "c0866510a3eca9aed73a077490bbbf03e5eaac4e1fd70849d89539e5830501fd"
+checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2"
 
 [[package]]
 name = "windows_i686_gnu"
@@ -3514,10 +3602,10 @@
 checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6"
 
 [[package]]
-name = "windows_i686_msvc"
-version = "0.24.0"
+name = "windows_i686_gnu"
+version = "0.39.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "bf0ffed56b7e9369a29078d2ab3aaeceea48eb58999d2cff3aa2494a275b95c6"
+checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b"
 
 [[package]]
 name = "windows_i686_msvc"
@@ -3526,10 +3614,10 @@
 checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024"
 
 [[package]]
-name = "windows_x86_64_gnu"
-version = "0.24.0"
+name = "windows_i686_msvc"
+version = "0.39.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "384a173630588044205a2993b6864a2f56e5a8c1e7668c07b93ec18cf4888dc4"
+checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106"
 
 [[package]]
 name = "windows_x86_64_gnu"
@@ -3538,10 +3626,10 @@
 checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1"
 
 [[package]]
-name = "windows_x86_64_msvc"
-version = "0.24.0"
+name = "windows_x86_64_gnu"
+version = "0.39.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "9bd8f062d8ca5446358159d79a90be12c543b3a965c847c8f3eedf14b321d399"
+checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65"
 
 [[package]]
 name = "windows_x86_64_msvc"
@@ -3550,6 +3638,12 @@
 checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680"
 
 [[package]]
+name = "windows_x86_64_msvc"
+version = "0.39.0"
+source = "registry+https://github.com/rust-lang/crates.io-index";
+checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809"
+
+[[package]]
 name = "winreg"
 version = "0.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index";
@@ -3568,29 +3662,18 @@
 ]
 
 [[package]]
-name = "winrt-notification"
-version = "0.5.1"
-source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "007a0353840b23e0c6dc73e5b962ff58ed7f6bc9ceff3ce7fe6fbad8d496edf4"
-dependencies = [
- "strum 0.22.0",
- "windows",
- "xml-rs",
-]
-
-[[package]]
 name = "wl-clipboard-rs"
-version = "0.6.0"
+version = "0.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "be5ca3d1bf382a9baf6ef08b635e8f417c83a8a459bc88b4179a663abd8acd8b"
+checksum = "981a303dfbb75d659f6612d05a14b2e363c103d24f676a2d44a00d18507a1ad9"
 dependencies = [
  "derive-new",
- "derive_more",
  "libc",
  "log",
- "nix 0.23.1",
+ "nix 0.24.2",
  "os_pipe",
  "tempfile",
+ "thiserror",
  "tree_magic_mini",
  "wayland-client",
  "wayland-protocols",
@@ -3639,11 +3722,11 @@
 
 [[package]]
 name = "zerocopy-derive"
-version = "0.3.1"
+version = "0.3.2"
 source = "registry+https://github.com/rust-lang/crates.io-index";
-checksum = "a0fbc82b82efe24da867ee52e015e58178684bd9dd64c34e66bdf21da2582a9f"
+checksum = "6505e6815af7de1746a08f69c69606bb45695a17149517680f3b2149713b19a3"
 dependencies = [
  "proc-macro2",
+ "quote",
  "syn",
- "synstructure",
 ]
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ncspot-0.11.1/Cargo.toml new/ncspot-0.11.2/Cargo.toml
--- old/ncspot-0.11.1/Cargo.toml        2022-09-17 14:27:18.000000000 +0200
+++ new/ncspot-0.11.2/Cargo.toml        2022-10-15 12:48:44.000000000 +0200
@@ -8,14 +8,14 @@
 name = "ncspot"
 readme = "README.md"
 repository = "https://github.com/hrkfdn/ncspot";
-version = "0.11.1"
+version = "0.11.2"
 
 [badges]
 maintenance = {status = "actively-developed"}
 
 [dependencies]
 chrono = "0.4"
-clap = "3.2.17"
+clap = "4.0.0"
 clipboard = {version = "0.5", optional = true}
 crossbeam-channel = "0.5"
 dbus = {version = "0.9.6", optional = true}
@@ -46,8 +46,12 @@
 unicode-width = "0.1.9"
 url = "2.2"
 cursive_buffered_backend = "0.6.1"
+
 [target.'cfg(target_os = "linux")'.dependencies]
-wl-clipboard-rs = {version = "0.6", optional = true}
+wl-clipboard-rs = {version = "0.7", optional = true}
+
+[target.'cfg(unix)'.dependencies]
+signal-hook = "0.3.0"
 
 [dependencies.rspotify]
 default-features = false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ncspot-0.11.1/src/commands.rs 
new/ncspot-0.11.2/src/commands.rs
--- old/ncspot-0.11.1/src/commands.rs   2022-09-17 14:27:18.000000000 +0200
+++ new/ncspot-0.11.2/src/commands.rs   2022-10-15 12:48:44.000000000 +0200
@@ -13,7 +13,7 @@
 use crate::spotify::{Spotify, VOLUME_PERCENT};
 use crate::traits::{IntoBoxedViewExt, ViewExt};
 use crate::ui::contextmenu::{
-    AddToPlaylistMenu, ContextMenu, PlayTrackMenu, SelectArtistActionMenu, 
SelectArtistMenu,
+    AddToPlaylistMenu, ContextMenu, SelectArtistActionMenu, SelectArtistMenu,
 };
 use crate::ui::help::HelpView;
 use crate::ui::layout::Layout;
@@ -308,8 +308,6 @@
             s.find_name::<SelectArtistActionMenu>("selectartistaction")
         {
             select_artist_action.on_command(s, cmd)?
-        } else if let Some(mut play_track) = 
s.find_name::<PlayTrackMenu>("playtrackmenu") {
-            play_track.on_command(s, cmd)?
         } else {
             s.on_layout(|siv, mut l| l.on_command(siv, cmd))?
         };
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ncspot-0.11.1/src/main.rs 
new/ncspot-0.11.2/src/main.rs
--- old/ncspot-0.11.1/src/main.rs       2022-09-17 14:27:18.000000000 +0200
+++ new/ncspot-0.11.2/src/main.rs       2022-10-15 12:48:44.000000000 +0200
@@ -18,6 +18,9 @@
 use librespot_playback::audio_backend;
 use log::{error, info, trace};
 
+#[cfg(unix)]
+use signal_hook::{consts::SIGHUP, consts::SIGTERM, iterator::Signals};
+
 mod authentication;
 mod command;
 mod commands;
@@ -103,22 +106,20 @@
         .version(env!("CARGO_PKG_VERSION"))
         .author("Henrik Friedrichsen <[email protected]> and contributors")
         .about("cross-platform ncurses Spotify client")
-        .after_help(&*backends)
+        .after_help(backends)
         .arg(
             Arg::new("debug")
                 .short('d')
                 .long("debug")
                 .value_name("FILE")
-                .help("Enable debug logging to the specified file")
-                .takes_value(true),
+                .help("Enable debug logging to the specified file"),
         )
         .arg(
             Arg::new("basepath")
                 .short('b')
                 .long("basepath")
                 .value_name("PATH")
-                .help("custom basepath to config/cache files")
-                .takes_value(true),
+                .help("custom basepath to config/cache files"),
         )
         .arg(
             Arg::new("config")
@@ -126,16 +127,15 @@
                 .long("config")
                 .value_name("FILE")
                 .help("Filename of config file in basepath")
-                .takes_value(true)
                 .default_value("config.toml"),
         )
         .get_matches();
 
-    if let Some(filename) = matches.value_of("debug") {
+    if let Some(filename) = matches.get_one::<String>("debug") {
         setup_logging(filename).expect("can't setup logging");
     }
 
-    if let Some(basepath) = matches.value_of("basepath") {
+    if let Some(basepath) = matches.get_one::<String>("basepath") {
         let path = PathBuf::from_str(basepath).expect("invalid path");
         if !path.exists() {
             fs::create_dir_all(&path).expect("could not create basepath 
directory");
@@ -146,7 +146,9 @@
     // Things here may cause the process to abort; we must do them before 
creating curses windows
     // otherwise the error message will not be seen by a user
     let cfg: Arc<crate::config::Config> = Arc::new(Config::new(
-        matches.value_of("config").unwrap_or("config.toml"),
+        matches
+            .get_one::<String>("config")
+            .unwrap_or(&"config.toml".to_string()),
     ));
     let mut credentials = {
         let cache = Cache::new(Some(config::cache_path("librespot")), None, 
None, None)
@@ -314,9 +316,21 @@
 
     cursive.add_fullscreen_layer(layout.with_name("main"));
 
+    #[cfg(unix)]
+    let mut signals = Signals::new(&[SIGTERM, SIGHUP]).expect("could not 
register signal handler");
+
     // cursive event loop
     while cursive.is_running() {
         cursive.step();
+        #[cfg(unix)]
+        for signal in signals.pending() {
+            if signal == SIGTERM || signal == SIGHUP {
+                info!("Caught {}, cleaning up and closing", signal);
+                if let Some(data) = cursive.user_data::<UserData>().cloned() {
+                    data.cmd.handle(&mut cursive, Command::Quit);
+                }
+            }
+        }
         for event in event_manager.msg_iter() {
             match event {
                 Event::Player(state) => {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ncspot-0.11.1/src/model/album.rs 
new/ncspot-0.11.2/src/model/album.rs
--- old/ncspot-0.11.1/src/model/album.rs        2022-09-17 14:27:18.000000000 
+0200
+++ new/ncspot-0.11.2/src/model/album.rs        2022-10-15 12:48:44.000000000 
+0200
@@ -302,6 +302,16 @@
         )
     }
 
+    #[inline]
+    fn is_saved(&self, library: Arc<Library>) -> Option<bool> {
+        Some(library.is_saved_album(self))
+    }
+
+    #[inline]
+    fn is_playable(&self) -> bool {
+        true
+    }
+
     fn as_listitem(&self) -> Box<dyn ListItem> {
         Box::new(self.clone())
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ncspot-0.11.1/src/model/artist.rs 
new/ncspot-0.11.2/src/model/artist.rs
--- old/ncspot-0.11.1/src/model/artist.rs       2022-09-17 14:27:18.000000000 
+0200
+++ new/ncspot-0.11.2/src/model/artist.rs       2022-10-15 12:48:44.000000000 
+0200
@@ -202,6 +202,16 @@
             .map(|id| format!("https://open.spotify.com/artist/{}";, id))
     }
 
+    #[inline]
+    fn is_saved(&self, library: Arc<Library>) -> Option<bool> {
+        Some(library.is_followed_artist(self))
+    }
+
+    #[inline]
+    fn is_playable(&self) -> bool {
+        true
+    }
+
     fn as_listitem(&self) -> Box<dyn ListItem> {
         Box::new(self.clone())
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ncspot-0.11.1/src/model/episode.rs 
new/ncspot-0.11.2/src/model/episode.rs
--- old/ncspot-0.11.1/src/model/episode.rs      2022-09-17 14:27:18.000000000 
+0200
+++ new/ncspot-0.11.2/src/model/episode.rs      2022-10-15 12:48:44.000000000 
+0200
@@ -110,6 +110,11 @@
         Some(format!("https://open.spotify.com/episode/{}";, self.id))
     }
 
+    #[inline]
+    fn is_playable(&self) -> bool {
+        true
+    }
+
     fn as_listitem(&self) -> Box<dyn ListItem> {
         Box::new(self.clone())
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ncspot-0.11.1/src/model/playlist.rs 
new/ncspot-0.11.2/src/model/playlist.rs
--- old/ncspot-0.11.1/src/model/playlist.rs     2022-09-17 14:27:18.000000000 
+0200
+++ new/ncspot-0.11.2/src/model/playlist.rs     2022-10-15 12:48:44.000000000 
+0200
@@ -324,6 +324,20 @@
         ))
     }
 
+    fn is_saved(&self, library: Arc<Library>) -> Option<bool> {
+        // save status of personal playlists can't be toggled for safety
+        if !library.is_followed_playlist(self) {
+            return None;
+        }
+
+        Some(library.is_saved_playlist(self))
+    }
+
+    #[inline]
+    fn is_playable(&self) -> bool {
+        true
+    }
+
     fn as_listitem(&self) -> Box<dyn ListItem> {
         Box::new(self.clone())
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ncspot-0.11.1/src/model/show.rs 
new/ncspot-0.11.2/src/model/show.rs
--- old/ncspot-0.11.1/src/model/show.rs 2022-09-17 14:27:18.000000000 +0200
+++ new/ncspot-0.11.2/src/model/show.rs 2022-10-15 12:48:44.000000000 +0200
@@ -150,6 +150,16 @@
         Some(format!("https://open.spotify.com/show/{}";, self.id))
     }
 
+    #[inline]
+    fn is_saved(&self, library: Arc<Library>) -> Option<bool> {
+        Some(library.is_saved_show(self))
+    }
+
+    #[inline]
+    fn is_playable(&self) -> bool {
+        true
+    }
+
     fn as_listitem(&self) -> Box<dyn ListItem> {
         Box::new(self.clone())
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ncspot-0.11.1/src/model/track.rs 
new/ncspot-0.11.2/src/model/track.rs
--- old/ncspot-0.11.1/src/model/track.rs        2022-09-17 14:27:18.000000000 
+0200
+++ new/ncspot-0.11.2/src/model/track.rs        2022-10-15 12:48:44.000000000 
+0200
@@ -333,6 +333,16 @@
         Some(self.clone())
     }
 
+    #[inline]
+    fn is_saved(&self, library: Arc<Library>) -> Option<bool> {
+        Some(library.is_saved_track(&Playable::Track(self.clone())))
+    }
+
+    #[inline]
+    fn is_playable(&self) -> bool {
+        true
+    }
+
     fn as_listitem(&self) -> Box<dyn ListItem> {
         Box::new(self.clone())
     }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ncspot-0.11.1/src/queue.rs 
new/ncspot-0.11.2/src/queue.rs
--- old/ncspot-0.11.1/src/queue.rs      2022-09-17 14:27:18.000000000 +0200
+++ new/ncspot-0.11.2/src/queue.rs      2022-10-15 12:48:44.000000000 +0200
@@ -273,9 +273,11 @@
     }
 
     pub fn play(&self, mut index: usize, reshuffle: bool, shuffle_index: bool) 
{
-        if shuffle_index && self.get_shuffle() {
+        let queue_length = self.queue.read().unwrap().len();
+        // The length of the queue must be bigger than 0 or gen_range panics!
+        if queue_length > 0 && shuffle_index && self.get_shuffle() {
             let mut rng = rand::thread_rng();
-            index = rng.gen_range(0..self.queue.read().unwrap().len());
+            index = rng.gen_range(0..queue_length);
         }
 
         if let Some(track) = &self.queue.read().unwrap().get(index) {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ncspot-0.11.1/src/traits.rs 
new/ncspot-0.11.2/src/traits.rs
--- old/ncspot-0.11.1/src/traits.rs     2022-09-17 14:27:18.000000000 +0200
+++ new/ncspot-0.11.2/src/traits.rs     2022-10-15 12:48:44.000000000 +0200
@@ -47,6 +47,17 @@
         None
     }
 
+    #[allow(unused_variables)]
+    #[inline]
+    fn is_saved(&self, library: Arc<Library>) -> Option<bool> {
+        None
+    }
+
+    #[inline]
+    fn is_playable(&self) -> bool {
+        false
+    }
+
     fn as_listitem(&self) -> Box<dyn ListItem>;
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ncspot-0.11.1/src/ui/contextmenu.rs 
new/ncspot-0.11.2/src/ui/contextmenu.rs
--- old/ncspot-0.11.1/src/ui/contextmenu.rs     2022-09-17 14:27:18.000000000 
+0200
+++ new/ncspot-0.11.2/src/ui/contextmenu.rs     2022-10-15 12:48:44.000000000 
+0200
@@ -1,4 +1,3 @@
-use std::borrow::Borrow;
 use std::sync::Arc;
 
 use cursive::view::{Margins, ViewWrapper};
@@ -15,6 +14,7 @@
 use crate::queue::Queue;
 #[cfg(feature = "share_clipboard")]
 use crate::sharing::write_share;
+use crate::spotify::PlayerEvent;
 use crate::traits::{ListItem, ViewExt};
 use crate::ui::layout::Layout;
 use crate::ui::modal::Modal;
@@ -25,10 +25,6 @@
     dialog: Modal<Dialog>,
 }
 
-pub struct PlayTrackMenu {
-    dialog: Modal<Dialog>,
-}
-
 pub struct AddToPlaylistMenu {
     dialog: Modal<Dialog>,
 }
@@ -42,7 +38,6 @@
 }
 
 enum ContextMenuAction {
-    PlayTrack(Box<Track>),
     ShowItem(Box<dyn ListItem>),
     SelectArtist(Vec<Artist>),
     SelectArtistAction(Artist),
@@ -50,36 +45,14 @@
     ShareUrl(String),
     AddToPlaylist(Box<Track>),
     ShowRecommendations(Box<Track>),
-    ToggleTrackSavedStatus(Box<Track>),
+    ToggleSavedStatus(Box<dyn ListItem>),
+    Play(Box<dyn ListItem>),
+    PlayNext(Box<dyn ListItem>),
+    TogglePlayback,
+    Queue(Box<dyn ListItem>),
 }
 
 impl ContextMenu {
-    pub fn play_track_dialog(queue: Arc<Queue>, track: Track) -> 
NamedView<PlayTrackMenu> {
-        let track_title = track.title.clone();
-        let mut track_action_select = SelectView::<bool>::new();
-        track_action_select.add_item("Play now", true);
-        track_action_select.add_item("Add to queue", false);
-        track_action_select.set_on_submit(move |s, selected| {
-            match selected {
-                true => track.borrow().clone().play(queue.clone()),
-                false => track.borrow().clone().queue(queue.clone()),
-            }
-            s.pop_layer();
-        });
-        let dialog = Dialog::new()
-            .title(format!("Play track: {}", track_title))
-            .dismiss_button("Cancel")
-            .padding(Margins::lrtb(1, 1, 1, 0))
-            .content(ScrollView::new(
-                track_action_select.with_name("playtrack_select"),
-            ));
-
-        PlayTrackMenu {
-            dialog: Modal::new_ext(dialog),
-        }
-        .with_name("playtrackmenu")
-    }
-
     pub fn add_track_dialog(
         library: Arc<Library>,
         spotify: Spotify,
@@ -126,7 +99,7 @@
 
         let dialog = Dialog::new()
             .title("Add track to playlist")
-            .dismiss_button("Cancel")
+            .dismiss_button("Close")
             .padding(Margins::lrtb(1, 1, 1, 0))
             
.content(ScrollView::new(list_select.with_name("addplaylist_select")));
 
@@ -159,7 +132,7 @@
 
         let dialog = Dialog::new()
             .title("Select artist")
-            .dismiss_button("Cancel")
+            .dismiss_button("Close")
             .padding(Margins::lrtb(1, 1, 1, 0))
             
.content(ScrollView::new(artist_select.with_name("artist_select")));
 
@@ -210,7 +183,7 @@
                 "Select action for artist: {}",
                 artist.name.as_str()
             ))
-            .dismiss_button("Cancel")
+            .dismiss_button("Close")
             .padding(Margins::lrtb(1, 1, 1, 0))
             .content(ScrollView::new(
                 artist_action_select.with_name("artist_action_select"),
@@ -225,11 +198,34 @@
         Dialog::text("This track is already in your playlist")
             .title("Track already exists")
             .padding(Margins::lrtb(1, 1, 1, 0))
-            .dismiss_button("Cancel")
+            .dismiss_button("Close")
     }
 
     pub fn new(item: &dyn ListItem, queue: Arc<Queue>, library: Arc<Library>) 
-> NamedView<Self> {
         let mut content: SelectView<ContextMenuAction> = SelectView::new();
+
+        if item.is_playable() {
+            if item.is_playing(queue.clone())
+                && queue.get_spotify().get_current_status()
+                    == 
PlayerEvent::Paused(queue.get_spotify().get_current_progress())
+            {
+                // the item is the current track, but paused
+                content.insert_item(0, "Resume", 
ContextMenuAction::TogglePlayback);
+            } else if !item.is_playing(queue.clone()) {
+                // the item is not the current track
+                content.insert_item(0, "Play", 
ContextMenuAction::Play(item.as_listitem()));
+            } else {
+                // the item is the current track and playing
+                content.insert_item(0, "Pause", 
ContextMenuAction::TogglePlayback);
+            }
+            content.insert_item(
+                1,
+                "Play next",
+                ContextMenuAction::PlayNext(item.as_listitem()),
+            );
+            content.insert_item(2, "Queue", 
ContextMenuAction::Queue(item.as_listitem()));
+        }
+
         if let Some(artists) = item.artists() {
             let action = match artists.len() {
                 0 => None,
@@ -244,9 +240,11 @@
                 )
             }
         }
+
         if let Some(a) = item.album(queue.clone()) {
             content.add_item("Show album", 
ContextMenuAction::ShowItem(Box::new(a)));
         }
+
         #[cfg(feature = "share_clipboard")]
         {
             if let Some(url) = item.share_url() {
@@ -256,27 +254,26 @@
                 content.add_item("Share album", 
ContextMenuAction::ShareUrl(url));
             }
         }
+
         if let Some(t) = item.track() {
-            content.insert_item(
-                0,
-                "Play track",
-                ContextMenuAction::PlayTrack(Box::new(t.clone())),
-            );
             content.add_item(
                 "Add to playlist",
                 ContextMenuAction::AddToPlaylist(Box::new(t.clone())),
             );
             content.add_item(
                 "Similar tracks",
-                ContextMenuAction::ShowRecommendations(Box::new(t.clone())),
-            );
+                ContextMenuAction::ShowRecommendations(Box::new(t)),
+            )
+        }
+        // If the item is saveable, its save state will be set
+        if let Some(savestatus) = item.is_saved(library.clone()) {
             content.add_item(
-                match library.is_saved_track(&Playable::Track(t.clone())) {
-                    true => "Unsave track",
-                    false => "Save track",
+                match savestatus {
+                    true => "Unsave",
+                    false => "Save",
                 },
-                ContextMenuAction::ToggleTrackSavedStatus(Box::new(t)),
-            )
+                ContextMenuAction::ToggleSavedStatus(item.as_listitem()),
+            );
         }
 
         // open detail view of artist/album
@@ -288,10 +285,6 @@
                 s.pop_layer();
 
                 match action {
-                    ContextMenuAction::PlayTrack(track) => {
-                        let dialog = Self::play_track_dialog(queue, 
*track.clone());
-                        s.add_layer(dialog);
-                    }
                     ContextMenuAction::ShowItem(item) => {
                         if let Some(view) = item.open(queue, library) {
                             s.call_on_name("main", move |v: &mut Layout| 
v.push_view(view));
@@ -311,10 +304,6 @@
                             s.call_on_name("main", move |v: &mut Layout| 
v.push_view(view));
                         }
                     }
-                    ContextMenuAction::ToggleTrackSavedStatus(track) => {
-                        let mut track: Track = *track.clone();
-                        track.toggle_saved(library);
-                    }
                     ContextMenuAction::SelectArtist(artists) => {
                         let dialog = Self::select_artist_dialog(library, 
queue, artists.clone());
                         s.add_layer(dialog);
@@ -324,13 +313,20 @@
                             Self::select_artist_action_dialog(library, queue, 
artist.clone());
                         s.add_layer(dialog);
                     }
+                    ContextMenuAction::ToggleSavedStatus(item) => {
+                        item.as_listitem().toggle_saved(library)
+                    }
+                    ContextMenuAction::Play(item) => 
item.as_listitem().play(queue),
+                    ContextMenuAction::PlayNext(item) => 
item.as_listitem().play_next(queue),
+                    ContextMenuAction::TogglePlayback => 
queue.toggleplayback(),
+                    ContextMenuAction::Queue(item) => 
item.as_listitem().queue(queue),
                 }
             });
         }
 
         let dialog = Dialog::new()
             .title(item.display_left(library))
-            .dismiss_button("Cancel")
+            .dismiss_button("Close")
             .padding(Margins::lrtb(1, 1, 1, 0))
             .content(content.with_name("contextmenu_select"));
         Self {
@@ -340,13 +336,6 @@
     }
 }
 
-impl ViewExt for PlayTrackMenu {
-    fn on_command(&mut self, s: &mut Cursive, cmd: &Command) -> 
Result<CommandResult, String> {
-        log::info!("playtrack command: {:?}", cmd);
-        handle_move_command::<bool>(&mut self.dialog, s, cmd, 
"playtrack_select")
-    }
-}
-
 impl ViewExt for AddToPlaylistMenu {
     fn on_command(&mut self, s: &mut Cursive, cmd: &Command) -> 
Result<CommandResult, String> {
         log::info!("playlist command: {:?}", cmd);
@@ -393,10 +382,6 @@
     }
 }
 
-impl ViewWrapper for PlayTrackMenu {
-    wrap_impl!(self.dialog: Modal<Dialog>);
-}
-
 impl ViewWrapper for AddToPlaylistMenu {
     wrap_impl!(self.dialog: Modal<Dialog>);
 }
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ncspot-0.11.1/src/ui/cover.rs 
new/ncspot-0.11.2/src/ui/cover.rs
--- old/ncspot-0.11.1/src/ui/cover.rs   2022-09-17 14:27:18.000000000 +0200
+++ new/ncspot-0.11.2/src/ui/cover.rs   2022-10-15 12:48:44.000000000 +0200
@@ -204,7 +204,7 @@
             }
         });
 
-        let cover_url = self.queue.get_current().map(|t| 
t.cover_url()).flatten();
+        let cover_url = self.queue.get_current().and_then(|t| t.cover_url());
 
         if let Some(url) = cover_url {
             self.draw_cover(url, printer.offset, printer.size);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/ncspot-0.11.1/src/ui/layout.rs 
new/ncspot-0.11.2/src/ui/layout.rs
--- old/ncspot-0.11.1/src/ui/layout.rs  2022-09-17 14:27:18.000000000 +0200
+++ new/ncspot-0.11.2/src/ui/layout.rs  2022-10-15 12:48:44.000000000 +0200
@@ -143,6 +143,7 @@
         self.get_focussed_stack_mut().map(|stack| stack.pop());
     }
 
+    #[allow(clippy::borrowed_box)]
     fn get_current_screen(&self) -> Option<&Box<dyn ViewExt>> {
         self.focus
             .as_ref()
@@ -168,6 +169,7 @@
             .unwrap_or(false)
     }
 
+    #[allow(clippy::borrowed_box)]
     fn get_top_view(&self) -> Option<&Box<dyn ViewExt>> {
         let focussed_stack = self.get_focussed_stack();
         if focussed_stack.map(|s| s.len()).unwrap_or_default() > 0 {

++++++ vendor.tar.xz ++++++
/work/SRC/openSUSE:Factory/ncspot/vendor.tar.xz 
/work/SRC/openSUSE:Factory/.ncspot.new.2275/vendor.tar.xz differ: char 26, line 
1

Reply via email to