Skip to content

davidderus/christopher

Repository files navigation

Christopher v1.0.0-alpha.5

Build Status Go Report Card GoDoc

Disclaimer

⚠️ This app is not maintained anymore ⚠️

Why? After spending some time building my own download helper, I realised that reinventing the wheel is less efficient than using an existing solution and just spending time on configuration and updates.

If you want to use and update this project, just fork it :)

Description

Christopher is your everyday direct-download companion.

It automatically grabs new episodes from RSS feeds, debrids their URL if needed, and send them to a downloader service.

It also offers an integrated webserver for remote URL submission and accepts debrid and download instruction from the command line.

Usage

# Starts a FeedWatcher
christopher feed-watcher
# shorter version: christopher fw

# Runs a webserver with a simple interface to debrid and download URIs
christopher webserver
# shorter version: christopher ws

# Debrids an URI
christopher debrid "http://rapidgator.net/file/HTGAWM.mkv"
# shorter version: christopher de "http://rapidgator.net/file/HTGAWM.mkv"

# Downloads an URI
christopher download "https://google.fr"
# shorter version: christopher do "https://google.fr"

# Debrids and downloads an URI
christopher debrid-download "http://rapidgator.net/file/HTGAWM.mkv"
# shorter version: christopher dedo "http://rapidgator.net/file/HTGAWM.mkv"

# Use a custom config file (default in ~/.config/christopher/config.toml)
christopher -c ~/my/custom/config.toml […]

Configuration

Christopher looks for a toml configuration file at $HOME/.config/christopher/config.toml.

# Download configuration (required)
# The downloader is an external service Christopher pushes links to.
[downloader]
  # Name of the service downloading URIs
  name = "aria2"

  [downloader.auth_infos]
    token = "my-good-token"
    rpc_url = "http://127.0.0.1:6800/jsonrpc"

# Debrider configuration (optional)
# The debrider converts links from specific services to a downloadable link.
# Each link sent to Christopher is first tested against each debriders
# to see if it can be debrided.
[debrider]
  name = "AllDebrid"

  [debrider.auth_infos]
    username = "valid-username"
    password = "valid-password"
    base_url = "https://alldebrid.com"

# FeedWatcher configuration (optional)
# The feedwatcher watch some feeds and send every new links
# to the debriders/downloader
[feedwatcher]
  # Defining a custom watch interval in minutes (default to 30 min.)
  watch_interval = 5

  # Adding one feed for the feedwatcher to look for
  [[feedwatcher.feeds]]
    title = "DirectDownload Feed"

    # URL to the provider feed
    url = "https://directdownload.tv"

    provider = "DirectDownload"

# Providers configuration (optional)
# For each feed provider, you can setup some specific config like a list
# of host to send to the debrider.
[providers]
  # Provider config key and feed provider key must be the same
  [providers.DirectDownload]
    # If specified, favorite_hosts will be looked for in the provider links.
    # If none of them are found, nothing will be downloaded.
    # If not specified, the first link available is downloaded.
    favorite_hosts = ["uploaded.net", "rapidgator.net"]

# WebServer configuration (optional)
# The webserver accepts valid URLs and sent them to Christopher
# debriders/downloader
[webserver]
  # Setting a custom host (default to "127.0.0.1")
  host = "0.0.0.0"

  # Setting a custom webserver port (default to 8000)
  port = 8080

  # Defining a secret for the CSRF token generation (required)
  secret = "my-strong-secret"

  # Constraining CSRF cookie to be HTTPS only if true (default to false)
  secure_cookie = true

  # Setting a realm for the HTTP digest auth (default to "christopher.local")
  auth_realm = "download-helper.local"

  # Users are a list of allowed users.
	# If no users are given, no Digest auth is setup.
  [[webserver.users]]
  name = "johndoe"

  # Setting a password via a MD5 string using:
  # `echo -n "$username:download-helper.local:$password" | md5`
  # Also works with all the algorithms supported by HTTP Digest
  password = "36f0730e47562fbdf9b91434130f91f2"

# Teller configuration (optional)
# The Teller handles logging across the whole application.
# It supports text and JSON logging with variables.
[teller]
  # A level from when the Teller must log things
  # Default is `info`, meaning info logs and above will be shown.
  log_level = "debug"

  # The log items format
  # Default is `text`
  log_formatter = "json"

Supported services

Here is a complete list of all supported services.

Do not hesitate to write a PR with some tests to add more.

Providers

  • DirectDownload (provider = "DirectDownload" # or dd, directdownload, directdownload.tv)

Debriders

  • AllDebrid (name = "AllDebrid" # or alldebrid, Alldebrid, ad)

Downloaders

  • Aria2 (name = "aria2" # or Aria2, aria)

Upcoming features

  • A complete logger with log levels handling
  • A download history to avoid duplicates and show status in webserver
  • A successful download notifier (push or email)
  • A lighter Docker Image
  • A better communication between the webserver and Christopher core
  • A documentation about the dispatcher and its stories/scenarios

Docker

You can run Christopher with Docker with the following command:

# First build the image
docker build -t christopher .

# As a command line debrider
docker run -v $HOME/.config/christopher/config.toml:/christopher/config.toml:ro christopher debrid "http://rapidgator.net/file/HTGAWM.mkv"

In order to download files, you must give the christopher container access to a Downloader.

Looking at the docker-compose.yml file, you will see a basic example of a working christopher + aria2 setup. Try it with docker-compose up.

Remember that you need to update your christopher config file with the right aria2 RPC token and use http://aria2:6800/jsonrpc as the rpc_url.

Development

To build bindata file, use go-bindata -pkg webserver -o webserver/bindata.go -prefix webserver webserver/templates/.

Licence

MIT Licence. Click here to see the full text.