Home

Awesome

FastAnime

PyPI - Downloads GitHub Actions Workflow Status Discord GitHub Issues or Pull Requests GitHub deployments PyPI - License

Welcome to FastAnime, anime site experience from the terminal.

fastanime

<details> <summary><b>fzf mode</b></summary>

fastanime-fzf.webm

</details> <details> <summary><b>rofi mode</b></summary>

fa_rofi_mode.webm

</details> <details> <summary><b>Default mode</b></summary>

fa_default_mode.webm

</details>

Heavily inspired by animdl, jerry,magic-tape and ani-cli.

<!--toc:start-->

[!IMPORTANT]

This project currently scrapes allanime, hianime and animepahe, nyaa. The site is in the public domain and can be accessed by any one with a browser.

Installation

Windows Linux/BSD Arch Linux MacOS Android

The app can run wherever python can run. So all you need to have is python installed on your device. On android you can use termux. If you have any difficulty consult for help on the discord channel

Installation using your favourite package manager

Currently the app is only published on pypi. With the following extras available:

Using uv

Recommended method of installation

# generally:
uv tool install fastanime[standard]

# or stripped down installations:
uv tool install fastanime
uv tool install fastanime[api]
uv tool install fastanime[mpv]
uv tool install fastanime[notifications]

Using pipx


pipx install fastanime
# -- or for the development version --
pipx install 'fastanime==<latest-pre-release-tag>.dev1'
# example
# pipx install 'fastanime==0.60.1.dev1'

Using pip

pip install fastanime
# -- or for the development version --
pip install 'fastanime==<latest-pre-release-tag>.dev1'
# example
# pip install 'fastanime==0.60.1.dev1'

Installing the bleeding edge version

To install the latest build which are created on every push by GitHub actions, download the fastanime_debug_build of your choosing from the GitHub actions page. Then:

unzip fastanime_debug_build

# outputs fastanime<version>.tar.gz

pipx install fastanime<version>.tar.gz

# --- or ---

pip install fastanime<version>.tar.gz

Building from the source

Requirements:

To build from the source, follow these steps:

  1. Clone the repository: git clone https://github.com/FastAnime/FastAnime.git --depth 1
  2. Navigate into the folder: cd FastAnime
  3. Then build and Install the app:
# build and install fastanime with uv
uv tool install .
  1. Enjoy! Verify installation with:
fastanime --version

[!Tip]

Download the completions from here for your shell. To add completions:

External Dependencies

The only required external dependency, unless you won't be streaming, is MPV, which i recommend installing with uosc :fire: and thumbfast for the best experience since they add a better interface to it.

[!NOTE]

The project currently sees no reason to support any other video player because we believe nothing beats MPV and it provides everything you could ever need with a small footprint. But if you have a reason feel free to encourage as to do so. However, on android this is not the case so vlc is also supported

Other external dependencies that will just make your experience better:

Usage

The project offers a featureful command-line interface and MPV interface through the use of python-mpv. The project also offers subs in different languages thanks to hianime provider.

The Commandline interface :fire:

Designed for efficiency and automation. Plus has a beautiful pseudo-TUI in some of the commands. If you are stuck anywhere just use --help before the command you would like to get help on

Overview of main commands:

Overview of options

Most options are directly passed into fastanime directly and are shared by multiple subcommands.

Most of the options override your config file.

This is a convention to make the dev time faster since it reduces redundancy and also makes switching of subcommands with the same options easier to the end user.

In general fastanime --<option-name>

Available options for the fastanime include:

Example usage of the above options

# example of syncplay intergration
fastanime --sync-play --server sharepoint search -t <anime-title>

# --- or ---

# to watch with anilist intergration
fastanime --sync-play --server sharepoint anilist

# downloading dubbed anime
fastanime --dub download -t <anime>

# use  icons and fzf for a more elegant ui with preview
fastanime --icons --preview --fzf anilist

# use icons with default ui
fastanime --icons --default anilist

# viewing manga
fastanime --manga search -t <manga-title>

The anilist command :fire: :fire: :fire:

Stream, browse, and discover anime efficiently from the terminal using the AniList API.

Running without any subcommand

Run fastanime anilist to access the main interface.

Subcommands

The subcommands are mainly their as convenience. Since all the features already exist in the main interface. Most of the subcommands share the common option --dump-json or -d which will print only the json data and suppress the ui.

FastAnime Anilist Search subcommand 🔥 🔥 🔥

It is by far one of the most powerful commands. It offers the following options:

Example:

# get anime with the tag of isekai
fastanime anilist search -T isekai

# get anime of 2024 and sort by popularity
# that has already finished airing or is releasing
# and is not in your anime lists
fastanime anilist search -y 2024 -s POPULARITY_DESC --status RELEASING --status FINISHED --not-on-list

# get anime of 2024 season WINTER
fastanime anilist search -y 2024 --season WINTER

# get anime genre action and tag isekai,magic
 fastanime anilist search -g Action -T Isekai -T Magic

# get anime of 2024 thats finished airing
fastanime anilist search -y 2024 -S FINISHED

# get the most favourite anime movies
fastanime anilist search -f MOVIE -s FAVOURITES_DESC

For more details visit the anilist docs or just get the completions which will improve the experience.

Like seriously get the completions and the experience will be a 💯 💯 better.

The following are commands you can only run if you are signed in to your AniList account:

Plus: fastanime anilist notifier 🔥

# basic form
fastanime anilist notifier

# with logging to stdout
fastanime --log anilist notifier

# with logging to a file. stored in the same place as your config
fastanime --log-file anilist notifier

The above commands will start a loop that checks every 2 minutes if any of the anime in your watch list that are airing has just released a new episode.

The notification will consist of a cover image of the anime in none windows systems.

You can place the command among your machines startup scripts.

For fish users for example you can decide to put this in your ~/.config/fish/config.fish:

if ! ps aux | grep -q '[f]astanime .* notifier'
  echo initializing fastanime anilist notifier
  nohup fastanime --log-file anilist notifier>/dev/null &
end

[!NOTE] To sign in just run fastanime anilist login and follow the instructions. To view your login status fastanime anilist login --status To erase login data fastanime anilist login --erase

download subcommand

Download anime to watch later dub or sub with this one command. Its optimized for scripting due to fuzzy matching; basically you don't have to manually select search results.

So every step of the way has been and can be automated. Uses a list slicing syntax similar to that of python as the value for the -r option.

[!NOTE]

The download feature is powered by yt-dlp so all the bells and whistles that it provides are readily available in the project. Like continuing from where you left of while downloading, after lets say you lost your internet connection.

Syntax:

# Download all available episodes
# multiple titles can be specified with -t option
fastanime download -t <anime-title> -t <anime-title>
# -- or --
fastanime download -t <anime-title> -t <anime-title> -r ':'

# download latest episode for the two anime titles
# the number can be any no of latest episodes but a minus sign
# must be present
fastanime download -t <anime-title> -t <anime-title> -r '-1'

# latest 5
fastanime download -t <anime-title> -t <anime-title> -r '-5'

# Download specific episode range
# be sure to observe the range Syntax
fastanime download -t <anime-title> -r '<episodes-start>:<episodes-end>:<step>'

fastanime download -t <anime-title> -r '<episodes-start>:<episodes-end>'

fastanime download -t <anime-title> -r '<episodes-start>:'

fastanime download -t <anime-title> -r ':<episodes-end>'

# download specific episode
# remember python indexing starts at 0
fastanime download -t <anime-title> -r '<episode-1>:<episode>'

# merge subtitles with ffmpeg to mkv format; hianime tends to give subs as separate files
# and dont prompt for anything
# eg existing file in destination instead remove
# and clean
# ie remove original files (sub file and vid file)
# only keep merged files
fastanime download -t <anime-title> --merge --clean --no-prompt

# EOF is used since -t always expects a title
# you can supply anime titles from file or -t at the same time
#
# from stdin
echo -e "<anime-title>\n<anime-title>\n<anime-title>" | fastanime download -t "EOF" -r <range> -f -

# from file
fastanime download -t "EOF" -r <range> -f <file-path>


search subcommand

Powerful command mainly aimed at binging anime. Since it doesn't require interaction with the interfaces.

Uses a list slicing syntax similar to that of python as the value of the -r option.

Syntax:

# basic form where you will still be prompted for the episode number
# multiple titles can be specified with the -t option
fastanime search -t <anime-title> -t <anime-title>

# binge all episodes with this command
fastanime search -t <anime-title> -r ':'

# watch latest episode
fastanime search -t <anime-title> -r '-1'

# binge a specific episode range with this command
# be sure to observe the range Syntax
fastanime search -t <anime-title> -r '<start>:<stop>'

fastanime search -t <anime-title> -r '<start>:<stop>:<step>'

fastanime search -t <anime-title> -r '<start>:'

fastanime search -t <anime-title> -r ':<end>'

grab subcommand

Helper command to print streams to stdout so it can be used by non-python applications.

The format of the printed out data is json and can be either an array or object depending on how many anime titles have been specified in the command-line or through a subprocess.

[!TIP] For python applications just use its python api, for even greater and easier control. So just add fastanime as one of your dependencies.

Uses a list slicing syntax similar to that of python as the value of the -r option.

Syntax:

# --- print anime info + episode streams ---

# multiple titles can be specified with the -t option
fastanime grab -t <anime-title> -t <anime-title>

# -- or --

# print all available episodes
fastanime grab -t <anime-title> -r ':'

# print the latest episode
fastanime grab -t <anime-title> -r '-1'

# print a specific episode range
# be sure to observe the range Syntax
fastanime grab -t <anime-title> -r '<start>:<stop>'

fastanime grab -t <anime-title> -r '<start>:<stop>:<step>'

fastanime grab -t <anime-title> -r '<start>:'

fastanime grab -t <anime-title> -r ':<end>'

# --- grab options ---

# print search results only
fastanime grab -t <anime-title> -r <range> --search-results-only

# print anime info only
fastanime grab -t <anime-title> -r <range> --anime-info-only

# print episode streams only
fastanime grab -t <anime-title> -r <range> --episode-streams-only

downloads subcommand

View and stream the anime you downloaded using MPV.

Syntax:

fastanime downloads

# view individual episodes
fastanime downloads --view-episodes
# --- or ---
fastanime downloads -v

# to set seek time when using ffmpegthumbnailer for local previews
# -1 means random and is the default
fastanime downloads --time-to-seek <intRange(-1,100)>
# --- or ---
fastanime downloads -t <intRange(-1,100)>

# to watch a specific title
# be sure to get the completions for the best experience
fastanime downloads --title <title>

# to get the path to the downloads folder set
fastanime downloads --path
# useful when you want to use the value for other programs

config subcommand

Edit FastAnime configuration settings using your preferred editor (based on $EDITOR environment variable so be sure to set it).

Syntax:

fastanime config

# to get config path which is useful if you want to use it for another program.
fastanime config --path

# add a desktop entry
fastanime config --desktop-entry

# view current contents of your configuration or can be used to get an example config
fastanime config --view

[!Note]

If it opens vim you can exit by typing :q .

cache subcommand

Easily manage the data fastanime has cached; for the previews.

Syntax:

# delete everything in the cache dir
fastanime cache --clean

# print the path to the cache dir and exit
fastanime cache --path

# print the current size of the cache dir and exit
fastanime cache --size

# open the cache dir and exit
fastanime cache

update subcommand

Easily update fastanime to latest

Syntax:

# update fastanime to latest
fastanime update

# check for latest release
fastanime update --check

completions subcommand

Helper command to setup shell completions

Syntax:

# try to detect your shell and print completions
fastanime completions
# print fish completions
fastanime completions --fish
# print bash completions
fastanime completions --bash
# print zsh completions
fastanime completions --zsh

fastanime serve

Helper command that starts a rest server. This requires you to install fastanime with the api extra or standard extra.

# default options
fastanime serve

# specify host and port
fastanime serve --host <host> --port <port>

An example instance is hosted by render

Examples:

search for anime by title:

curl 'https://fastanime.onrender.com/search?title=dragon&translation_type=sub'

<details> <summary> Result </summary>
{
  "pageInfo": {
    "total": 22839
  },
  "results": [
    {
      "id": "ju2pgynxn9o9DZvse",
      "title": "Dragon Ball Daima",
      "type": "Show",
      "availableEpisodes": {
        "sub": 5,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "qpnhxfarTHfP7kjgR",
      "title": "My WeChat connects to the Dragon Palace",
      "type": "Show",
      "availableEpisodes": {
        "sub": 26,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "8aM5BBoEGLvjG3MZm",
      "title": "Sayounara Ryuusei, Konnichiwa Jinsei",
      "type": "Show",
      "availableEpisodes": {
        "sub": 6,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "Sg9Q9FyqBnJ9qtv5n",
      "title": "Yarinaoshi Reijou wa Ryuutei Heika wo Kouryakuchuu",
      "type": "Show",
      "availableEpisodes": {
        "sub": 5,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "gF2mKbWBatQudcF6A",
      "title": "Throne of the Dragon King",
      "type": "Show",
      "availableEpisodes": {
        "sub": 3,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "SXLNNoorPifT5ZStw",
      "title": "Shi Cao Lao Long Bei Guan Yi E Long Zhi Ming Season 2",
      "type": "Show",
      "availableEpisodes": {
        "sub": 7,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "v4ZkjtyftscNzYF2A",
      "title": "I Have a Dragon in My Body Episode122-133",
      "type": "Show",
      "availableEpisodes": {
        "sub": 77,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "9RSQCRJ3d554sBzoz",
      "title": "City Immortal Emperor: Dragon King Temple",
      "type": "Show",
      "availableEpisodes": {
        "sub": 20,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "t8C6zvsdJE5JJKDLE",
      "title": "It Turns Out I Am the Peerless Dragon God",
      "type": "Show",
      "availableEpisodes": {
        "sub": 2,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "xyDt3mJieZkD76P7S",
      "title": "Urban Hidden Dragon",
      "type": "Show",
      "availableEpisodes": {
        "sub": 13,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "8PoJiTEDAswkw8b3u",
      "title": "The Collected Animations of ICAF (2001-2006)",
      "type": "Show",
      "availableEpisodes": {
        "sub": 1,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "KZeMmRSsyJgz37EmH",
      "title": "Dragon Master",
      "type": "Show",
      "availableEpisodes": {
        "sub": 1,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "7a33i9m26poonyNLg",
      "title": "I Have a Dragon in My Body",
      "type": "Show",
      "availableEpisodes": {
        "sub": 79,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "uwwvBujGRsjCQ8kKM",
      "title": "Cong Gu Huo Niao Kaishi: Long Cheng Fengyun",
      "type": "Show",
      "availableEpisodes": {
        "sub": 16,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "RoexdZwHSTDwyzEzd",
      "title": "Super Dragon Ball Heroes Meteor Mission",
      "type": "Show",
      "availableEpisodes": {
        "sub": 6,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "gAcGCcMENjbWhBnR9",
      "title": "Dungeon Meshi",
      "type": "Show",
      "availableEpisodes": {
        "sub": 24,
        "dub": 24,
        "raw": 0
      }
    },
    {
      "id": "ZGh2QHiaCY5T5Mhi4",
      "title": "Long Shidai",
      "type": "Show",
      "availableEpisodes": {
        "sub": 9,
        "dub": 0,
        "raw": 1
      }
    },
    {
      "id": "gZSHt98fQpHRfJJXw",
      "title": "Xanadu Dragonslayer Densetsu",
      "type": "Show",
      "availableEpisodes": {
        "sub": 1,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "wo8pX4Sba97mFCAkc",
      "title": "Vanguard Dragon God",
      "type": "Show",
      "availableEpisodes": {
        "sub": 86,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "rrbCftmca3Y2TEiBX",
      "title": "Super Dragon Ball Heroes Ultra God Mission",
      "type": "Show",
      "availableEpisodes": {
        "sub": 10,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "JzSeXC2WtBBhn3guN",
      "title": "Dragon King's Son-In-Law",
      "type": "Show",
      "availableEpisodes": {
        "sub": 11,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "eE3txJGGk9atw7k2v",
      "title": "Majutsushi Orphen Hagure Tabi: Seiiki-hen",
      "type": "Show",
      "availableEpisodes": {
        "sub": 12,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "4X2JbZgiQrb2PTzex",
      "title": "Yowai 5000-nen no Soushoku Dragon, Iwarenaki Jaryuu Nintei (Japanese Dub)",
      "type": "Show",
      "availableEpisodes": {
        "sub": 12,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "SHp5NFDakKjPT5nJE",
      "title": "Starting from Gu Huoniao: Dragon City Hegemony",
      "type": "Show",
      "availableEpisodes": {
        "sub": 22,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "8LgaCGrz7Gz35LRpk",
      "title": "Yuan Zun",
      "type": "Show",
      "availableEpisodes": {
        "sub": 5,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "4GKHyjFC7Dyc7fBpT",
      "title": "Shen Ji Long Wei",
      "type": "Show",
      "availableEpisodes": {
        "sub": 26,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "2PQiuXiuJoTQTdgy4",
      "title": "Long Zu",
      "type": "Show",
      "availableEpisodes": {
        "sub": 15,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "rE47AepmBFRvZ6cne",
      "title": "Jidao Long Shen",
      "type": "Show",
      "availableEpisodes": {
        "sub": 40,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "c4JcjPbRfiuoJPB4F",
      "title": "Dragon Quest: Dai no Daibouken (2020)",
      "type": "Show",
      "availableEpisodes": {
        "sub": 101,
        "dub": 100,
        "raw": 0
      }
    },
    {
      "id": "nGRTwG7kj5rCPiAX4",
      "title": "Dragon Quest: Dai no Daibouken Tachiagare!! Aban no Shito",
      "type": "Show",
      "availableEpisodes": {
        "sub": 1,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "6LJBjT4RzJaucdmX3",
      "title": "Dragon Slayer Eiyuu Densetsu: Ouji no Tabidachi",
      "type": "Show",
      "availableEpisodes": {
        "sub": 1,
        "dub": 1,
        "raw": 0
      }
    },
    {
      "id": "JKbtxdw2cRqqmZgnS",
      "title": "Dragon Quest: Dai no Daibouken Buchiyabure!! Shinsei 6 Daishougun",
      "type": "Show",
      "availableEpisodes": {
        "sub": 1,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "pn32RijEHPfuTYt4h",
      "title": "Dragon Quest Retsuden: Roto no Monshou",
      "type": "Show",
      "availableEpisodes": {
        "sub": 1,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "xHwk6oo7jaDrMG9to",
      "title": "Dragon Fist",
      "type": "Show",
      "availableEpisodes": {
        "sub": 1,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "ugFXPFQW8kvLocZgx",
      "title": "Yowai 5000-nen no Soushoku Dragon, Iwarenaki Jaryuu Nintei",
      "type": "Show",
      "availableEpisodes": {
        "sub": 12,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "qSFMEcT4SufEhLZnq",
      "title": "Doraemon Movie 8: Nobita to Ryuu no Kishi",
      "type": "Show",
      "availableEpisodes": {
        "sub": 1,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "LTzXFSmQR878MdJaS",
      "title": "Dragon Ball Specials",
      "type": "Show",
      "availableEpisodes": {
        "sub": 2,
        "dub": 0,
        "raw": 0
      }
    },
    {
      "id": "XuTNNzF7DfapLFMFJ",
      "title": "Dragon Ball Super: Super Hero",
      "type": "Show",
      "availableEpisodes": {
        "sub": 1,
        "dub": 1,
        "raw": 0
      }
    },
    {
      "id": "n4S2spjyTHXHNAMDW",
      "title": "Shin Ikkitousen",
      "type": "Show",
      "availableEpisodes": {
        "sub": 3,
        "dub": 3,
        "raw": 0
      }
    },
    {
      "id": "srMRCkMEJA9Rmt7do",
      "title": "Dragon Ball Z: Atsumare! Goku World",
      "type": "Show",
      "availableEpisodes": {
        "sub": 1,
        "dub": 0,
        "raw": 0
      }
    }
  ]
}
</details>

Get anime by id:

curl 'https://fastanime.onrender.com/anime/8aM5BBoEGLvjG3MZm'
<details> <summary> Result </summary>
{
  "id": "8aM5BBoEGLvjG3MZm",
  "title": "Sayounara Ryuusei, Konnichiwa Jinsei",
  "availableEpisodesDetail": {
    "sub": ["6", "5", "4", "3", "2", "1"],
    "dub": [],
    "raw": []
  },
  "type": null
}
</details>

Get episode streams by translation_type:

curl 'https://fastanime.onrender.com/anime/8aM5BBoEGLvjG3MZm/watch?episode=3&translation_type=sub'
<details> <summary> Result </summary>
[
  {
    "server": "Yt",
    "episode_title": "Sayounara Ryuusei, Konnichiwa Jinsei; Episode 3",
    "headers": {
      "Referer": "https://allanime.day/"
    },
    "subtitles": [],
    "links": [
      {
        "link": "https://tools.fast4speed.rsvp//media9/videos/8aM5BBoEGLvjG3MZm/sub/3",
        "quality": "1080"
      }
    ]
  },
  {
    "server": "sharepoint",
    "headers": {},
    "subtitles": [],
    "episode_title": "Sayounara Ryuusei, Konnichiwa Jinsei; Episode 3",
    "links": [
      {
        "link": "https://myanime.sharepoint.com/sites/chartlousty/_layouts/15/download.aspx?share=ERpIT0CTmOVHmO8386bNGZMBf7Emtoda_3bUMzCleWhp4g",
        "mp4": true,
        "resolutionStr": "Mp4",
        "src": "https://myanime.sharepoint.com/sites/chartlousty/_layouts/15/download.aspx?share=ERpIT0CTmOVHmO8386bNGZMBf7Emtoda_3bUMzCleWhp4g",
        "quality": "1080"
      }
    ]
  },
  {
    "server": "gogoanime",
    "headers": {},
    "subtitles": [],
    "episode_title": "Sayounara Ryuusei, Konnichiwa Jinsei; Episode 3",
    "links": [
      {
        "link": "https://www114.anzeat.pro/streamhls/6454b50a557e9fa52a60cfdee0b0906e/ep.3.1729188150.m3u8",
        "hls": true,
        "mp4": false,
        "resolutionStr": "hls P",
        "priority": 3,
        "quality": "1080"
      },
      {
        "link": "https://www114.anicdnstream.info/videos/hls/h1IUtAefmoWTc8hJhtr8OQ/1731106912/235294/6454b50a557e9fa52a60cfdee0b0906e/ep.3.1729188150.m3u8",
        "hls": true,
        "mp4": false,
        "resolutionStr": "HLS1",
        "priority": 2,
        "quality": "720"
      },
      {
        "link": "https://workfields.maverickki.lol/7d2473746a243c246e727276753c29297171713737322867686f65626875727463676b286f68606929706f62636975296e6a75296e374f53724763606b695152653e6e4c6e72743e495729373135373736303f373429343533343f32293032333264333667333331633f6067333467303665606263633664363f3630632963762835283731343f373e3e373336286b35733e242a2476677475634e6a75243c727473632a2462677263243c373135373634363236363636367b",
        "hls": true,
        "resolutionStr": "Alt",
        "src": "https://workfields.maverickki.lol/7d2473746a243c246e727276753c29297171713737322867686f65626875727463676b286f68606929706f62636975296e6a75296e374f53724763606b695152653e6e4c6e72743e495729373135373736303f373429343533343f32293032333264333667333331633f6067333467303665606263633664363f3630632963762835283731343f373e3e373336286b35733e242a2476677475634e6a75243c727473632a2462677263243c373135373634363236363636367b",
        "priority": 1,
        "quality": "480"
      }
    ]
  }
]
</details>

Get Episode Streams by AniList Id:

curl 'https://fastanime.onrender.com/watch/269?episode=1&translation_type=dub'
<details> <summary> Results </summary>
[
  {
    "server": "gogoanime",
    "headers": {},
    "subtitles": [],
    "episode_title": "Bleach; Episode 1",
    "links": [
      {
        "link": "https://www032.anzeat.pro/streamhls/f643f0c19d5bee9f1c3aed888eee75d6/ep.1.1709258176.m3u8",
        "hls": true,
        "mp4": false,
        "resolutionStr": "hls P",
        "priority": 3,
        "quality": "1080"
      },
      {
        "link": "https://www032.anicdnstream.info/videos/hls/WEJ7719z_r37wHYpaOsTqQ/1731115258/76805/f643f0c19d5bee9f1c3aed888eee75d6/ep.1.1709258176.m3u8",
        "hls": true,
        "mp4": false,
        "resolutionStr": "HLS1",
        "priority": 2,
        "quality": "720"
      },
      {
        "link": "https://workfields.maverickki.lol/7d2473746a243c246e727276753c29297171713635342867686f65626875727463676b286f68606929706f62636975296e6a752951434c3131373f7c59743531714e5f76674975527757293731353737373334333e2931303e36332960303235603665373f62336463633f603765356763623e3e3e636363313362302963762837283731363f34333e373130286b35733e242a2476677475634e6a75243c727473632a2462677263243c373135373634363236363636367b",
        "hls": true,
        "resolutionStr": "Alt",
        "src": "https://workfields.maverickki.lol/7d2473746a243c246e727276753c29297171713635342867686f65626875727463676b286f68606929706f62636975296e6a752951434c3131373f7c59743531714e5f76674975527757293731353737373334333e2931303e36332960303235603665373f62336463633f603765356763623e3e3e636363313362302963762837283731363f34333e373130286b35733e242a2476677475634e6a75243c727473632a2462677263243c373135373634363236363636367b",
        "priority": 1,
        "quality": "480"
      }
    ]
  },
  {
    "server": "Yt",
    "episode_title": "Bleach; Episode 1",
    "headers": {
      "Referer": "https://allanime.day/"
    },
    "subtitles": [],
    "links": [
      {
        "link": "https://tools.fast4speed.rsvp//media3/videos/XqKvkSEty5koms32i/dub/1",
        "quality": "1080"
      }
    ]
  },
  {
    "server": "wixmp",
    "headers": {},
    "subtitles": [],
    "episode_title": "Bleach; Episode 1",
    "links": [
      {
        "link": "https://repackager.wixmp.com/video.wixstatic.com/video/eba0c8_706b389e50f94fe5bf8c72e2f10c545e/,720p,480p,/mp4/file.mp4.urlset/master.m3u8",
        "hls": true,
        "resolutionStr": "Hls",
        "quality": "1080"
      }
    ]
  },
  {
    "server": "sharepoint",
    "headers": {},
    "subtitles": [],
    "episode_title": "Bleach; Episode 1",
    "links": [
      {
        "link": "https://myanime.sharepoint.com/sites/anime/_layouts/15/download.aspx?share=EaNJF1eTtptGovmPAcR3_7QBH1gFepgMcBpL5YfyEM5Uhw",
        "mp4": true,
        "resolutionStr": "Mp4",
        "src": "https://myanime.sharepoint.com/sites/anime/_layouts/15/download.aspx?share=EaNJF1eTtptGovmPAcR3_7QBH1gFepgMcBpL5YfyEM5Uhw",
        "quality": "1080"
      }
    ]
  }
]
</details>

MPV specific commands

The project now allows on the fly media controls directly from mpv. This means you can go to the next or previous episode without the window ever closing thus offering a seamless experience. This is all powered with python-mpv which enables writing mpv scripts with python just like how it would be done in lua.

Key Bindings

<shift>+n fetch the next episode

<shift>+p fetch the previous episode

<shift>+t toggle the translation type from dub to sub

<shift>+a toggle auto next episode

<shit>+r reload episode

Script Messages

Commands issued in the MPV console.

Examples:

# to select episode from mpv without window closing
script-message select-episode <episode-number>

# to select server from mpv without window closing
script-message select-server <server-name>

# to select quality
script-message select-quality <1080/720/480/360>

styling the default interface

The default interface uses inquirerPy which is customizable. Read here to findout more https://inquirerpy.readthedocs.io/en/latest/pages/env.html

Configuration

The app includes sensible defaults but can be customized extensively. Configuration is stored in .ini format at ~/.config/FastAnime/config.ini on arch linux; for the other operating systems you can check by running fastanime config --path.

[!TIP] You can now use the option --update to update your config file from the command-line For Example: fastanime --icons --fzf --preview config --update the above will set icons to true, use_fzf to true and preview to true in your config file

By default if a config file does not exist it will be auto created with comments to explain each and every option. The default config:

[general]
icons = False

quality = 1080

normalize_titles = True

provider = allanime

preferred_language = english

downloads_dir = ~/Videos/FastAnime

preview = False

ffmpegthumbnailer_seek_time = -1

use_fzf = False

use_rofi = False

rofi_theme =

rofi_theme_input =

rofi_theme_confirm =

notification_duration = 2

sub_lang = eng

default_media_list_tracking = None

force_forward_tracking = True

cache_requests = True

use_persistent_provider_store = False

recent = 50


[stream]
continue_from_history = True

preferred_history = local

translation_type = sub

server = top

auto_next = False

auto_select = True

skip = False

episode_complete_at = 80

use_python_mpv = False

force_window = immediate

format = best[height<=1080]/bestvideo[height<=1080]+bestaudio/best

player = mpv

Contributing

We welcome your issues and feature requests. However, due to time constraints, we currently do not plan to add another provider.

If you wish to contribute directly, please first open an issue describing your proposed changes so it can be discussed or if you are in a rush for the feature to be merged just open a pr.

If you find an anime title that does not correspond with a provider or is just weird just edit the data file and open a pr or if you don't want to do that open an issue.

Receiving Support

For inquiries, join our Discord Server.

<p align="center"> <a href="https://discord.gg/HBEmAwvbHV"> <img src="https://invidget.switchblade.xyz/C4rhMA4mmK"> </a> </p>

Supporting the Project

Show your support by starring our GitHub repository or buying us a coffee.