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"]
 | 
					ignored = ["progenitor-client", "regress"]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
[dependencies]
 | 
					[dependencies]
 | 
				
			||||||
bon = "2.3.0"
 | 
					bon = "3.0.0"
 | 
				
			||||||
chrono = { version = "0.4.38", features = ["serde"] }
 | 
					chrono = { version = "0.4.38", features = ["serde"] }
 | 
				
			||||||
clap = { version = "4.5.20", features = ["derive"] }
 | 
					clap = { version = "4.5.20", features = ["derive"] }
 | 
				
			||||||
clap-verbosity-flag = "2.2.2"
 | 
					clap-verbosity-flag = "2.2.2"
 | 
				
			||||||
color-eyre = "0.6.3"
 | 
					color-eyre = "0.6.3"
 | 
				
			||||||
dialoguer = "0.11.0"
 | 
					dialoguer = "0.12.0"
 | 
				
			||||||
directories = "6.0.0"
 | 
					directories = "6.0.0"
 | 
				
			||||||
figment = { version = "0.10.19", features = ["env", "toml"] }
 | 
					figment = { version = "0.10.19", features = ["env", "toml"] }
 | 
				
			||||||
figment_file_provider_adapter = "0.1.1"
 | 
					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
 | 
					- **List** all albums on your Immich server
 | 
				
			||||||
- **Delete** albums (all or empty ones only)
 | 
					- **Delete** albums (all or empty ones only)
 | 
				
			||||||
- **Auto-create** albums from external libraries folder structure
 | 
					- **Auto-create** albums from external libraries folder structure
 | 
				
			||||||
 | 
					- **List assets of an album** by album name
 | 
				
			||||||
 | 
					
 | 
				
			||||||
### Assets
 | 
					### Assets
 | 
				
			||||||
- **List** assets (all or offline only)
 | 
					- **List** assets (all or offline only)
 | 
				
			||||||
| 
						 | 
					@ -105,6 +106,11 @@ Auto-create albums from folder structure:
 | 
				
			||||||
immich-tools albums auto-create --album-name-separator "/"
 | 
					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
 | 
					### Assets
 | 
				
			||||||
 | 
					
 | 
				
			||||||
List all assets:
 | 
					List all assets:
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										18
									
								
								flake.lock
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										18
									
								
								flake.lock
									
										
									
										generated
									
									
									
								
							| 
						 | 
					@ -3,11 +3,11 @@
 | 
				
			||||||
    "flake-compat": {
 | 
					    "flake-compat": {
 | 
				
			||||||
      "flake": false,
 | 
					      "flake": false,
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1696426674,
 | 
					        "lastModified": 1747046372,
 | 
				
			||||||
        "narHash": "sha256-kvjfFW7WAETZlt09AgDn1MrtKzP7t90Vf7vypd3OL1U=",
 | 
					        "narHash": "sha256-CIVLLkVgvHYbgI2UpXvIIBJ12HWgX+fjA8Xf8PUmqCY=",
 | 
				
			||||||
        "owner": "edolstra",
 | 
					        "owner": "edolstra",
 | 
				
			||||||
        "repo": "flake-compat",
 | 
					        "repo": "flake-compat",
 | 
				
			||||||
        "rev": "0f9255e01c2351cc7d116c072cb317785dd33b33",
 | 
					        "rev": "9100a0f413b0c601e0533d1d94ffd501ce2e7885",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
| 
						 | 
					@ -57,11 +57,11 @@
 | 
				
			||||||
    },
 | 
					    },
 | 
				
			||||||
    "nixpkgs": {
 | 
					    "nixpkgs": {
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1753939845,
 | 
					        "lastModified": 1761373498,
 | 
				
			||||||
        "narHash": "sha256-K2ViRJfdVGE8tpJejs8Qpvvejks1+A4GQej/lBk5y7I=",
 | 
					        "narHash": "sha256-Q/uhWNvd7V7k1H1ZPMy/vkx3F8C13ZcdrKjO7Jv7v0c=",
 | 
				
			||||||
        "owner": "NixOS",
 | 
					        "owner": "NixOS",
 | 
				
			||||||
        "repo": "nixpkgs",
 | 
					        "repo": "nixpkgs",
 | 
				
			||||||
        "rev": "94def634a20494ee057c76998843c015909d6311",
 | 
					        "rev": "6a08e6bb4e46ff7fcbb53d409b253f6bad8a28ce",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
| 
						 | 
					@ -80,11 +80,11 @@
 | 
				
			||||||
        ]
 | 
					        ]
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "locked": {
 | 
					      "locked": {
 | 
				
			||||||
        "lastModified": 1750779888,
 | 
					        "lastModified": 1760663237,
 | 
				
			||||||
        "narHash": "sha256-wibppH3g/E2lxU43ZQHC5yA/7kIKLGxVEnsnVK1BtRg=",
 | 
					        "narHash": "sha256-BflA6U4AM1bzuRMR8QqzPXqh8sWVCNDzOdsxXEguJIc=",
 | 
				
			||||||
        "owner": "cachix",
 | 
					        "owner": "cachix",
 | 
				
			||||||
        "repo": "git-hooks.nix",
 | 
					        "repo": "git-hooks.nix",
 | 
				
			||||||
        "rev": "16ec914f6fb6f599ce988427d9d94efddf25fe6d",
 | 
					        "rev": "ca5b894d3e3e151ffc1db040b6ce4dcc75d31c37",
 | 
				
			||||||
        "type": "github"
 | 
					        "type": "github"
 | 
				
			||||||
      },
 | 
					      },
 | 
				
			||||||
      "original": {
 | 
					      "original": {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -95,6 +95,13 @@ pub(crate) enum AlbumsCommands {
 | 
				
			||||||
    /// List all albums
 | 
					    /// List all albums
 | 
				
			||||||
    #[serde(rename = "list")]
 | 
					    #[serde(rename = "list")]
 | 
				
			||||||
    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)]
 | 
					#[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 auto_create_albums;
 | 
				
			||||||
pub mod delete_albums;
 | 
					pub mod delete_albums;
 | 
				
			||||||
pub mod delete_assets;
 | 
					pub mod delete_assets;
 | 
				
			||||||
 | 
					pub mod list_album_assets;
 | 
				
			||||||
pub mod list_albums;
 | 
					pub mod list_albums;
 | 
				
			||||||
pub mod list_assets;
 | 
					pub mod list_assets;
 | 
				
			||||||
pub mod list_libraries;
 | 
					pub mod list_libraries;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -16,6 +16,7 @@ use color_eyre::Section;
 | 
				
			||||||
use commands::auto_create_albums::auto_create_albums;
 | 
					use commands::auto_create_albums::auto_create_albums;
 | 
				
			||||||
use commands::delete_albums::delete_albums;
 | 
					use commands::delete_albums::delete_albums;
 | 
				
			||||||
use commands::delete_assets::delete_assets;
 | 
					use commands::delete_assets::delete_assets;
 | 
				
			||||||
 | 
					use commands::list_album_assets::list_album_assets;
 | 
				
			||||||
use commands::list_albums::list_albums;
 | 
					use commands::list_albums::list_albums;
 | 
				
			||||||
use commands::list_assets::list_assets;
 | 
					use commands::list_assets::list_assets;
 | 
				
			||||||
use commands::list_libraries::list_libraries;
 | 
					use commands::list_libraries::list_libraries;
 | 
				
			||||||
| 
						 | 
					@ -86,6 +87,7 @@ async fn main() -> Result<()> {
 | 
				
			||||||
            } => auto_create_albums(ctx, album_name_separator.to_string()).await,
 | 
					            } => auto_create_albums(ctx, album_name_separator.to_string()).await,
 | 
				
			||||||
            AlbumsCommands::Delete { empty } => delete_albums(ctx, *empty).await,
 | 
					            AlbumsCommands::Delete { empty } => delete_albums(ctx, *empty).await,
 | 
				
			||||||
            AlbumsCommands::List {} => list_albums(ctx).await,
 | 
					            AlbumsCommands::List {} => list_albums(ctx).await,
 | 
				
			||||||
 | 
					            AlbumsCommands::ListAssets { album } => list_album_assets(ctx, album).await,
 | 
				
			||||||
        },
 | 
					        },
 | 
				
			||||||
        Commands::Assets { assets_command } => match assets_command {
 | 
					        Commands::Assets { assets_command } => match assets_command {
 | 
				
			||||||
            AssetsCommands::Delete { offline } => delete_assets(ctx, *offline).await,
 | 
					            AssetsCommands::Delete { offline } => delete_assets(ctx, *offline).await,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue