cmd

package
v0.1.0 Latest Latest
Warning

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

Go to latest
Published: Feb 17, 2026 License: MIT Imports: 16 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

This section is empty.

Types

type ActiveSession

type ActiveSession struct {
	User     string `json:"user"`
	Title    string `json:"title"`
	Type     string `json:"type"`
	Show     string `json:"show,omitempty"`
	Progress string `json:"progress"`
	Device   string `json:"device"`
	State    string `json:"state"`
}

type AudioCheckCmd

type AudioCheckCmd struct {
	Codecs      string `help:"Comma-separated list of audio codecs to check (e.g., aac,ac3,dts)" default:""`
	MinChannels int    `help:"Minimum number of audio channels" default:"2"`
	Section     string `help:"Library section ID to scan (empty = all sections)" default:""`
	Type        string `help:"Filter by type: movie, episode, or all" default:"all" enum:"movie,episode,all"`
	Limit       int    `help:"Maximum number of items to display" default:"0"`
	Output      string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

func (*AudioCheckCmd) Run

func (c *AudioCheckCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type AudioInfo

type AudioInfo struct {
	Title    string `json:"title"`
	Year     int    `json:"year,omitempty"`
	Type     string `json:"type"`
	Codec    string `json:"codec"`
	Channels int    `json:"channels"`
	Status   string `json:"status"`
}

type ClientContext

type ClientContext struct {
	Client  *plexclient.Client
	Ctx     context.Context
	Cancel  context.CancelFunc
	Timeout time.Duration
}

ClientContext holds the authenticated client and context for command execution.

func NewClientContext

func NewClientContext(cfg *config.Config) (*ClientContext, error)

NewClientContext validates config, authenticates, and creates a Plex client. Caller must call ctx.Cancel() when done.

type DirectorItem

type DirectorItem struct {
	ID   string `json:"id"`
	Name string `json:"name"`
}

type DirectorsCmd

type DirectorsCmd struct {
	Section string `help:"Library section ID (required)" short:"s" required:""`
	Output  string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

DirectorsCmd lists all directors in a library

func (*DirectorsCmd) Run

func (c *DirectorsCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type DuplicateGroup

type DuplicateGroup struct {
	Key        string   `json:"key"`
	Title      string   `json:"title"`
	Year       int      `json:"year,omitempty"`
	Show       string   `json:"show,omitempty"`
	Edition    string   `json:"edition,omitempty"`
	Type       string   `json:"type"`
	Count      int      `json:"count"`
	RatingKeys []string `json:"rating_keys"`
}

DuplicateGroup represents a group of duplicate items

type DuplicatesCmd

type DuplicatesCmd struct {
	SectionID             string `help:"Library section ID to scan (empty = all sections)" default:""`
	Type                  string `help:"Filter by type: movie, episode, or all" default:"all" enum:"movie,episode,all"`
	MinCount              int    `help:"Minimum number of duplicates to report" default:"2"`
	Output                string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
	EditionsAreDuplicates bool   `help:"Treat different editions (Director's Cut, etc.) as duplicates" default:"false"`
}

DuplicatesCmd represents the duplicates command

func (*DuplicatesCmd) Run

func (c *DuplicatesCmd) Run(ctx *kong.Context, ui *ui.UI, cfg *config.Config) error

Run executes the duplicates command

type EditionInfo

type EditionInfo struct {
	Title           string `json:"title"`
	Year            int    `json:"year,omitempty"`
	RatingKey       string `json:"rating_key"`
	Section         string `json:"section"`
	EditionTitle    string `json:"edition_title,omitempty"`
	FileEdition     string `json:"file_edition,omitempty"`
	RawEditionTag   string `json:"raw_edition_tag,omitempty"`
	FilePath        string `json:"file_path"`
	HasMetaEdition  bool   `json:"has_meta_edition"`
	HasFileEdition  bool   `json:"has_file_edition"`
	EditionMismatch bool   `json:"edition_mismatch,omitempty"`
	Issue           string `json:"issue,omitempty"`
}

type EditionsCmd

type EditionsCmd struct {
	Section string `help:"Library section ID to check" short:"s"`
	Title   string `help:"Filter by title" short:"t"`
	Issues  bool   `help:"Only show items with edition issues" short:"i"`
	Output  string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

func (*EditionsCmd) Run

func (c *EditionsCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type EpisodeGap

type EpisodeGap struct {
	Show            string `json:"show"`
	Season          int    `json:"season"`
	MissingEpisodes []int  `json:"missing_episodes"`
	TotalEpisodes   int    `json:"total_episodes"`
}

type EpisodeListItem

type EpisodeListItem struct {
	RatingKey string `json:"rating_key"`
	Show      string `json:"show"`
	Season    int    `json:"season"`
	Episode   int    `json:"episode"`
	Title     string `json:"title"`
	SeasonEp  string `json:"season_episode"`
}

type EpisodeStreamResult

type EpisodeStreamResult struct {
	Episode     string `json:"episode"`
	Season      int    `json:"season"`
	EpisodeNum  int    `json:"episode_num"`
	AudioSet    string `json:"audio_set,omitempty"`
	SubtitleSet string `json:"subtitle_set,omitempty"`
	Status      string `json:"status"`
}

type EpisodesListCmd

type EpisodesListCmd struct {
	Show     string `arg:"" help:"Show name to search for"`
	Filter   string `help:"Filter episodes by S##E## patterns (comma-separated, e.g., 'S1E1,S1E3,S2E5')" default:""`
	KeysOnly bool   `help:"Output only rating keys (space-separated, for piping to playlist create)" default:"false"`
	Output   string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

func (*EpisodesListCmd) Run

func (c *EpisodesListCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type EpisodesMissingCmd

type EpisodesMissingCmd struct {
	Show   string `help:"Filter by specific show name" default:""`
	Season int    `help:"Filter by specific season number (0 = all seasons)" default:"0"`
	Output string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

func (*EpisodesMissingCmd) Run

func (c *EpisodesMissingCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type FilePathInfo

type FilePathInfo struct {
	Title    string `json:"title"`
	Section  string `json:"section"`
	FilePath string `json:"file_path"`
	Size     int64  `json:"size"`
}

type FilePathsCmd

type FilePathsCmd struct {
	Title   string `name:"title" help:"Filter by title (substring match)"`
	Section string `name:"section" help:"Filter by library section ID"`
	Limit   int    `help:"Maximum number of items to display" default:"0"`
	Output  string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

func (*FilePathsCmd) Run

func (c *FilePathsCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type HistoryItem

type HistoryItem struct {
	Title     string    `json:"title"`
	Type      string    `json:"type"`
	Show      string    `json:"show,omitempty"`
	Season    int       `json:"season,omitempty"`
	Episode   int       `json:"episode,omitempty"`
	User      string    `json:"user"`
	WatchedAt time.Time `json:"watched_at"`
}

type MatchApplyCmd

type MatchApplyCmd struct {
	RatingKey string `arg:"" help:"Rating key of the item to update"`
	GUID      string `arg:"" help:"GUID of the match to apply (from match search results)"`
	Name      string `help:"Name hint for the match" short:"n"`
}

func (*MatchApplyCmd) Run

func (c *MatchApplyCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type MatchCmd

type MatchCmd struct {
	Search MatchSearchCmd `cmd:"" help:"Search for metadata matches for an item"`
	Apply  MatchApplyCmd  `cmd:"" help:"Apply a metadata match to an item"`
}

type MatchSearchCmd

type MatchSearchCmd struct {
	RatingKey string `arg:"" help:"Rating key of the item to search matches for"`
	Title     string `help:"Override title for search" short:"t"`
	Year      int    `help:"Override year for search" short:"y"`
	Output    string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

func (*MatchSearchCmd) Run

func (c *MatchSearchCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type MetadataInfo

type MetadataInfo struct {
	Title         string   `json:"title"`
	Year          int      `json:"year,omitempty"`
	Type          string   `json:"type"`
	MissingFields []string `json:"missing_fields"`
}

type MetadataMissingCmd

type MetadataMissingCmd struct {
	Section string `help:"Library section ID to scan (empty = all sections)" default:""`
	Type    string `help:"Filter by type: movie, episode, or all" default:"all" enum:"movie,episode,all"`
	Limit   int    `help:"Maximum number of items to display" default:"0"`
	Output  string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

func (*MetadataMissingCmd) Run

func (c *MetadataMissingCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type MovieItem

type MovieItem struct {
	RatingKey string `json:"rating_key"`
	Title     string `json:"title"`
	Year      int    `json:"year,omitempty"`
	Director  string `json:"director,omitempty"`
}

type MoviesCmd

type MoviesCmd struct {
	Director string `help:"Filter by director name (case-insensitive, partial match)" short:"d"`
	Section  string `help:"Library section ID (required)" short:"s" required:""`
	Output   string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

MoviesCmd lists movies with optional filtering

func (*MoviesCmd) Run

func (c *MoviesCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type PlaylistAddCmd

type PlaylistAddCmd struct {
	Playlist string   `arg:"" help:"Playlist ID (rating key)"`
	Items    []string `arg:"" help:"Rating keys to add"`
	Output   string   `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

PlaylistAddCmd adds items to a playlist

func (*PlaylistAddCmd) Run

func (c *PlaylistAddCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type PlaylistAddResult

type PlaylistAddResult struct {
	PlaylistID string `json:"playlist_id"`
	ItemsAdded int    `json:"items_added"`
	Message    string `json:"message"`
}

type PlaylistCmd

type PlaylistCmd struct {
	List   PlaylistListCmd   `cmd:"" help:"List all playlists"`
	Create PlaylistCreateCmd `cmd:"" help:"Create a new playlist"`
	Smart  PlaylistSmartCmd  `cmd:"" help:"Create a smart playlist (auto-updates)"`
	Add    PlaylistAddCmd    `cmd:"" help:"Add items to a playlist"`
	Show   PlaylistShowCmd   `cmd:"" help:"Show items in a playlist"`
	Delete PlaylistDeleteCmd `cmd:"" help:"Delete a playlist"`
}

PlaylistCmd is the parent command for playlist subcommands

type PlaylistCreateCmd

type PlaylistCreateCmd struct {
	Name   string   `arg:"" help:"Playlist name"`
	Items  []string `arg:"" help:"Rating keys to add (at least one required)"`
	Type   string   `help:"Playlist type: video, audio, photo" default:"video" enum:"video,audio,photo"`
	Output string   `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

PlaylistCreateCmd creates a new playlist

func (*PlaylistCreateCmd) Run

func (c *PlaylistCreateCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type PlaylistCreateResult

type PlaylistCreateResult struct {
	RatingKey string `json:"rating_key"`
	Title     string `json:"title"`
	ItemCount int    `json:"item_count"`
}

type PlaylistDeleteCmd

type PlaylistDeleteCmd struct {
	Playlist string `arg:"" help:"Playlist ID (rating key)"`
	Output   string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

PlaylistDeleteCmd deletes a playlist

func (*PlaylistDeleteCmd) Run

func (c *PlaylistDeleteCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type PlaylistDeleteResult

type PlaylistDeleteResult struct {
	PlaylistID string `json:"playlist_id"`
	Message    string `json:"message"`
}

type PlaylistListCmd

type PlaylistListCmd struct {
	Output string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

PlaylistListCmd lists all playlists

func (*PlaylistListCmd) Run

func (c *PlaylistListCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type PlaylistListItem

type PlaylistListItem struct {
	RatingKey    string `json:"rating_key"`
	Title        string `json:"title"`
	Type         string `json:"type"`
	PlaylistType string `json:"playlist_type"`
	ItemCount    int    `json:"item_count"`
	Smart        bool   `json:"smart"`
}

type PlaylistShowCmd

type PlaylistShowCmd struct {
	Playlist string `arg:"" help:"Playlist ID (rating key)"`
	Output   string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

PlaylistShowCmd shows items in a playlist

func (*PlaylistShowCmd) Run

func (c *PlaylistShowCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type PlaylistShowItem

type PlaylistShowItem struct {
	RatingKey string `json:"rating_key"`
	Title     string `json:"title"`
	Type      string `json:"type"`
	Year      int    `json:"year,omitempty"`
	Show      string `json:"show,omitempty"`
	Season    int    `json:"season,omitempty"`
	Episode   int    `json:"episode,omitempty"`
}

type PlaylistSmartCmd

type PlaylistSmartCmd struct {
	Name     string `arg:"" help:"Playlist name"`
	Section  string `help:"Library section ID" short:"s" required:""`
	Director string `help:"Filter by director name" short:"d"`
	Type     string `help:"Playlist type: video, audio" default:"video" enum:"video,audio"`
	Output   string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

PlaylistSmartCmd creates a smart playlist

func (*PlaylistSmartCmd) Run

func (c *PlaylistSmartCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type QualityCheckCmd

type QualityCheckCmd struct {
	MinResolution string `help:"Minimum resolution filter (720p, 1080p, 4k)" default:"1080p" enum:"720p,1080p,4k"`
	HDR           bool   `help:"Only show HDR content"`
	Section       string `help:"Library section ID to scan (empty = all sections)" default:""`
	Type          string `help:"Filter by type: movie, episode, or all" default:"all" enum:"movie,episode,all"`
	Limit         int    `help:"Maximum number of items to display" default:"0"`
	Output        string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

func (*QualityCheckCmd) Run

func (c *QualityCheckCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type QualityInfo

type QualityInfo struct {
	Title      string `json:"title"`
	Year       int    `json:"year,omitempty"`
	Type       string `json:"type"`
	Resolution string `json:"resolution"`
	HDR        bool   `json:"hdr"`
	Bitrate    int    `json:"bitrate"`
	VideoCodec string `json:"video_codec"`
	Width      int    `json:"width"`
	Height     int    `json:"height"`
}

type RecentlyAddedCmd

type RecentlyAddedCmd struct {
	Limit  int    `help:"Maximum number of items to show" default:"50"`
	Days   int    `help:"Only show items added in the last N days" default:"7"`
	Type   string `help:"Filter by type: movie, episode, or all" default:"all" enum:"movie,episode,all"`
	Output string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

func (*RecentlyAddedCmd) Run

func (c *RecentlyAddedCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type RecentlyAddedItem

type RecentlyAddedItem struct {
	Title   string    `json:"title"`
	Year    int       `json:"year,omitempty"`
	Type    string    `json:"type"`
	Section string    `json:"section"`
	AddedAt time.Time `json:"added_at"`
}

type RecentlyWatchedCmd

type RecentlyWatchedCmd struct {
	Section string `help:"Filter by library section ID" default:""`
	Type    string `help:"Filter by type: movie, tv, or all" default:"all" enum:"movie,tv,all"`
	Limit   int    `help:"Maximum number of items to show" default:"50"`
	Days    int    `help:"Filter items watched within the last N days (0 = no filter)" default:"0"`
	Output  string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

func (*RecentlyWatchedCmd) Run

func (c *RecentlyWatchedCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type RecentlyWatchedItem

type RecentlyWatchedItem struct {
	Title     string    `json:"title"`
	Type      string    `json:"type"`
	Library   string    `json:"library"`
	WatchedAt time.Time `json:"watched_at"`
}

type SearchCmd

type SearchCmd struct {
	Query   string `arg:"" help:"Search query"`
	Section string `help:"Filter by library section ID" default:""`
	Type    string `` /* 136-byte string literal not displayed */
	Limit   int    `help:"Maximum number of results" default:"50"`
	Output  string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

func (*SearchCmd) Run

func (c *SearchCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type SearchItem

type SearchItem struct {
	RatingKey string `json:"rating_key"`
	Title     string `json:"title"`
	Type      string `json:"type"`
	Year      int    `json:"year,omitempty"`
	Show      string `json:"show,omitempty"`
	Season    int    `json:"season,omitempty"`
	Episode   int    `json:"episode,omitempty"`
}

type StreamInfo

type StreamInfo struct {
	ID           int    `json:"id"`
	StreamType   string `json:"stream_type"`
	Language     string `json:"language"`
	LanguageCode string `json:"language_code"`
	Codec        string `json:"codec"`
	Title        string `json:"title,omitempty"`
	Channels     int    `json:"channels,omitempty"`
	Selected     bool   `json:"selected"`
	Default      bool   `json:"default"`
}

type StreamsCmd

type StreamsCmd struct {
	List StreamsListCmd `cmd:"" help:"List available audio and subtitle streams for an item"`
	Set  StreamsSetCmd  `cmd:"" help:"Set default audio and/or subtitle streams for episodes"`
}

type StreamsListCmd

type StreamsListCmd struct {
	RatingKey string `arg:"" help:"Rating key of the item to list streams for"`
	Output    string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

func (*StreamsListCmd) Run

func (c *StreamsListCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type StreamsSetCmd

type StreamsSetCmd struct {
	Show     string `arg:"" help:"Show name or rating key"`
	Season   int    `help:"Season number (required)" short:"s" required:""`
	Audio    string `help:"Audio stream to select (by language code, e.g., 'eng', 'jpn')" short:"a"`
	Subtitle string `help:"Subtitle stream to select (by language code, e.g., 'eng', 'off')" short:"t"`
	DryRun   bool   `help:"Show what would be changed without making changes" short:"n"`
	Output   string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

func (*StreamsSetCmd) Run

func (c *StreamsSetCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type SubtitleInfo

type SubtitleInfo struct {
	Title         string   `json:"title"`
	Year          int      `json:"year,omitempty"`
	Type          string   `json:"type"`
	AvailableSubs []string `json:"available_subs"`
	MissingSubs   []string `json:"missing_subs"`
}

type SubtitlesMissingCmd

type SubtitlesMissingCmd struct {
	Lang    string `help:"Comma-separated list of language codes to check (e.g., en,de,fr)" required:"true"`
	Section string `help:"Library section ID to scan (empty = all sections)" default:""`
	Type    string `help:"Filter by type: movie, episode, or all" default:"all" enum:"movie,episode,all"`
	Limit   int    `help:"Maximum number of items to display" default:"0"`
	Output  string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

func (*SubtitlesMissingCmd) Run

func (c *SubtitlesMissingCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type UnwatchedCmd

type UnwatchedCmd struct {
	Type    string `help:"Filter by type: movie, episode, or all" default:"all" enum:"movie,episode,all"`
	Section string `help:"Filter by library section ID" default:""`
	Limit   int    `help:"Maximum number of items to display" default:"50"`
	Output  string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

func (*UnwatchedCmd) Run

func (c *UnwatchedCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type UnwatchedItem

type UnwatchedItem struct {
	Title   string `json:"title"`
	Year    int    `json:"year,omitempty"`
	Type    string `json:"type"`
	AddedAt string `json:"added_at"`
}

type WatchCmd

type WatchCmd struct {
	Now     WatchNowCmd     `cmd:"" help:"Show what's currently being watched"`
	History WatchHistoryCmd `cmd:"" help:"Show watch history"`
	Stats   WatchStatsCmd   `cmd:"" help:"Show watch statistics (most watched, by user, etc.)"`
}

type WatchHistoryCmd

type WatchHistoryCmd struct {
	Limit  int    `help:"Maximum number of items to show" default:"50"`
	Days   int    `help:"Only show items from the last N days" default:"30"`
	User   string `help:"Filter by user name" short:"u"`
	Type   string `help:"Filter by type: movie, episode, or all" default:"all" enum:"movie,episode,all"`
	Output string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

WatchHistoryCmd shows watch history

func (*WatchHistoryCmd) Run

func (c *WatchHistoryCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type WatchNowCmd

type WatchNowCmd struct {
	Output string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

WatchNowCmd shows current active sessions

func (*WatchNowCmd) Run

func (c *WatchNowCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

type WatchStat

type WatchStat struct {
	Name  string `json:"name"`
	Count int    `json:"count"`
	Type  string `json:"type,omitempty"`
}

type WatchStatsCmd

type WatchStatsCmd struct {
	Days   int    `help:"Analyze items from the last N days" default:"30"`
	Top    int    `help:"Number of top items to show" default:"10"`
	By     string `help:"Group by: title, user, show" default:"title" enum:"title,user,show"`
	Type   string `help:"Filter by type: movie, episode, or all" default:"all" enum:"movie,episode,all"`
	Output string `help:"Output format: table, json, or tsv" default:"table" enum:"table,json,tsv"`
}

WatchStatsCmd shows watch statistics

func (*WatchStatsCmd) Run

func (c *WatchStatsCmd) Run(ctx *kong.Context, u *ui.UI, cfg *config.Config) error

Jump to

Keyboard shortcuts

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