Compare commits
34 commits
72efbfd376
...
70a6dc6cbf
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
70a6dc6cbf | ||
|
|
f176d20433 | ||
|
|
5ba2348179 | ||
|
|
39025d369c | ||
|
|
5d01cabf13 | ||
|
|
66b233718c | ||
|
|
ba9c28c43a | ||
|
|
5795023b62 | ||
|
|
8da5e1a124 | ||
|
|
4361390aa9 | ||
|
|
1ae0d0ea16 | ||
|
|
b282580eda | ||
|
|
81b1f76088 | ||
|
|
1e25142fa7 | ||
|
|
df35ab850b | ||
|
|
b27b5afd9c | ||
|
|
08fe4b1340 | ||
|
|
9c8f2d02ce | ||
|
|
7599029e3d | ||
| 387f99a356 | |||
|
|
4434b9922a | ||
|
|
e01c43770b | ||
|
|
cdf0a1173a | ||
|
|
687a6d12d0 | ||
|
|
cad6018ae2 | ||
|
|
a83b42b96b | ||
|
|
614080bf73 | ||
|
|
f205d39154 | ||
|
|
9d233518f0 | ||
|
|
41db15ffe8 | ||
|
|
775d3ac3d2 | ||
|
|
aa18fc3525 | ||
| 9ad599a2b4 | |||
| 07907b2ce2 |
8 changed files with 479 additions and 415 deletions
818
Cargo.lock
generated
818
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
|
@ -12,12 +12,12 @@ keywords = ["immich"]
|
|||
ignored = ["progenitor-client", "regress"]
|
||||
|
||||
[dependencies]
|
||||
bon = "2.3.0"
|
||||
bon = "3.0.0"
|
||||
chrono = { version = "0.4.38", features = ["serde"] }
|
||||
clap = { version = "4.5.20", features = ["derive"] }
|
||||
clap-verbosity-flag = "2.2.2"
|
||||
color-eyre = "0.6.3"
|
||||
dialoguer = "0.11.0"
|
||||
dialoguer = "0.12.0"
|
||||
directories = "6.0.0"
|
||||
figment = { version = "0.10.19", features = ["env", "toml"] }
|
||||
figment_file_provider_adapter = "0.1.1"
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@ video backup solution. This tool provides various utilities to manage your Immic
|
|||
- **List** all albums on your Immich server
|
||||
- **Delete** albums (all or empty ones only)
|
||||
- **Auto-create** albums from external libraries folder structure
|
||||
- **List assets of an album** by album name
|
||||
|
||||
### Assets
|
||||
- **List** assets (all or offline only)
|
||||
|
|
@ -105,6 +106,11 @@ Auto-create albums from folder structure:
|
|||
immich-tools albums auto-create --album-name-separator "/"
|
||||
```
|
||||
|
||||
List assets belonging to a specific album (by album name):
|
||||
```bash
|
||||
immich-tools albums list-assets --album "My Album"
|
||||
```
|
||||
|
||||
### Assets
|
||||
|
||||
List all assets:
|
||||
|
|
|
|||
18
flake.lock
generated
18
flake.lock
generated
|
|
@ -3,11 +3,11 @@
|
|||
"flake-compat": {
|
||||
"flake": false,
|
||||
"locked": {
|
||||
"lastModified": 1696426674,
|
||||
"narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
|
||||
"lastModified": 1747046372,
|
||||
"narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=",
|
||||
"owner": "edolstra",
|
||||
"repo": "flake-compat",
|
||||
"rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
|
||||
"rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
@ -57,11 +57,11 @@
|
|||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1753939845,
|
||||
"narHash": "sha256-K2ViRJfdVGE8tpJejs8Qpvvejks1+A4GQej/lBk5y7I=",
|
||||
"lastModified": 1761373498,
|
||||
"narHash": "sha256-Q/uhWNvd7V7k1H1ZPMy/vkx3F8C13ZcdrKjO7Jv7v0c=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "94def634a20494ee057c76998843c015909d6311",
|
||||
"rev": "6a08e6bb4e46ff7fcbb53d409b253f6bad8a28ce",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
@ -80,11 +80,11 @@
|
|||
]
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1750779888,
|
||||
"narHash": "sha256-wibppH3g/E2lxU43ZQHC5yA/7kIKLGxVEnsnVK1BtRg=",
|
||||
"lastModified": 1760663237,
|
||||
"narHash": "sha256-BflA6U4AM1bzuRMR8QqzPXqh8sWVCNDzOdsxXEguJIc=",
|
||||
"owner": "cachix",
|
||||
"repo": "git-hooks.nix",
|
||||
"rev": "16ec914f6fb6f599ce988427d9d94efddf25fe6d",
|
||||
"rev": "ca5b894d3e3e151ffc1db040b6ce4dcc75d31c37",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
|
|
|
|||
|
|
@ -95,6 +95,13 @@ pub(crate) enum AlbumsCommands {
|
|||
/// List all albums
|
||||
#[serde(rename = "list")]
|
||||
List {},
|
||||
/// List all assets that belong to a specific album
|
||||
#[serde(rename = "list-assets")]
|
||||
ListAssets {
|
||||
/// Name of the album to list assets for
|
||||
#[arg(long)]
|
||||
album: String,
|
||||
},
|
||||
}
|
||||
|
||||
#[derive(Serialize, Subcommand)]
|
||||
|
|
|
|||
38
src/commands/list_album_assets.rs
Normal file
38
src/commands/list_album_assets.rs
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
use crate::{
|
||||
actions::{
|
||||
action::Action, fetch_album_assets::FetchAlbumAssets, fetch_all_albums::FetchAllAlbums,
|
||||
},
|
||||
context::Context,
|
||||
};
|
||||
use color_eyre::eyre::{eyre, Result};
|
||||
use tabled::{settings::Style, Table, Tabled};
|
||||
|
||||
#[derive(Tabled)]
|
||||
struct AssetRow {
|
||||
#[tabled(rename = "Path")]
|
||||
original_file_path: String,
|
||||
}
|
||||
|
||||
pub async fn list_album_assets(ctx: Context, album_name: &str) -> Result<()> {
|
||||
let albums = FetchAllAlbums::new(()).execute(&ctx).await?;
|
||||
|
||||
let album = albums
|
||||
.into_iter()
|
||||
.find(|a| a.name == album_name)
|
||||
.ok_or_else(|| eyre!("Album not found: {}", album_name))?;
|
||||
|
||||
let mut assets: Vec<_> = FetchAlbumAssets::new(album)
|
||||
.execute(&ctx)
|
||||
.await?
|
||||
.into_iter()
|
||||
.map(|asset| AssetRow {
|
||||
original_file_path: asset.original_path.to_string_lossy().to_string(),
|
||||
})
|
||||
.collect();
|
||||
|
||||
assets.sort_by_key(|row| row.original_file_path.clone());
|
||||
|
||||
println!("{}", Table::new(assets).with(Style::rounded()));
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
|
@ -1,6 +1,7 @@
|
|||
pub mod auto_create_albums;
|
||||
pub mod delete_albums;
|
||||
pub mod delete_assets;
|
||||
pub mod list_album_assets;
|
||||
pub mod list_albums;
|
||||
pub mod list_assets;
|
||||
pub mod list_libraries;
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@ use color_eyre::Section;
|
|||
use commands::auto_create_albums::auto_create_albums;
|
||||
use commands::delete_albums::delete_albums;
|
||||
use commands::delete_assets::delete_assets;
|
||||
use commands::list_album_assets::list_album_assets;
|
||||
use commands::list_albums::list_albums;
|
||||
use commands::list_assets::list_assets;
|
||||
use commands::list_libraries::list_libraries;
|
||||
|
|
@ -86,6 +87,7 @@ async fn main() -> Result<()> {
|
|||
} => auto_create_albums(ctx, album_name_separator.to_string()).await,
|
||||
AlbumsCommands::Delete { empty } => delete_albums(ctx, *empty).await,
|
||||
AlbumsCommands::List {} => list_albums(ctx).await,
|
||||
AlbumsCommands::ListAssets { album } => list_album_assets(ctx, album).await,
|
||||
},
|
||||
Commands::Assets { assets_command } => match assets_command {
|
||||
AssetsCommands::Delete { offline } => delete_assets(ctx, *offline).await,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue