models

package
v0.0.34 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Mar 23, 2026 License: BSD-3-Clause Imports: 6 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var LogLevel = &slog.LevelVar{}

Functions

func NullFloat64Ptr

func NullFloat64Ptr(nf sql.NullFloat64) *float64

func NullInt64Ptr

func NullInt64Ptr(ni sql.NullInt64) *int64

func NullStringPtr

func NullStringPtr(ns sql.NullString) *string

func SetupLogging

func SetupLogging(verbose bool)

func ToDBUpsert

func ToDBUpsert(m Media) db.UpsertMediaParams

func ToNullFloat64

func ToNullFloat64(f *float64) sql.NullFloat64

func ToNullInt64

func ToNullInt64(i *int64) sql.NullInt64

func ToNullString

func ToNullString(s *string) sql.NullString

Types

type AggregateFlags

type AggregateFlags struct {
	BigDirs           bool     `short:"B" help:"Aggregate by parent directory" group:"Aggregate"`
	FileCounts        string   `help:"Filter by number of files in directory (e.g., >5, 10%1)" group:"Aggregate"`
	GroupByExtensions bool     `help:"Group by file extensions" group:"Aggregate"`
	GroupBySize       bool     `help:"Group by size buckets" group:"Aggregate"`
	GroupByParent     bool     `help:"Group media by parent directory with counts and totals" group:"Aggregate"`
	Depth             int      `short:"D" help:"Aggregate at specific directory depth" group:"Aggregate"`
	MinDepth          int      `default:"0" help:"Minimum depth for aggregation" group:"Aggregate"`
	MaxDepth          int      `help:"Maximum depth for aggregation" group:"Aggregate"`
	Parents           bool     `help:"Include parent directories in aggregation" group:"Aggregate"`
	FoldersOnly       bool     `help:"Only show folders" group:"Aggregate"`
	FilesOnly         bool     `help:"Only show files" group:"Aggregate"`
	FolderSizes       []string `help:"Filter folders by total size" group:"Aggregate"`
	FolderCounts      string   `help:"Filter folders by number of subfolders" group:"Aggregate"`
}

type CatStat

type CatStat struct {
	Category string `json:"category"`
	Count    int64  `json:"count"`
}

type ControlFlags

type ControlFlags struct {
	MpvSocket  string `help:"Mpv socket path" group:"Playback"`
	CastDevice string `alias:"cast-to" help:"Chromecast device name" group:"Playback"`
	Verbose    bool   `short:"v" help:"Enable verbose logging"`
}

ControlFlags are a subset of flags for simple control commands

type CoreFlags

type CoreFlags struct {
	// Common options
	Verbose   bool   `short:"v" help:"Enable verbose logging"`
	Simulate  bool   `help:"Dry run; don't actually do anything"`
	DryRun    bool   `kong:"-"` // Alias for Simulate
	NoConfirm bool   `short:"y" help:"Don't ask for confirmation"`
	Yes       bool   `kong:"-"` // Alias for NoConfirm
	Timeout   string `short:"T" help:"Quit after N minutes/seconds"`
}

CoreFlags are essential flags shared across most binaries/commands

func (*CoreFlags) AfterApply

func (c *CoreFlags) AfterApply() error

type DUResponse added in v0.0.31

type DUResponse struct {
	Folders     []FolderStats       `json:"folders"`
	Files       []MediaWithDB       `json:"files"`
	TotalCount  int                 `json:"total_count"`      // Total items (folders + files)
	FolderCount int                 `json:"folder_count"`     // Number of folders
	FileCount   int                 `json:"file_count"`       // Number of direct files
	Counts      *FilterBinsResponse `json:"counts,omitempty"` // Filter bins data (when include_counts=true)
}

DUResponse is the response for the /api/du endpoint

type DatabaseFlags

type DatabaseFlags struct {
	Databases []string `help:"Specific database paths to query (must be in server's allowed list). Can be specified multiple times." group:"Database"`
}

type DatabaseInfo

type DatabaseInfo struct {
	Databases []string `json:"databases"`
	ReadOnly  bool     `json:"read_only"`
	Dev       bool     `json:"dev"`
}

type DedupeFlags

type DedupeFlags struct {
	Audio              bool    `help:"Dedupe database by artist + album + title" group:"Dedupe"`
	ExtractorID        bool    `alias:"id" help:"Dedupe database by extractor_id" group:"Dedupe"`
	TitleOnly          bool    `help:"Dedupe database by title" group:"Dedupe"`
	DurationOnly       bool    `help:"Dedupe database by duration" group:"Dedupe"`
	Filesystem         bool    `alias:"fs" help:"Dedupe filesystem database (hash)" group:"Dedupe"`
	CompareDirs        bool    `help:"Compare directories" group:"Dedupe"`
	Basename           bool    `help:"Match by basename similarity" group:"Dedupe"`
	Dirname            bool    `help:"Match by dirname similarity" group:"Dedupe"`
	MinSimilarityRatio float64 `default:"0.8" help:"Filter out matches with less than this ratio (0.7-0.9)" group:"Dedupe"`
	DedupeCmd          string  `help:"Command to run for deduplication (rmlint-style: cmd duplicate keep)" group:"Dedupe"`
}

type DeleteRequest

type DeleteRequest struct {
	Path    string `json:"path"`
	Restore bool   `json:"restore"`
}

type DeletedFlags

type DeletedFlags struct {
	HideDeleted bool `default:"true" help:"Exclude deleted files from results" group:"Deleted"`
	OnlyDeleted bool `help:"Include only deleted files in results" group:"Deleted"`
}

type DisplayFlags

type DisplayFlags struct {
	Columns   []string `short:"c" help:"Columns to display" group:"Display"`
	JSON      bool     `short:"j" help:"Output results as JSON" group:"Display"`
	Summarize bool     `help:"Print aggregate statistics" group:"Display"`
	Frequency string   `short:"f" help:"Group statistics by time frequency (daily, weekly, monthly, yearly)" group:"Display"`
	TUI       bool     `help:"Interactive TUI mode" group:"Display"`
}

type ErrorResponse

type ErrorResponse struct {
	Error string `json:"error"`
}

type FTSFlags

type FTSFlags struct {
	FTS      bool   `help:"Use FTS5 full-text search" group:"FTS"`
	FTSTable string `default:"media_fts" help:"FTS table name" group:"FTS"`
	NoFTS    bool   `help:"Disable full-text search, use substring search only" group:"FTS"`
	Related  int    `short:"R" help:"Find media related to the first result" group:"FTS"`
}

type FilterBin

type FilterBin struct {
	Label string `json:"label"`
	Min   int64  `json:"min,omitempty"`
	Max   int64  `json:"max,omitempty"`
	Value int64  `json:"value,omitempty"`
}

type FilterBinsResponse

type FilterBinsResponse struct {
	// Percentiles for slider calculations (0%, 16.6%, 33.3%, 50%, 66.6%, 83.3%, 100%)
	// Frontend should use percentiles[0] as min and percentiles[len-1] as max
	EpisodesPercentiles   []int64 `json:"episodes_percentiles"`
	SizePercentiles       []int64 `json:"size_percentiles"`
	DurationPercentiles   []int64 `json:"duration_percentiles"`
	ModifiedPercentiles   []int64 `json:"modified_percentiles"`
	CreatedPercentiles    []int64 `json:"created_percentiles"`
	DownloadedPercentiles []int64 `json:"downloaded_percentiles"`

	// Media type counts (special case - not a percentile distribution)
	MediaType []FilterBin `json:"media_type"`
}

type FilterFlags

type FilterFlags struct {
	Search           []string `help:"Search terms (space-separated for AND, | for OR)" group:"Filter"`
	Size             []string `short:"S" help:"Size range (e.g., >100MB, 1GB%10)" group:"Filter"`
	Duration         []string `short:"d" help:"Duration range (e.g., >1hour, 30min%10)" group:"Filter"`
	Modified         []string `help:"Filter by modification time" group:"Filter"`
	Created          []string `help:"Filter by creation time" group:"Filter"`
	Downloaded       []string `help:"Filter by download time" group:"Filter"`
	DurationFromSize string   `help:"Constrain media to duration of videos which match any size constraints" group:"Filter"`
	Watched          *bool    `help:"Filter by watched status (true/false)" group:"Filter"`
	Unfinished       bool     `help:"Has playhead but not finished" group:"Filter"`
	Partial          string   `short:"P" help:"Filter by partial playback status" group:"Filter"`
	PlayCountMin     int      `help:"Minimum play count" group:"Filter"`
	PlayCountMax     int      `help:"Maximum play count" group:"Filter"`
	Completed        bool     `help:"Show only completed items" group:"Filter"`
	InProgress       bool     `help:"Show only items in progress" group:"Filter"`
	WithCaptions     bool     `help:"Show only items with captions" group:"Filter"`
	FlexibleSearch   bool     `help:"Flexible search (fuzzy)" group:"Filter"`
	Exact            bool     `help:"Exact match for search" group:"Filter"`
	Where            []string `short:"w" help:"SQL where clause(s)" group:"Filter"`
	Exists           bool     `help:"Filter out non-existent files" group:"Filter"`
	FetchSiblings    string   `short:"o" help:"Fetch siblings of matched files (each, all, if-audiobook)" group:"Filter"`
	FetchSiblingsMax int      `help:"Maximum number of siblings to fetch" group:"Filter"`
}

type FolderStats

type FolderStats struct {
	Path           string        `json:"path"`
	Count          int           `json:"count"`
	ExistsCount    int           `json:"exists_count"`
	PlayedCount    int           `json:"played_count"`
	DeletedCount   int           `json:"deleted_count"`
	FolderCount    int           `json:"folder_count"`
	TotalSize      int64         `json:"total_size"`
	TotalDuration  int64         `json:"total_duration"`
	AvgSize        int64         `json:"avg_size"`
	AvgDuration    int64         `json:"avg_duration"`
	MedianSize     int64         `json:"median_size"`
	MedianDuration int64         `json:"median_duration"`
	TimeLastPlayed int64         `json:"time_last_played"`
	Files          []MediaWithDB `json:"files,omitempty"`
}

FolderStats aggregates media by folder

type GenreStat

type GenreStat struct {
	Genre string `json:"genre"`
	Count int64  `json:"count"`
}

type GlobalFlags

type GlobalFlags struct {
	CoreFlags        `embed:""`
	QueryFlags       `embed:""`
	PathFilterFlags  `embed:""`
	FilterFlags      `embed:""`
	MediaFilterFlags `embed:""`
	TimeFilterFlags  `embed:""`
	DeletedFlags     `embed:""`
	SortFlags        `embed:""`
	DisplayFlags     `embed:""`
	AggregateFlags   `embed:""`
	TextFlags        `embed:""`
	SimilarityFlags  `embed:""`
	DedupeFlags      `embed:""`
	FTSFlags         `embed:""`
	PlaybackFlags    `embed:""`
	MpvActionFlags   `embed:""`
	PostActionFlags  `embed:""`
	HashingFlags     `embed:""`
	MergeFlags       `embed:""`
	DatabaseFlags    `embed:""`

	Threads      int  `help:"Use N threads for parallel processing"`
	IgnoreErrors bool `short:"i" help:"Ignore errors and continue to next file"`
}

GlobalFlags are flags available to disco data commands (print, search, du, etc) This struct is used for passing flags to query and utility functions. Command structs should embed only the flag structs they need.

func BuildQueryGlobalFlags added in v0.0.30

func BuildQueryGlobalFlags(
	core CoreFlags,
	query QueryFlags,
	pathFilter PathFilterFlags,
	filter FilterFlags,
	mediaFilter MediaFilterFlags,
	timeFilter TimeFilterFlags,
	deleted DeletedFlags,
	sort SortFlags,
	display DisplayFlags,
	fts FTSFlags,
) GlobalFlags

BuildQueryGlobalFlags constructs GlobalFlags for query-based commands This reduces boilerplate in command Run() methods

type HashingFlags

type HashingFlags struct {
	HashGap       float64 `default:"0.1" help:"Gap between segments (0.0-1.0 as percentage of file size, or absolute bytes if >1)" group:"Hashing"`
	HashChunkSize int64   `help:"Size of each segment to hash" group:"Hashing"`
	HashThreads   int     `default:"1" help:"Number of threads to use for hashing a single file" group:"Hashing"`
}

type IndexStat added in v0.0.34

type IndexStat struct {
	IndexName string `json:"index_name"`
	TableName string `json:"table_name"`
	SizeEst   int64  `json:"size_est,omitempty"`
	Used      bool   `json:"used,omitempty"`
}

IndexStat represents database index statistics

type LsEntry

type LsEntry struct {
	Path      string `json:"path"`
	Name      string `json:"name"`
	IsDir     bool   `json:"is_dir"`
	MediaType string `json:"media_type"`
}

type Media

type Media struct {
	Path            string   `json:"path"`
	PathTokenized   *string  `json:"path_tokenized,omitempty"`
	Title           *string  `json:"title,omitempty"`
	Duration        *int64   `json:"duration,omitempty"`
	Size            *int64   `json:"size,omitempty"`
	TimeCreated     *int64   `json:"time_created,omitempty"`
	TimeModified    *int64   `json:"time_modified,omitempty"`
	TimeDeleted     *int64   `json:"time_deleted,omitempty"`
	TimeFirstPlayed *int64   `json:"time_first_played,omitempty"`
	TimeLastPlayed  *int64   `json:"time_last_played,omitempty"`
	PlayCount       *int64   `json:"play_count,omitempty"`
	Playhead        *int64   `json:"playhead,omitempty"`
	MediaType       *string  `json:"media_type,omitempty"`
	Width           *int64   `json:"width,omitempty"`
	Height          *int64   `json:"height,omitempty"`
	Fps             *float64 `json:"fps,omitempty"`
	VideoCodecs     *string  `json:"video_codecs,omitempty"`
	AudioCodecs     *string  `json:"audio_codecs,omitempty"`
	SubtitleCodecs  *string  `json:"subtitle_codecs,omitempty"`
	VideoCount      *int64   `json:"video_count,omitempty"`
	AudioCount      *int64   `json:"audio_count,omitempty"`
	SubtitleCount   *int64   `json:"subtitle_count,omitempty"`
	Album           *string  `json:"album,omitempty"`
	Artist          *string  `json:"artist,omitempty"`
	Genre           *string  `json:"genre,omitempty"`
	Categories      *string  `json:"categories,omitempty"`
	Description     *string  `json:"description,omitempty"`
	Language        *string  `json:"language,omitempty"`
	TimeDownloaded  *int64   `json:"time_downloaded,omitempty"`
	Score           *float64 `json:"score,omitempty"`

	Fasthash  *string `json:"fasthash,omitempty"`
	Sha256    *string `json:"sha256,omitempty"`
	IsDeduped *int64  `json:"is_deduped,omitempty"`

	TrackNumber     *int64  `json:"track_number,omitempty"`
	ContainerFormat *string `json:"container_format,omitempty"` // From ffprobe format_name
}

func FromDB

func FromDB(m db.Media) Media

func (*Media) Extension

func (m *Media) Extension() string

func (*Media) Parent

func (m *Media) Parent() string

func (*Media) ParentAtDepth

func (m *Media) ParentAtDepth(depth int) string

func (*Media) Stem

func (m *Media) Stem() string

type MediaFilterFlags

type MediaFilterFlags struct {
	Category        []string `help:"Filter by category" group:"MediaFilter"`
	Genre           string   `help:"Filter by genre" group:"MediaFilter"`
	Language        []string `help:"Filter by language" group:"MediaFilter"`
	Ext             []string `short:"e" help:"Filter by extensions (e.g., .mp4,.mkv)" group:"MediaFilter"`
	VideoOnly       bool     `help:"Only video files" group:"MediaFilter"`
	AudioOnly       bool     `help:"Only audio files" group:"MediaFilter"`
	ImageOnly       bool     `help:"Only image files" group:"MediaFilter"`
	TextOnly        bool     `help:"Only text/ebook files" group:"MediaFilter"`
	Portrait        bool     `help:"Only portrait orientation files" group:"MediaFilter"`
	ScanSubtitles   bool     `help:"Scan for external subtitles during import" group:"MediaFilter"`
	OnlineMediaOnly bool     `help:"Exclude local media" group:"MediaFilter"`
	LocalMediaOnly  bool     `help:"Exclude online media" group:"MediaFilter"`
}

func (*MediaFilterFlags) AfterApply

func (m *MediaFilterFlags) AfterApply() error

type MediaWithDB

type MediaWithDB struct {
	Media
	DB              string  `json:"db,omitempty"`
	Transcode       bool    `json:"transcode"`
	CaptionText     string  `json:"caption_text"`
	CaptionTime     float64 `json:"caption_time"`
	CaptionCount    int64   `json:"caption_count"`
	CaptionDuration int64   `json:"caption_duration"`
	EpisodeCount    int64   `json:"episode_count"`
	TotalSize       int64   `json:"total_size"`
	TotalDuration   int64   `json:"total_duration"`
}

MediaWithDB wraps Media with the database path it came from

func FromDBWithDB

func FromDBWithDB(m db.Media, dbPath string) MediaWithDB

type MergeFlags

type MergeFlags struct {
	OnlyTables        []string `short:"t" help:"Comma separated specific table(s)" group:"Merge"`
	PrimaryKeys       []string `help:"Comma separated primary keys" group:"Merge"`
	BusinessKeys      []string `help:"Comma separated business keys" group:"Merge"`
	Upsert            bool     `help:"Upsert rows on conflict" group:"Merge"`
	Ignore            bool     `help:"Ignore rows on conflict (only-new-rows)" group:"Merge"`
	OnlyNewRows       bool     `kong:"-"` // Alias for Ignore
	OnlyTargetColumns bool     `help:"Only copy columns that exist in target" group:"Merge"`
	SkipColumns       []string `help:"Columns to skip during merge" group:"Merge"`
}

func (*MergeFlags) AfterApply

func (m *MergeFlags) AfterApply() error

type MpvActionFlags

type MpvActionFlags struct {
	Cmd0        string `help:"Command to run if mpv exits with code 0" group:"MpvAction"`
	Cmd1        string `help:"Command to run if mpv exits with code 1" group:"MpvAction"`
	Cmd2        string `help:"Command to run if mpv exits with code 2" group:"MpvAction"`
	Cmd3        string `help:"Command to run if mpv exits with code 3" group:"MpvAction"`
	Cmd4        string `help:"Command to run if mpv exits with code 4" group:"MpvAction"`
	Cmd5        string `help:"Command to run if mpv exits with code 5" group:"MpvAction"`
	Cmd6        string `help:"Command to run if mpv exits with code 6" group:"MpvAction"`
	Cmd7        string `help:"Command to run if mpv exits with code 7" group:"MpvAction"`
	Cmd8        string `help:"Command to run if mpv exits with code 8" group:"MpvAction"`
	Cmd9        string `help:"Command to run if mpv exits with code 9" group:"MpvAction"`
	Cmd10       string `help:"Command to run if mpv exits with code 10" group:"MpvAction"`
	Cmd11       string `help:"Command to run if mpv exits with code 11" group:"MpvAction"`
	Cmd12       string `help:"Command to run if mpv exits with code 12" group:"MpvAction"`
	Cmd13       string `help:"Command to run if mpv exits with code 13" group:"MpvAction"`
	Cmd14       string `help:"Command to run if mpv exits with code 14" group:"MpvAction"`
	Cmd15       string `help:"Command to run if mpv exits with code 15" group:"MpvAction"`
	Cmd20       string `help:"Command to run if mpv exits with code 20" group:"MpvAction"`
	Cmd127      string `help:"Command to run if mpv exits with code 127" group:"MpvAction"`
	Interactive bool   `short:"I" help:"Interactive decision making after playback" group:"MpvAction"`
}

type PathFilterFlags

type PathFilterFlags struct {
	Include      []string `short:"s" help:"Include paths matching pattern" group:"PathFilter"`
	Exclude      []string `short:"E" help:"Exclude paths matching pattern" group:"PathFilter"`
	Regex        string   `help:"Filter paths by regex pattern" group:"PathFilter"`
	PathContains []string `help:"Path must contain all these strings" group:"PathFilter"`
	Paths        []string `help:"Exact paths to include" group:"PathFilter"`
}

type PlayResponse

type PlayResponse struct {
	Path string `json:"path"`
}

type PlaybackFlags

type PlaybackFlags struct {
	PlayInOrder           string   `short:"O" default:"natural_ps" help:"Play media in order" group:"Playback"`
	NoPlayInOrder         bool     `help:"Don't play media in order" group:"Playback"`
	Loop                  bool     `help:"Loop playback" group:"Playback"`
	Mute                  bool     `short:"M" help:"Start playback muted" group:"Playback"`
	OverridePlayer        string   `help:"Override default player (e.g. --player 'vlc')" group:"Playback"`
	Start                 string   `help:"Start playback at specific time/percentage" group:"Playback"`
	End                   string   `help:"Stop playback at specific time/percentage" group:"Playback"`
	Volume                int      `help:"Set initial volume (0-100)" group:"Playback"`
	Fullscreen            bool     `help:"Start in fullscreen" group:"Playback"`
	NoSubtitles           bool     `help:"Disable subtitles" group:"Playback"`
	SubtitleMix           float64  `default:"0.35" help:"Probability to play no-subtitle content" group:"Playback"`
	InterdimensionalCable int      `short:"4" alias:"4dtv" help:"Duration to play (in seconds) while changing the channel" group:"Playback"`
	Speed                 float64  `default:"1.0" help:"Playback speed" group:"Playback"`
	SavePlayhead          bool     `default:"true" help:"Save playback position on quit" group:"Playback"`
	MpvSocket             string   `help:"Mpv socket path" group:"Playback"`
	WatchLaterDir         string   `help:"Mpv watch_later directory" group:"Playback"`
	PlayerArgsSub         []string `help:"Player arguments for videos with subtitles" group:"Playback"`
	PlayerArgsNoSub       []string `help:"Player arguments for videos without subtitles" group:"Playback"`
	Cast                  bool     `help:"Cast to chromecast groups" group:"Playback"`
	CastDevice            string   `alias:"cast-to" help:"Chromecast device name" group:"Playback"`
	CastWithLocal         bool     `help:"Play music locally at the same time as chromecast" group:"Playback"`
}

type Playlist

type Playlist struct {
	ID              int64   `json:"id"`
	Path            *string `json:"path,omitempty"`
	Title           *string `json:"title,omitempty"`
	ExtractorKey    *string `json:"extractor_key,omitempty"`
	ExtractorConfig *string `json:"extractor_config,omitempty"`
	TimeDeleted     *int64  `json:"time_deleted,omitempty"`
	DB              string  `json:"db,omitempty"`
}

func PlaylistFromDB

func PlaylistFromDB(p db.Playlists, dbPath string) Playlist

type PlaylistResponse

type PlaylistResponse []string

type PostActionFlags

type PostActionFlags struct {
	Trash        bool   `help:"Trash files after action" group:"PostAction"`
	PostAction   string `help:"Post-action: none, delete, mark-deleted, move, copy" group:"PostAction"`
	DeleteFiles  bool   `help:"Delete files after action" group:"PostAction"`
	DeleteRows   bool   `help:"Delete rows from database" group:"PostAction"`
	MarkDeleted  bool   `help:"Mark as deleted in database" group:"PostAction"`
	MoveTo       string `help:"Move files to directory" group:"PostAction"`
	CopyTo       string `help:"Copy files to directory" group:"PostAction"`
	ActionLimit  int    `help:"Stop after N files" group:"PostAction"`
	ActionSize   string `help:"Stop after N bytes (e.g., 10GB)" group:"PostAction"`
	TrackHistory bool   `default:"true" help:"Track playback history" group:"PostAction"`
}

type ProgressRequest

type ProgressRequest struct {
	Path      string `json:"path"`
	Playhead  int64  `json:"playhead"`
	Duration  int64  `json:"duration"`
	Completed bool   `json:"completed"`
}

type QueryFlags

type QueryFlags struct {
	Query  string `short:"q" help:"Raw SQL query (overrides all query building)" group:"Query"`
	Limit  int    `short:"L" default:"100" help:"Limit results per database" group:"Query"`
	All    bool   `short:"a" help:"Return all results (no limit)" group:"Query"`
	Offset int    `help:"Skip N results" group:"Query"`
}

type RatStat

type RatStat struct {
	Rating int64 `json:"rating"`
	Count  int64 `json:"count"`
}

type SimilarityFlags

type SimilarityFlags struct {
	Similar         bool    `help:"Find similar files or folders" group:"Similarity"`
	SizesDelta      float64 `default:"10.0" help:"Size difference threshold (%)" group:"Similarity"`
	CountsDelta     float64 `default:"3.0" help:"File count difference threshold (%)" group:"Similarity"`
	DurationsDelta  float64 `default:"5.0" help:"Duration difference threshold (%)" group:"Similarity"`
	FilterNames     bool    `help:"Cluster by name similarity" group:"Similarity"`
	FilterSizes     bool    `help:"Cluster by size similarity" group:"Similarity"`
	FilterCounts    bool    `help:"Cluster by count similarity" group:"Similarity"`
	FilterDurations bool    `help:"Cluster by duration similarity" group:"Similarity"`
	TotalSizes      bool    `help:"Compare total sizes (folders only)" group:"Similarity"`
	TotalDurations  bool    `help:"Compare total durations (folders only)" group:"Similarity"`
	OnlyDuplicates  bool    `help:"Only show duplicate items" group:"Similarity"`
	OnlyOriginals   bool    `help:"Only show original items" group:"Similarity"`
	ClusterSort     bool    `short:"C" help:"Group items by similarity" group:"Similarity"`
	Clusters        int     `help:"Number of clusters" group:"Similarity"`
	TFIDF           bool    `help:"Use TF-IDF for clustering" group:"Similarity"`
	MoveGroups      bool    `help:"Move grouped files into separate directories" group:"Similarity"`
	PrintGroups     bool    `help:"Print clusters as JSON" group:"Similarity"`
}

type SortFlags

type SortFlags struct {
	SortBy  string `short:"u" default:"path" help:"Sort by field" group:"Sort"`
	Reverse bool   `short:"V" help:"Reverse sort order" group:"Sort"`
	NatSort bool   `short:"n" help:"Use natural sorting" group:"Sort"`
	Random  bool   `short:"r" help:"Random order" group:"Sort"`
	ReRank  string `short:"k" alias:"rerank" help:"Add key/value pairs re-rank sorting by multiple attributes (COLUMN=WEIGHT)" group:"Sort"`
}

type TextFlags

type TextFlags struct {
	RegexSort  bool     `help:"Sort by splitting lines and sorting words" alias:"rs" group:"Text"`
	Regexs     []string `help:"Regex patterns for line splitting" alias:"re" group:"Text"`
	WordSorts  []string `help:"Word sorting strategies" group:"Text"`
	LineSorts  []string `help:"Line sorting strategies" group:"Text"`
	Compat     bool     `help:"Use natsort compat mode" group:"Text"`
	Preprocess bool     `default:"true" help:"Remove junk common to filenames and URLs" group:"Text"`
	StopWords  []string `help:"List of words to ignore" group:"Text"`
	Duplicates *bool    `help:"Filter for duplicate words (true/false)" group:"Text"`
	UniqueOnly *bool    `help:"Filter for unique words (true/false)" group:"Text"`
}

type TimeFilterFlags

type TimeFilterFlags struct {
	CreatedAfter     string `help:"Created after date (YYYY-MM-DD)" group:"Time"`
	CreatedBefore    string `help:"Created before date (YYYY-MM-DD)" group:"Time"`
	ModifiedAfter    string `help:"Modified after date (YYYY-MM-DD)" group:"Time"`
	ModifiedBefore   string `help:"Modified before date (YYYY-MM-DD)" group:"Time"`
	DownloadedAfter  string `help:"Downloaded after date (YYYY-MM-DD)" group:"Time"`
	DownloadedBefore string `help:"Downloaded before date (YYYY-MM-DD)" group:"Time"`
	DeletedAfter     string `help:"Deleted after date (YYYY-MM-DD)" group:"Time"`
	DeletedBefore    string `help:"Deleted before date (YYYY-MM-DD)" group:"Time"`
	PlayedAfter      string `help:"Last played after date (YYYY-MM-DD)" group:"Time"`
	PlayedBefore     string `help:"Last played before date (YYYY-MM-DD)" group:"Time"`
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL