Skip to content

DemonKingSwarn/luffy

Repository files navigation

LUFFY


Spiritual successor of flix-cli and mov-cli.


Language

PRs Welcome

OS linux OS Mac OS Windows OS Android




Overview

Note

Before creating an issue, make sure to update luffy

Installation

1. Arch Linux

paru -S luffy-bin

2. MacOS

brew tap gamedevCloudy/tools
brew install --cask iina
brew install luffy

3. Windows

Make sure you have scoop.sh installed on your system.

scoop bucket add demon-apps https://github.com/DemonKingSwarn/flix-cli-bucket.git
scoop bucket add extras
scoop install luffy

Important

On windows if you want to use the --show-image, you need to use the wezterm terminal emulator. It is installed as a dependency on windows.

4. Go Install

If you have Go installed, you can easily install Luffy:

go install github.com/demonkingswarn/luffy@latest

5. Build from Source

  1. Clone the repository:

    git clone https://github.com/demonkingswarn/luffy.git
    cd luffy
  2. Build and install:

    go install .

    Ensure your $GOPATH/bin is in your system's PATH.

6. Android Installation

Install termux (Guide)

pkg up -y
pkg in fzf python-yt-dlp
curl -sL "https://github.com/DemonKingSwarn/luffy/releases/download/v1.1.0/luffy-android-arm64" -o $PREFIX/bin/luffy
chmod +x $PREFIX/bin/luffy

Dependencies

  • mpv - Video Player for Linux and Windows
  • vlc - Alternate video player for Linux and Windows
  • iina - Video Player for MacOS
  • vlc-android - Video Player for Android
  • yt-dlp - Download manager
  • fzf - For selection menus
  • chafa & libsixel - For poster previews (--show-image)

Usage

luffy [query] [flags]

[query] is the title you want to search for (e.g., "breaking bad", "dune", "one piece"). The query is optional when using --history or --recommend.

Flags

Flag Alias Description
--action -a Action to perform: play (default) or download.
--season -s (Series only) Specify the season number.
--episodes -e (Series only) Specify a single episode (5) or a range (1-5).
--best -b Auto-select the best available quality (skips fzf quality prompt).
--provider -p Select provider (e.g. sflix, braflix). Overrides config.
--history -H Browse watch history and resume a previous title.
--recommend -r Get personalised recommendations based on watch history.
--show-image NA Show poster previews in fzf (requires chafa and a supported terminal).
--debug -d Print debug information (URLs, decryption steps, etc.).
--help -h Show help message and exit.

Playback Controls

When watching a TV series, an fzf menu appears alongside the player with four options:

Action Description
Next Kill the player and move to the next episode.
Previous Kill the player and move to the previous episode.
Replay Restart the current episode from the beginning.
Quit Kill the player and exit.

Examples

Search & Play a Movie

luffy "dune"

Download a Movie

luffy "dune" --action download

Play a TV Episode

luffy "breaking bad" -s 1 -e 1

Download a Range of Episodes

luffy "stranger things" -s 2 -e 1-5 -a download

Auto-select Best Quality

luffy "dune" --best

Use a Different Provider

luffy "breaking bad" --provider sflix

Resume from Watch History

luffy --history

Get Personalised Recommendations

luffy --recommend

Recommendations with Poster Previews

luffy --recommend --show-image

Configuration

The config file lives at ~/.config/luffy/config.yaml. All fields are optional; defaults are shown below.

# Path to the fzf binary. Set to an absolute path if fzf is not on PATH.
fzf_path: fzf

# Video player: "mpv" (default) or "vlc". IINA is used automatically on macOS.
player: mpv

# chafa rendering backend for poster previews.
# Options: sixel (default), kitty, iterm, symbols
image_backend: sixel

# Default search provider.
provider: flixhq

# Directory where downloaded files are saved. Defaults to home directory.
dl_path: ""

# Quality selection: leave empty to show an fzf prompt, or set to "best"
# to always auto-select the highest available quality.
quality: ""

# Extra arguments appended to every mpv invocation (ignored on VLC/IINA/Android).
# mpv_args:
#   - "--hwdec=auto"
#   - "--volume=80"

# Lifecycle hooks — shell commands run at key playback events.
# LUFFY_TITLE, LUFFY_URL, LUFFY_SEASON, LUFFY_EPISODE, LUFFY_EP_NAME,
# LUFFY_PROVIDER, LUFFY_ACTION, LUFFY_STREAM_URL, and LUFFY_POSITION
# are set in the environment for every hook.
# hooks:
#   on_play: 'notify-send "Now playing" "$LUFFY_TITLE"'
#   on_exit: 'echo "$LUFFY_TITLE stopped at ${LUFFY_POSITION}s" >> ~/luffy.log'
#   on_download: 'notify-send "Downloading" "$LUFFY_TITLE"'

Important

To see poster images, your terminal emulator must support a graphics protocol. Supported terminals include kitty, ghostty, WezTerm, and foot (sixel).

If you use kitty or ghostty, set image_backend: kitty in your config.

Hooks & MpvArgs

Shell commands can be run at three lifecycle points, and extra mpv flags can be injected via config. See docs/hooks.md for the full reference.

MpvArgs

Extra arguments appended verbatim to every mpv invocation (ignored on VLC / IINA / Android):

mpv_args:
  - "--hwdec=auto"
  - "--volume=80"

Hooks

hooks:
  on_play: 'notify-send "Now playing" "$LUFFY_TITLE"'
  on_exit: 'echo "$LUFFY_TITLE stopped at ${LUFFY_POSITION}s" >> ~/luffy.log'
  on_download: 'notify-send "Downloading" "$LUFFY_TITLE"'

Every hook receives LUFFY_TITLE, LUFFY_URL, LUFFY_SEASON, LUFFY_EPISODE, LUFFY_EP_NAME, LUFFY_PROVIDER, LUFFY_ACTION, LUFFY_STREAM_URL, and LUFFY_POSITION as environment variables.

Providers

You can set the default provider in the config file (~/.config/luffy/config.yaml) or override it per-run with --provider.

Provider provider: value Notes
FlixHQ flixhq Default
Sflix sflix
Braflix braflix
Movies4u movies4u Bollywood only
YouTube youtube Streams/downloads via yt-dlp
Allanime allanime For anime
HDRezka hdrezka Experimental — may not always work

Example config:

provider: sflix