From d9b23d4a244fc90bacd5bae8a616508fe0c514e5 Mon Sep 17 00:00:00 2001 From: MCorange Date: Tue, 22 Oct 2024 21:54:32 +0300 Subject: [PATCH] initial --- .cargo/config.toml | 3 + .gitignore | 1 + Cargo.lock | 256 +++++++++++++++++++++++++++++++++++++++ Cargo.toml | 47 +++++++ README.md | 46 +++++++ assets/app_icon.png | Bin 0 -> 16117 bytes assets/note.svg | 19 +++ assets/search.svg | 4 + rust-toolchain.toml | 3 + xmpd-cli/Cargo.toml | 20 +++ xmpd-cli/README.md | 0 xmpd-cli/src/lib.rs | 3 + xmpd-core/Cargo.toml | 27 +++++ xmpd-core/README.md | 0 xmpd-core/src/main.rs | 9 ++ xmpd-dl/Cargo.toml | 20 +++ xmpd-dl/README.md | 0 xmpd-dl/src/lib.rs | 3 + xmpd-gui/Cargo.toml | 20 +++ xmpd-gui/README.md | 0 xmpd-gui/src/lib.rs | 3 + xmpd-manifest/Cargo.toml | 20 +++ xmpd-manifest/README.md | 0 xmpd-manifest/src/lib.rs | 3 + 24 files changed, 507 insertions(+) create mode 100644 .cargo/config.toml create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 README.md create mode 100644 assets/app_icon.png create mode 100644 assets/note.svg create mode 100644 assets/search.svg create mode 100644 rust-toolchain.toml create mode 100644 xmpd-cli/Cargo.toml create mode 100644 xmpd-cli/README.md create mode 100644 xmpd-cli/src/lib.rs create mode 100644 xmpd-core/Cargo.toml create mode 100644 xmpd-core/README.md create mode 100644 xmpd-core/src/main.rs create mode 100644 xmpd-dl/Cargo.toml create mode 100644 xmpd-dl/README.md create mode 100644 xmpd-dl/src/lib.rs create mode 100644 xmpd-gui/Cargo.toml create mode 100644 xmpd-gui/README.md create mode 100644 xmpd-gui/src/lib.rs create mode 100644 xmpd-manifest/Cargo.toml create mode 100644 xmpd-manifest/README.md create mode 100644 xmpd-manifest/src/lib.rs diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..b807e57 --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,3 @@ +[target.aarch64-unknown-linux-gnu] +linker="aarch64-linux-gnu-gcc" + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..b83d222 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/target/ diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..f5030d8 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,256 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "anstream" +version = "0.6.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64e15c1ab1f89faffbf04a634d5e1962e9074f2741eef6d97f3c4e322426d526" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bec1de6f59aedf83baf9ff929c98f2ad654b97c9510f4e70cf6f661d49fd5b1" + +[[package]] +name = "anstyle-parse" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb47de1e80c2b463c735db5b217a0ddc39d612e7ac9e2e96a5aed1f57616c1cb" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d36fc52c7f6c869915e99412912f22093507da8d9e942ceaf66fe4b7c14422a" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bf74e1b6e971609db8ca7a9ce79fd5768ab6ae46441c572e46cf596f59e57f8" +dependencies = [ + "anstyle", + "windows-sys", +] + +[[package]] +name = "clap" +version = "4.5.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97f376d85a664d5837dbae44bf546e6477a679ff6610010f17276f686d867e8" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19bc80abd44e4bed93ca373a0704ccbd1b710dc5749406201bb018272808dc54" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ac6a0c7b1a9e9a5186361f67dfa1b88213572f427fb9ab038efb2bd8c582dab" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "clap_lex" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1462739cb27611015575c0c11df5df7601141071f07518d56fcc1be504cbec97" + +[[package]] +name = "colorchoice" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf" + +[[package]] +name = "proc-macro2" +version = "1.0.89" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "syn" +version = "2.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83540f837a8afc019423a8edb95b52a8effe46957ee402287f4292fae35be021" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "unicode-ident" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_gnullvm", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "xmpd-cli" +version = "2.0.0" + +[[package]] +name = "xmpd-core" +version = "2.0.0" +dependencies = [ + "clap", + "xmpd-cli", + "xmpd-gui", + "xmpd-manifest", +] + +[[package]] +name = "xmpd-dl" +version = "2.0.0" + +[[package]] +name = "xmpd-gui" +version = "2.0.0" + +[[package]] +name = "xmpd-manifest" +version = "2.0.0" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..abdd582 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,47 @@ +[workspace] +resolver="2" +members=[ + "xmpd-core", + "xmpd-manifest", + "xmpd-gui", + "xmpd-cli", "xmpd-dl", +# "xmpd-tui" +] + +[workspace.package] +version="2.0.0" +repository="https://git.mcorangehq.xyz/XOR64/xmpd/" +license="GPL-3.0" +authors=[ + "MCorange ", + "xomf " +] + + +[workspace.dependencies] +anstyle = "1.0.6" +anyhow = "1.0.81" +bitflags = { version = "2.6.0", features = ["serde"] } +camino = "1.1.6" +clap = { version = "4.5.4", features = ["derive"] } +eframe = "0.27.2" +egui = { version = "0.27.2", features = ["color-hex"] } +egui_extras = { version = "0.27.2", features = ["all_loaders"] } +env_logger = "0.11.3" +futures = "0.3.30" +html-escape = "0.2.13" +lazy_static = "1.4.0" +libc = "0.2.153" +log = "0.4.21" +notify-rust = "4.11.3" +open = "5.3.0" +regex = "1.11.0" +reqwest = { version = "0.12.3", features = ["blocking", "h2", "http2", "rustls-tls"], default-features = false } +serde = { version = "1.0.197", features = ["derive"] } +serde_json = "1.0.115" +# serde_traitobject = "0.2.8" +tokio = { version = "1.37.0", features = ["macros", "rt-multi-thread", "process", "sync"] } +url = { version = "2.5.0", features = ["serde"] } +uuid = { version = "1.11.0", features = ["serde", "v4"] } +windows = { version = "0.56.0", features = ["Win32_Foundation", "Win32_Storage_FileSystem", "Win32_System_Console"] } +zip-extensions = "0.6.2" diff --git a/README.md b/README.md new file mode 100644 index 0000000..175d631 --- /dev/null +++ b/README.md @@ -0,0 +1,46 @@ +# (XMPD) Xor64 Music Player/Downloader + +An open source music downloader AND player (soon (TM)) + +## Design +Written in rust, it *tries* to be fast, reliable, and actually useful, as it doesnt stream the music from a server where it could be +deleted and lost forever. +It uses [egui](https://www.egui.rs/) for a crossplatform frontend that makes it possible to run almost anywhere. +The music is downloaded via [ytdlp](#Dependencies) and [spotdl](#Dependencies), and converted to your favorite format via [ffmpeg](#Dependencies) + +## Offline usage +Your whole music library is downloaded to your music folder (unless its being ran in standalone mode). Saved in your selected format. +All of the info required to download your songs is stored in 1 file (!). So all you need to backup all of your music is just 1 relatively small file AND you get the added benefit of easily moving your music between devices with just 1 manifest file, 1 executable (and 3 [dependencies](#dependencies)). Just press `download all` and see as all of your playlists appear in your hard drive, powered by Open Source software. + +## Dependencies +[ffmpeg](https://ffmpeg.org/): To convert your music files to your desired format. +[spotdl](https://github.com/spotDL/spotify-downloader): To download music from spotify, because ofcourse spotify had to be the special child +[ytdlp](https://github.com/yt-dlp/yt-dlp): To download music from every single other source + +The rust dependencies can be found in the [Cargo.toml](/Cargo.toml) file. + +## Installation +Just run `xmpd-setup-{version}.sh` for GNU/Linux or `xmpd-setup-{version}.ps1` for Windows! + +## Compilation +Building the amazing xmpd executable is really simple: + - make sure rust is installed by running `cargo --help` + - clone the git repo by running `git clone https://git.mcorangehq.xyz/XOR64/xmpd.git` in your desired directory + - run `cargo build --release` + - The executable should be in `./target/release/xmpd` + +NOTE: If you run the executable from the terminal it will start downloading all of your songs, to open the gui run `xmpd gui`, +for more info run `xmpd --help` + +## Contributing +Fork and clone your repo, you will probably want to use ssh for cloning. +After adding your features or bugfixes push the changes to your fork. +After making sure xmpd works fine, and you havent found any bugs, make a pull request on `https://git.mcorangehq.xyz/XOR64/xmpd/pulls` +If we approve your changes it will be pushed to the main branch, and added to the contributors! + +Current todos are stored in [DEV.md](/DEV.md) + +## Licensing +See [LICENSE.md](/LICENSE.md) for the licensing terms + + diff --git a/assets/app_icon.png b/assets/app_icon.png new file mode 100644 index 0000000000000000000000000000000000000000..6008cea613b781b234ad5a7a2c678e7f1e9b96d3 GIT binary patch literal 16117 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 Bg;4+i literal 0 HcmV?d00001 diff --git a/assets/note.svg b/assets/note.svg new file mode 100644 index 0000000..2703d28 --- /dev/null +++ b/assets/note.svg @@ -0,0 +1,19 @@ + + + + + music [#1005] + Created with Sketch. + + + + + + + + + + + + + diff --git a/assets/search.svg b/assets/search.svg new file mode 100644 index 0000000..254407f --- /dev/null +++ b/assets/search.svg @@ -0,0 +1,4 @@ + + + + diff --git a/rust-toolchain.toml b/rust-toolchain.toml new file mode 100644 index 0000000..f02e76c --- /dev/null +++ b/rust-toolchain.toml @@ -0,0 +1,3 @@ +[toolchain] +channel="nightly" + diff --git a/xmpd-cli/Cargo.toml b/xmpd-cli/Cargo.toml new file mode 100644 index 0000000..22df51b --- /dev/null +++ b/xmpd-cli/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "xmpd-cli" +edition = "2021" +readme="README.md" +version.workspace = true +authors.workspace = true +repository.workspace = true +license.workspace = true +autobins = false +autotests = false +autoexamples = false + +[features] +default = [] + +[lib] +crate-type = ["rlib"] +bench = false + +[dependencies] diff --git a/xmpd-cli/README.md b/xmpd-cli/README.md new file mode 100644 index 0000000..e69de29 diff --git a/xmpd-cli/src/lib.rs b/xmpd-cli/src/lib.rs new file mode 100644 index 0000000..9815d27 --- /dev/null +++ b/xmpd-cli/src/lib.rs @@ -0,0 +1,3 @@ +pub fn test() { + println!("Hello, world!"); +} diff --git a/xmpd-core/Cargo.toml b/xmpd-core/Cargo.toml new file mode 100644 index 0000000..bfaf2f4 --- /dev/null +++ b/xmpd-core/Cargo.toml @@ -0,0 +1,27 @@ +[package] +name = "xmpd-core" +edition = "2021" +readme="README.md" +version.workspace = true +authors.workspace = true +repository.workspace = true +license.workspace = true +autobins = false +autotests = false +autoexamples = false + +[features] +default=["cli", "gui"] +cli=[] +gui=[] + + +[[bin]] +name="xmpd" +path="src/main.rs" + +[dependencies] +xmpd-cli={ path="../xmpd-cli" } +xmpd-gui={ path="../xmpd-gui" } +xmpd-manifest={ path="../xmpd-manifest" } +clap = { workspace=true } diff --git a/xmpd-core/README.md b/xmpd-core/README.md new file mode 100644 index 0000000..e69de29 diff --git a/xmpd-core/src/main.rs b/xmpd-core/src/main.rs new file mode 100644 index 0000000..83296ff --- /dev/null +++ b/xmpd-core/src/main.rs @@ -0,0 +1,9 @@ + +fn main() { + let args = std::env::args(); + if args.len() > 1 { + // gui + } else { + // cli + } +} diff --git a/xmpd-dl/Cargo.toml b/xmpd-dl/Cargo.toml new file mode 100644 index 0000000..2e6ee85 --- /dev/null +++ b/xmpd-dl/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "xmpd-dl" +edition = "2021" +readme="README.md" +authors.workspace = true +version.workspace = true +repository.workspace = true +license.workspace = true +autobins = false +autotests = false +autoexamples = false + +[features] +default = [] + +[lib] +crate-type = ["rlib"] +bench = false + +[dependencies] diff --git a/xmpd-dl/README.md b/xmpd-dl/README.md new file mode 100644 index 0000000..e69de29 diff --git a/xmpd-dl/src/lib.rs b/xmpd-dl/src/lib.rs new file mode 100644 index 0000000..e7a11a9 --- /dev/null +++ b/xmpd-dl/src/lib.rs @@ -0,0 +1,3 @@ +fn main() { + println!("Hello, world!"); +} diff --git a/xmpd-gui/Cargo.toml b/xmpd-gui/Cargo.toml new file mode 100644 index 0000000..bed45e5 --- /dev/null +++ b/xmpd-gui/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "xmpd-gui" +edition = "2021" +readme="README.md" +authors.workspace = true +version.workspace = true +repository.workspace = true +license.workspace = true +autobins = false +autotests = false +autoexamples = false + +[features] +default = [] + +[lib] +crate-type = ["rlib"] +bench = false + +[dependencies] diff --git a/xmpd-gui/README.md b/xmpd-gui/README.md new file mode 100644 index 0000000..e69de29 diff --git a/xmpd-gui/src/lib.rs b/xmpd-gui/src/lib.rs new file mode 100644 index 0000000..9815d27 --- /dev/null +++ b/xmpd-gui/src/lib.rs @@ -0,0 +1,3 @@ +pub fn test() { + println!("Hello, world!"); +} diff --git a/xmpd-manifest/Cargo.toml b/xmpd-manifest/Cargo.toml new file mode 100644 index 0000000..8d7bb42 --- /dev/null +++ b/xmpd-manifest/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "xmpd-manifest" +edition = "2021" +readme="README.md" +authors.workspace = true +version.workspace = true +repository.workspace = true +license.workspace = true +autobins = false +autotests = false +autoexamples = false + +[features] +default = [] + +[lib] +crate-type = ["rlib"] +bench = false + +[dependencies] diff --git a/xmpd-manifest/README.md b/xmpd-manifest/README.md new file mode 100644 index 0000000..e69de29 diff --git a/xmpd-manifest/src/lib.rs b/xmpd-manifest/src/lib.rs new file mode 100644 index 0000000..9815d27 --- /dev/null +++ b/xmpd-manifest/src/lib.rs @@ -0,0 +1,3 @@ +pub fn test() { + println!("Hello, world!"); +}