Compare commits

..
15 Commits
Author SHA1 Message Date
phoenix 0494d2b1e5 Added sample docker env file
Rust Build / Check (pull_request) Successful in 56s
Rust Build / Rustfmt (pull_request) Successful in 36s
Rust Build / Test Suite (pull_request) Successful in 1m10s
Rust Build / Clippy (pull_request) Successful in 1m29s
Rust Build / build (pull_request) Successful in 1m41s
2026-05-22 10:27:26 -04:00
phoenix c0fe0b07bb Added sample local env file 2026-05-22 10:24:20 -04:00
phoenix 101ce15af7 bump: songparser
Rust Build / Rustfmt (pull_request) Successful in 27s
Rust Build / Check (pull_request) Successful in 57s
Rust Build / Test Suite (pull_request) Successful in 1m2s
Rust Build / Clippy (pull_request) Successful in 1m21s
Rust Build / build (pull_request) Successful in 1m35s
2026-05-05 21:23:17 -04:00
phoenix 9f4003e1be cargo update 2026-05-05 21:22:11 -04:00
phoenix 42c839cfe3 cargo fmt 2026-05-05 21:21:16 -04:00
phoenix 31cd6c40b4 bump: icarus_envy 2026-05-05 21:21:02 -04:00
phoenix 79d3c77316 bump: icarus_models 2026-05-05 21:20:27 -04:00
phoenix ff331d6f20 bump: icarus_meta 2026-05-05 21:19:55 -04:00
phoenix 98d23ba9ab bump: reqwest 2026-05-05 21:17:00 -04:00
phoenix c8338be49d bump: rust docker 2026-05-05 21:11:34 -04:00
phoenix f43e221e2a bump: tokio 2026-05-05 21:11:24 -04:00
phoenix 1991747712 bump: rand 2026-05-05 21:10:29 -04:00
phoenix f2eccb9594 bump: uuid 2026-05-05 21:09:38 -04:00
phoenix b34fad0cf0 bump: rust ci 2026-05-05 21:08:53 -04:00
phoenix 5c59468b62 bump: rust 2026-05-05 21:08:35 -04:00
17 changed files with 815 additions and 472 deletions
+2 -2
View File
@@ -1,4 +1,4 @@
ROOT_DIRECTORY=/usr/local/bin ROOT_DIRECTORY=/usr/local/bin
SOARICARUS_BASE_API_URL=http://api:8000 ICARUS_BASE_API_URL=http://api:8000
SOARICARUS_AUTH_BASE_API_URL=http://auth_api:8001 ICARUS_AUTH_BASE_API_URL=http://auth_api:8001
SERVICE_PASSPHRASE=iUOo1fxshf3y1tUGn1yU8l9raPApHCdinW0VdCHdRFEjqhR3Bf02aZzsKbLtaDFH SERVICE_PASSPHRASE=iUOo1fxshf3y1tUGn1yU8l9raPApHCdinW0VdCHdRFEjqhR3Bf02aZzsKbLtaDFH
+2 -2
View File
@@ -1,4 +1,4 @@
ROOT_DIRECTORY=/tmp ROOT_DIRECTORY=/tmp
SOARICARUS_BASE_API_URL=http://localhost:8000 ICARUS_BASE_API_URL=http://localhost:8000
SOARICARUS_AUTH_BASE_API_URL=http://localhost:8001 ICARUS_AUTH_BASE_API_URL=http://localhost:8001
SERVICE_PASSPHRASE=iUOo1fxshf3y1tUGn1yU8l9raPApHCdinW0VdCHdRFEjqhR3Bf02aZzsKbLtaDFH SERVICE_PASSPHRASE=iUOo1fxshf3y1tUGn1yU8l9raPApHCdinW0VdCHdRFEjqhR3Bf02aZzsKbLtaDFH
+4
View File
@@ -0,0 +1,4 @@
ROOT_DIRECTORY=/home/songparser/mydata
ICARUS_BASE_API_URL=http://localhost:3000
ICARUS_AUTH_BASE_API_URL=http://localhost:3001
SERVICE_PASSPHRASE=iUOo1fxshf3y1tUGn1yU8l9raPApHCdinW0VdCHdRFEjqhR3Bf02aZzsKbLtaDFH
+2 -2
View File
@@ -10,14 +10,14 @@ jobs:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
steps: steps:
- name: Checkout code - name: Checkout code
uses: actions/checkout@v6 uses: actions/checkout@v5
with: with:
fetch-depth: 0 # Important for git describe --tags fetch-depth: 0 # Important for git describe --tags
- name: Install Rust - name: Install Rust
uses: actions-rs/toolchain@v1 uses: actions-rs/toolchain@v1
with: with:
toolchain: 1.97 toolchain: 1.95
components: cargo components: cargo
- name: Extract Version from Cargo.toml - name: Extract Version from Cargo.toml
+29 -17
View File
@@ -1,27 +1,24 @@
name: songparser name: Rust Build
on: on:
push: push:
branches: branches:
- main - main
- devel
pull_request: pull_request:
branches: branches:
- main - main
- devel
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true
jobs: jobs:
check: check:
name: Check name: Check
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v5
- uses: actions-rust-lang/setup-rust-toolchain@v1 - uses: actions-rust-lang/setup-rust-toolchain@v1
with: with:
toolchain: 1.97 toolchain: 1.95
- uses: Swatinem/rust-cache@v2
- run: | - run: |
mkdir -p ~/.ssh mkdir -p ~/.ssh
echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/gitlab_deploy_key echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/gitlab_deploy_key
@@ -31,16 +28,33 @@ jobs:
ssh-add -v ~/.ssh/gitlab_deploy_key ssh-add -v ~/.ssh/gitlab_deploy_key
cargo check cargo check
test:
name: Test Suite
runs-on: ubuntu-24.04
needs: setup_ssh
steps:
- uses: actions/checkout@v5
- uses: actions-rust-lang/setup-rust-toolchain@v1
with:
toolchain: 1.95
- run: |
mkdir -p ~/.ssh
echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/gitlab_deploy_key
chmod 600 ~/.ssh/gitlab_deploy_key
ssh-keyscan ${{ vars.MYHOST }} >> ~/.ssh/known_hosts
eval $(ssh-agent -s)
ssh-add -v ~/.ssh/gitlab_deploy_key
cargo test
fmt: fmt:
name: Rustfmt name: Rustfmt
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
needs: setup_ssh needs: setup_ssh
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v5
- uses: actions-rust-lang/setup-rust-toolchain@v1 - uses: actions-rust-lang/setup-rust-toolchain@v1
with: with:
toolchain: 1.97 toolchain: 1.95
- uses: Swatinem/rust-cache@v2
- run: rustup component add rustfmt - run: rustup component add rustfmt
- run: | - run: |
mkdir -p ~/.ssh mkdir -p ~/.ssh
@@ -56,11 +70,10 @@ jobs:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
needs: setup_ssh needs: setup_ssh
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v5
- uses: actions-rust-lang/setup-rust-toolchain@v1 - uses: actions-rust-lang/setup-rust-toolchain@v1
with: with:
toolchain: 1.97 toolchain: 1.95
- uses: Swatinem/rust-cache@v2
- run: rustup component add clippy - run: rustup component add clippy
- run: | - run: |
mkdir -p ~/.ssh mkdir -p ~/.ssh
@@ -76,11 +89,10 @@ jobs:
runs-on: ubuntu-24.04 runs-on: ubuntu-24.04
needs: setup_ssh needs: setup_ssh
steps: steps:
- uses: actions/checkout@v6 - uses: actions/checkout@v5
- uses: actions-rust-lang/setup-rust-toolchain@v1 - uses: actions-rust-lang/setup-rust-toolchain@v1
with: with:
toolchain: 1.97 toolchain: 1.95
- uses: Swatinem/rust-cache@v2
- run: | - run: |
mkdir -p ~/.ssh mkdir -p ~/.ssh
echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/gitlab_deploy_key echo "${{ secrets.MYREPO_TOKEN }}" > ~/.ssh/gitlab_deploy_key
Generated
+640 -330
View File
File diff suppressed because it is too large Load Diff
+12 -14
View File
@@ -1,20 +1,18 @@
[package] [package]
name = "songparser" name = "songparser"
version = "0.6.2" version = "0.6.0"
edition = "2024" edition = "2024"
rust-version = "1.95" rust-version = "1.95"
license = "MIT"
description = "Service to parse songs queued for processing"
[dependencies] [dependencies]
tokio = { version = "1.53.1", features = ["full"] } tokio = { version = "1.52.2", features = ["full"] }
futures = { version = "0.3.34" } futures = { version = "0.3.32" }
reqwest = { version = "0.13.4", features = ["json", "stream", "multipart"] } reqwest = { version = "0.13.3", features = ["json", "stream", "multipart"] }
openssl = { version = "0.10.81", features = ["vendored"] } serde = { version = "1.0.228", features = ["derive"] }
serde = { version = "1.0.229", features = ["derive"] } serde_json = { version = "1.0.149" }
serde_json = { version = "1.0.151" } time = { version = "0.3.47", features = ["macros", "serde"] }
time = { version = "0.3.55", features = ["macros", "serde"] } uuid = { version = "1.23.1", features = ["v4", "serde"] }
uuid = { version = "1.24.1", features = ["v4", "serde"] } rand = { version = "0.10.1" }
simeta = { git = "ssh://git@git.kundeng.us/phoenix/simeta.git", tag = "v0.6.2" } icarus_meta = { git = "ssh://git@git.kundeng.us/phoenix/icarus_meta.git", tag = "v0.6.0" }
simodels = { git = "ssh://git@git.kundeng.us/phoenix/simodels.git", tag = "v0.11.4" } icarus_models = { git = "ssh://git@git.kundeng.us/phoenix/icarus_models.git", tag = "v0.11.1" }
sienvy = { git = "ssh://git@git.kundeng.us/phoenix/sienvy.git", tag = "v0.8.1" } icarus_envy = { git = "ssh://git@git.kundeng.us/phoenix/icarus_envy.git", tag = "v0.7.0" }
+29 -3
View File
@@ -1,37 +1,63 @@
FROM rust:1.97 as builder # Stage 1: Build the application
# Use a specific Rust version for reproducibility. Choose one that matches your development environment.
# Using slim variant for smaller base image
FROM rust:1.95 as builder
# Set the working directory inside the container
WORKDIR /usr/src/app WORKDIR /usr/src/app
# Install build dependencies if needed (e.g., git for cloning)
RUN apt-get update && apt-get install -y --no-install-recommends \ RUN apt-get update && apt-get install -y --no-install-recommends \
pkg-config libssl3 \ pkg-config libssl3 \
ca-certificates \ ca-certificates \
openssh-client git \ openssh-client git \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
# << --- ADD HOST KEY HERE --- >>
# Replace 'yourgithost.com' with the actual hostname (e.g., github.com)
RUN mkdir -p -m 0700 ~/.ssh && \ RUN mkdir -p -m 0700 ~/.ssh && \
ssh-keyscan git.kundeng.us >> ~/.ssh/known_hosts ssh-keyscan git.kundeng.us >> ~/.ssh/known_hosts
# Copy Cargo manifests
COPY Cargo.toml Cargo.lock ./ COPY Cargo.toml Cargo.lock ./
# Build *only* dependencies to leverage Docker cache
# This dummy build caches dependencies as a separate layer
RUN --mount=type=ssh mkdir src && \ RUN --mount=type=ssh mkdir src && \
echo "fn main() {println!(\"if you see this, the build broke\")}" > src/main.rs && \ echo "fn main() {println!(\"if you see this, the build broke\")}" > src/main.rs && \
cargo build --release --quiet && \ cargo build --release --quiet && \
rm -rf src target/release/deps/songparser* rm -rf src target/release/deps/songparser* # Clean up dummy build artifacts (replace songparser)
# Copy the actual source code
COPY src ./src COPY src ./src
# If you have other directories like `templates` or `static`, copy them too
COPY .env ./.env COPY .env ./.env
# << --- SSH MOUNT ADDED HERE --- >>
# Build *only* dependencies to leverage Docker cache
# This dummy build caches dependencies as a separate layer
# Mount the SSH agent socket for this command
RUN --mount=type=ssh \ RUN --mount=type=ssh \
cargo build --release --quiet cargo build --release --quiet
FROM debian:trixie-slim # Stage 2: Create the final, smaller runtime image
# Use a minimal base image like debian-slim or even distroless for security/size
FROM ubuntu:24.04
# Install runtime dependencies if needed (e.g., SSL certificates)
RUN apt-get update && apt-get install -y ca-certificates libssl-dev libssl3 && rm -rf /var/lib/apt/lists/* RUN apt-get update && apt-get install -y ca-certificates libssl-dev libssl3 && rm -rf /var/lib/apt/lists/*
# Set the working directory
WORKDIR /usr/local/bin WORKDIR /usr/local/bin
# Copy the compiled binary from the builder stage
# Replace 'songparser' with the actual name of your binary (usually the crate name)
COPY --from=builder /usr/src/app/target/release/songparser . COPY --from=builder /usr/src/app/target/release/songparser .
# Copy other necessary files like .env (if used for runtime config) or static assets
# It's generally better to configure via environment variables in Docker though
COPY --from=builder /usr/src/app/.env . COPY --from=builder /usr/src/app/.env .
# Set the command to run your application
# Ensure this matches the binary name copied above
CMD ["./songparser"] CMD ["./songparser"]
-21
View File
@@ -1,21 +0,0 @@
MIT License
Copyright (c) 2026 Kun Deng
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
+3 -3
View File
@@ -1,4 +1,4 @@
# songparser # Songparser
A service that edits the metadata of a queued song and populates it with data. A service that edits the metadata of a queued song and populates it with data.
@@ -11,10 +11,10 @@ it can be changed.
The `SERVICE_PASSPHRASE` env variable should not be changed, but it could be changed. The The `SERVICE_PASSPHRASE` env variable should not be changed, but it could be changed. The
value for this variable should match the value in the `passphrase` table. This would be value for this variable should match the value in the `passphrase` table. This would be
found in the `soaricarus_auth` project. found in the `icarus_auth` project.
Ensure that the URLs for the two APIs are correctly set for the respective env variables Ensure that the URLs for the two APIs are correctly set for the respective env variables
`SOARICARUS_BASE_API_URL` for soaricarus API and `SOARICARUS_AUTH_BASE_API_URL` for `soaricarus_auth`. `ICARUS_BASE_API_URL` for Icarus API and `ICARUS_AUTH_BASE_API_URL` for `icarus_auth`.
If the values are properly set, next is to build the image. The docker image should be If the values are properly set, next is to build the image. The docker image should be
built from the main icarus web API. built from the main icarus web API.
+5 -4
View File
@@ -1,11 +1,12 @@
version: '3.8' # Use a recent version version: '3.8' # Use a recent version
services: services:
# Your Rust Application Service
songparser: songparser:
build: build: # Tells docker-compose to build the Dockerfile in the current directory
context: . context: .
ssh: ["default"] ssh: ["default"] # Uses host's SSH agent
container_name: songparser container_name: songparser # Optional: Give the container a specific name
env_file: env_file:
- .env - .env
restart: unless-stopped restart: unless-stopped # Optional: Restart policy
+5 -5
View File
@@ -162,7 +162,7 @@ pub mod service_token {
#[derive(Debug, serde::Deserialize, serde::Serialize)] #[derive(Debug, serde::Deserialize, serde::Serialize)]
pub struct Response { pub struct Response {
pub message: String, pub message: String,
pub data: Vec<simodels::login_result::LoginResult>, pub data: Vec<icarus_models::login_result::LoginResult>,
} }
} }
} }
@@ -172,7 +172,7 @@ pub mod refresh_token {
#[derive(Debug, serde::Deserialize, serde::Serialize)] #[derive(Debug, serde::Deserialize, serde::Serialize)]
pub struct Response { pub struct Response {
pub message: String, pub message: String,
pub data: Vec<simodels::login_result::LoginResult>, pub data: Vec<icarus_models::login_result::LoginResult>,
} }
} }
} }
@@ -253,7 +253,7 @@ pub mod create_song {
#[derive(Debug, serde::Deserialize, serde::Serialize)] #[derive(Debug, serde::Deserialize, serde::Serialize)]
pub struct Response { pub struct Response {
pub message: String, pub message: String,
pub data: Vec<simodels::song::Song>, pub data: Vec<icarus_models::song::Song>,
} }
} }
} }
@@ -261,7 +261,7 @@ pub mod create_song {
pub mod create_coverart { pub mod create_coverart {
pub async fn create( pub async fn create(
app: &crate::config::App, app: &crate::config::App,
song: &simodels::song::Song, song: &icarus_models::song::Song,
queued_coverart: &crate::queued_item::QueuedCoverArt, queued_coverart: &crate::queued_item::QueuedCoverArt,
) -> Result<reqwest::Response, reqwest::Error> { ) -> Result<reqwest::Response, reqwest::Error> {
let client = reqwest::Client::builder().build()?; let client = reqwest::Client::builder().build()?;
@@ -284,7 +284,7 @@ pub mod create_coverart {
#[derive(Debug, serde::Deserialize, serde::Serialize)] #[derive(Debug, serde::Deserialize, serde::Serialize)]
pub struct Response { pub struct Response {
pub message: String, pub message: String,
pub data: Vec<simodels::coverart::CoverArt>, pub data: Vec<icarus_models::coverart::CoverArt>,
} }
} }
} }
+3 -3
View File
@@ -1,12 +1,12 @@
pub async fn get_token( pub async fn get_token(
app: &crate::config::App, app: &crate::config::App,
) -> Result<simodels::login_result::LoginResult, std::io::Error> { ) -> Result<icarus_models::login_result::LoginResult, std::io::Error> {
let client = reqwest::Client::new(); let client = reqwest::Client::new();
let endpoint = String::from("api/v2/service/login"); let endpoint = String::from("api/v2/service/login");
let api_url = format!("{}/{endpoint}", app.auth_uri); let api_url = format!("{}/{endpoint}", app.auth_uri);
let payload = serde_json::json!({ let payload = serde_json::json!({
"passphrase": sienvy::environment::get_service_passphrase().value, "passphrase": icarus_envy::environment::get_service_passphrase().await.value,
}); });
match client.post(api_url).json(&payload).send().await { match client.post(api_url).json(&payload).send().await {
@@ -29,7 +29,7 @@ pub async fn get_token(
pub async fn get_refresh_token( pub async fn get_refresh_token(
app: &crate::config::App, app: &crate::config::App,
) -> Result<simodels::login_result::LoginResult, std::io::Error> { ) -> Result<icarus_models::login_result::LoginResult, std::io::Error> {
let client = reqwest::Client::new(); let client = reqwest::Client::new();
let endpoint = String::from("api/v2/token/refresh"); let endpoint = String::from("api/v2/token/refresh");
let api_url = format!("{}/{endpoint}", app.auth_uri); let api_url = format!("{}/{endpoint}", app.auth_uri);
+8 -4
View File
@@ -2,7 +2,7 @@
pub struct App { pub struct App {
pub uri: String, pub uri: String,
pub auth_uri: String, pub auth_uri: String,
pub token: simodels::login_result::LoginResult, pub token: icarus_models::login_result::LoginResult,
pub root_directory: String, pub root_directory: String,
} }
@@ -15,9 +15,13 @@ impl App {
pub async fn initialize_app_config() -> App { pub async fn initialize_app_config() -> App {
App { App {
uri: sienvy::environment::get_soaricarus_base_api_url().value, uri: icarus_envy::environment::get_icarus_base_api_url()
auth_uri: sienvy::environment::get_soaricarus_auth_base_api_url().value, .await
root_directory: sienvy::environment::get_root_directory().value, .value,
auth_uri: icarus_envy::environment::get_icarus_auth_base_api_url()
.await
.value,
root_directory: icarus_envy::environment::get_root_directory().await.value,
..Default::default() ..Default::default()
} }
} }
+48 -40
View File
@@ -5,96 +5,101 @@ pub async fn apply_metadata(
metadata: &crate::api::get_metadata_queue::response::Metadata, metadata: &crate::api::get_metadata_queue::response::Metadata,
) -> Result<bool, std::io::Error> { ) -> Result<bool, std::io::Error> {
// Apply metadata fields // Apply metadata fields
let types = simeta::types::all_metadata_types(); let types = icarus_meta::types::all_metadata_types();
for t in types { for t in types {
match t { match t {
simeta::types::Type::Album => { icarus_meta::types::Type::Album => {
let meta_type = simeta::types::MetadataType::from_string(metadata.album.clone());
match simeta::meta::metadata::set_meta_value(t, &queued_song.path, meta_type) {
Ok(_) => {}
Err(_err) => {
return Err(_err);
}
}
}
simeta::types::Type::AlbumArtist => {
let meta_type = let meta_type =
simeta::types::MetadataType::from_string(metadata.album_artist.clone()); icarus_meta::types::MetadataType::from_string(metadata.album.clone());
match simeta::meta::metadata::set_meta_value(t, &queued_song.path, meta_type) { match icarus_meta::meta::metadata::set_meta_value(t, &queued_song.path, meta_type) {
Ok(_) => {} Ok(_) => {}
Err(_err) => { Err(_err) => {
return Err(_err); return Err(_err);
} }
} }
} }
simeta::types::Type::Artist => { icarus_meta::types::Type::AlbumArtist => {
let meta_type = simeta::types::MetadataType::from_string(metadata.artist.clone()); let meta_type =
match simeta::meta::metadata::set_meta_value(t, &queued_song.path, meta_type) { icarus_meta::types::MetadataType::from_string(metadata.album_artist.clone());
match icarus_meta::meta::metadata::set_meta_value(t, &queued_song.path, meta_type) {
Ok(_) => {} Ok(_) => {}
Err(_err) => { Err(_err) => {
return Err(_err); return Err(_err);
} }
} }
} }
simeta::types::Type::Date => { icarus_meta::types::Type::Artist => {
let meta_type =
icarus_meta::types::MetadataType::from_string(metadata.artist.clone());
match icarus_meta::meta::metadata::set_meta_value(t, &queued_song.path, meta_type) {
Ok(_) => {}
Err(_err) => {
return Err(_err);
}
}
}
icarus_meta::types::Type::Date => {
// TODO: Do something about this discrepancy // TODO: Do something about this discrepancy
let meta_type = simeta::types::MetadataType::from_string(metadata.year.to_string()); let meta_type =
match simeta::meta::metadata::set_meta_value(t, &queued_song.path, meta_type) { icarus_meta::types::MetadataType::from_string(metadata.year.to_string());
match icarus_meta::meta::metadata::set_meta_value(t, &queued_song.path, meta_type) {
Ok(_) => {} Ok(_) => {}
Err(_err) => { Err(_err) => {
return Err(_err); return Err(_err);
} }
} }
} }
simeta::types::Type::Disc => { icarus_meta::types::Type::Disc => {
let meta_type = simeta::types::MetadataType::from_int(metadata.disc); let meta_type = icarus_meta::types::MetadataType::from_int(metadata.disc);
match simeta::meta::metadata::set_meta_value(t, &queued_song.path, meta_type) { match icarus_meta::meta::metadata::set_meta_value(t, &queued_song.path, meta_type) {
Ok(_) => {} Ok(_) => {}
Err(_err) => { Err(_err) => {
return Err(_err); return Err(_err);
} }
} }
} }
simeta::types::Type::Genre => { icarus_meta::types::Type::Genre => {
let meta_type = simeta::types::MetadataType::from_string(metadata.genre.clone()); let meta_type =
match simeta::meta::metadata::set_meta_value(t, &queued_song.path, meta_type) { icarus_meta::types::MetadataType::from_string(metadata.genre.clone());
match icarus_meta::meta::metadata::set_meta_value(t, &queued_song.path, meta_type) {
Ok(_) => {} Ok(_) => {}
Err(_err) => { Err(_err) => {
return Err(_err); return Err(_err);
} }
} }
} }
simeta::types::Type::Title => { icarus_meta::types::Type::Title => {
let meta_type = simeta::types::MetadataType::from_string(metadata.title.clone()); let meta_type =
match simeta::meta::metadata::set_meta_value(t, &queued_song.path, meta_type) { icarus_meta::types::MetadataType::from_string(metadata.title.clone());
match icarus_meta::meta::metadata::set_meta_value(t, &queued_song.path, meta_type) {
Ok(_) => {} Ok(_) => {}
Err(_err) => { Err(_err) => {
return Err(_err); return Err(_err);
} }
} }
} }
simeta::types::Type::Track => { icarus_meta::types::Type::Track => {
let meta_type = simeta::types::MetadataType::from_int(metadata.track); let meta_type = icarus_meta::types::MetadataType::from_int(metadata.track);
match simeta::meta::metadata::set_meta_value(t, &queued_song.path, meta_type) { match icarus_meta::meta::metadata::set_meta_value(t, &queued_song.path, meta_type) {
Ok(_) => {} Ok(_) => {}
Err(_err) => { Err(_err) => {
return Err(_err); return Err(_err);
} }
} }
} }
simeta::types::Type::TrackCount => { icarus_meta::types::Type::TrackCount => {
let meta_type = simeta::types::MetadataType::from_int(metadata.track_count); let meta_type = icarus_meta::types::MetadataType::from_int(metadata.track_count);
match simeta::meta::metadata::set_meta_value(t, &queued_song.path, meta_type) { match icarus_meta::meta::metadata::set_meta_value(t, &queued_song.path, meta_type) {
Ok(_) => {} Ok(_) => {}
Err(_err) => { Err(_err) => {
return Err(_err); return Err(_err);
} }
} }
} }
simeta::types::Type::DiscCount => { icarus_meta::types::Type::DiscCount => {
let meta_type = simeta::types::MetadataType::from_int(metadata.disc_count); let meta_type = icarus_meta::types::MetadataType::from_int(metadata.disc_count);
match simeta::meta::metadata::set_meta_value(t, &queued_song.path, meta_type) { match icarus_meta::meta::metadata::set_meta_value(t, &queued_song.path, meta_type) {
Ok(_) => {} Ok(_) => {}
Err(_err) => { Err(_err) => {
return Err(_err); return Err(_err);
@@ -105,11 +110,11 @@ pub async fn apply_metadata(
} }
// Apply coverart // Apply coverart
match simeta::meta::coverart::contains_coverart(&queued_song.path) { match icarus_meta::meta::coverart::contains_coverart(&queued_song.path) {
Ok((exists, size)) => { Ok((exists, size)) => {
if exists { if exists {
println!("Coverart exists: {size:?} size"); println!("Coverart exists: {size:?} size");
match simeta::meta::coverart::remove_coverart(&queued_song.path) { match icarus_meta::meta::coverart::remove_coverart(&queued_song.path) {
Ok(_data) => {} Ok(_data) => {}
Err(err) => { Err(err) => {
return Err(err); return Err(err);
@@ -117,7 +122,10 @@ pub async fn apply_metadata(
} }
} }
match simeta::meta::coverart::set_coverart(&queued_song.path, &queued_coverart.path) { match icarus_meta::meta::coverart::set_coverart(
&queued_song.path,
&queued_coverart.path,
) {
Ok(_data) => { Ok(_data) => {
if _data.is_empty() { if _data.is_empty() {
println!("There was an issue"); println!("There was an issue");
+21 -20
View File
@@ -4,8 +4,8 @@ pub async fn some_work(
user_id: &uuid::Uuid, user_id: &uuid::Uuid,
) -> Result< ) -> Result<
( (
simodels::song::Song, icarus_models::song::Song,
simodels::coverart::CoverArt, icarus_models::coverart::CoverArt,
crate::api::get_metadata_queue::response::Metadata, crate::api::get_metadata_queue::response::Metadata,
crate::queued_item::QueuedSong, crate::queued_item::QueuedSong,
crate::queued_item::QueuedCoverArt, crate::queued_item::QueuedCoverArt,
@@ -30,8 +30,9 @@ pub async fn some_work(
println!("Updated queued song"); println!("Updated queued song");
println!("Response: {_inner_response:?}"); println!("Response: {_inner_response:?}");
let song_type = let song_type = String::from(
String::from(simeta::detection::song::constants::FLAC_TYPE); icarus_meta::detection::song::constants::FLAC_TYPE,
);
match crate::api::create_song::create( match crate::api::create_song::create(
app, &metadata, user_id, &song_type, app, &metadata, user_id, &song_type,
@@ -103,10 +104,10 @@ pub async fn prep_song(
// Process data here... // Process data here...
match crate::api::parsing::parse_response_into_bytes(response).await { match crate::api::parsing::parse_response_into_bytes(response).await {
Ok(song_bytes) => { Ok(song_bytes) => {
let song = simodels::song::Song { let song = icarus_models::song::Song {
directory: sienvy::environment::get_root_directory().value, directory: icarus_envy::environment::get_root_directory().await.value,
filename: simodels::song::generate_filename( filename: icarus_models::song::generate_filename(
simodels::types::MusicType::FlacExtension, icarus_models::types::MusicType::FlacExtension,
true, true,
) )
.unwrap(), .unwrap(),
@@ -222,18 +223,18 @@ async fn init_queued_coverart(
bytes: Vec<u8>, bytes: Vec<u8>,
) -> crate::queued_item::QueuedCoverArt { ) -> crate::queued_item::QueuedCoverArt {
// TODO: Consider separating song and coverart when saving to the filesystem // TODO: Consider separating song and coverart when saving to the filesystem
let covart_type = if file_type == simeta::detection::coverart::constants::PNG_TYPE { let covart_type = if file_type == icarus_meta::detection::coverart::constants::PNG_TYPE {
simodels::types::CoverArtType::PngExtension icarus_models::types::CoverArtType::PngExtension
} else if file_type == simeta::detection::coverart::constants::JPEG_TYPE { } else if file_type == icarus_meta::detection::coverart::constants::JPEG_TYPE {
simodels::types::CoverArtType::JpegExtension icarus_models::types::CoverArtType::JpegExtension
} else if file_type == simeta::detection::coverart::constants::JPG_TYPE { } else if file_type == icarus_meta::detection::coverart::constants::JPG_TYPE {
simodels::types::CoverArtType::JpgExtension icarus_models::types::CoverArtType::JpgExtension
} else { } else {
simodels::types::CoverArtType::None icarus_models::types::CoverArtType::None
}; };
let coverart = simodels::coverart::CoverArt { let coverart = icarus_models::coverart::CoverArt {
directory: sienvy::environment::get_root_directory().value, directory: icarus_envy::environment::get_root_directory().await.value,
filename: match simodels::coverart::generate_filename(covart_type, true) { filename: match icarus_models::coverart::generate_filename(covart_type, true) {
Ok(filename) => filename, Ok(filename) => filename,
Err(err) => { Err(err) => {
eprintln!("Error generating CoverArt filename: {err:?}"); eprintln!("Error generating CoverArt filename: {err:?}");
@@ -254,8 +255,8 @@ async fn init_queued_coverart(
} }
pub async fn cleanup( pub async fn cleanup(
song: &simodels::song::Song, song: &icarus_models::song::Song,
coverart: &simodels::coverart::CoverArt, coverart: &icarus_models::coverart::CoverArt,
) -> Result<(), std::io::Error> { ) -> Result<(), std::io::Error> {
match song.remove_from_filesystem() { match song.remove_from_filesystem() {
Ok(_) => {} Ok(_) => {}
+2 -2
View File
@@ -1,13 +1,13 @@
#[derive(Clone, Debug, Default)] #[derive(Clone, Debug, Default)]
pub struct QueuedSong { pub struct QueuedSong {
pub id: uuid::Uuid, pub id: uuid::Uuid,
pub song: simodels::song::Song, pub song: icarus_models::song::Song,
pub path: String, pub path: String,
} }
#[derive(Clone, Debug, Default)] #[derive(Clone, Debug, Default)]
pub struct QueuedCoverArt { pub struct QueuedCoverArt {
pub id: uuid::Uuid, pub id: uuid::Uuid,
pub coverart: simodels::coverart::CoverArt, pub coverart: icarus_models::coverart::CoverArt,
pub path: String, pub path: String,
} }