mirror of
https://github.com/devine-dl/devine.git
synced 2025-04-29 17:49:44 +00:00
Overall this commit is to just make working with Chapters a lot less manual and convoluted. The current system has you specify information that can easily be automated, like Chapter order and numbers, which is one of the main changes in this commit. Note: This is a Breaking change and requires updates to your Service code. The `get_chapters()` method must be updated. For more information see the updated doc-string for `Service.get_chapters()`. - Added new Chapters class which automatically sorts Chapters by timestamp. - Chapter class has been significantly reworked to be much more generic. Most operations have been mvoed to the new Chapters class. - Chapter objects can no longer specify a Chapter number. The number is now automatically set based on it's sorted order in the Chapters object, which is all done automatically. - Chapter objects can now provide a timestamp in more formats. Timestamp's are now verified more efficiently. - Chapter objects ID is now a crc32 hash of the timestamp and name instead of just basically their number. - The Chapters object now also has an ID which is also a crc32 hash of all of the Chapter IDs it holds. This ID can be used for stuff like temp paths. - `Service.get_chapters()` must now return a Chapters object. The Chapters object may be empty. The Chapters object must hold Chapter objects. - Using `Chapter {N}` or `Act {N}` Chapters and so on is no longer permitted. You should instead leave the name blank if there's no descriptive name to use for it. - If you or a user wants `Chapter {N}` names, then they can use the config option `chapter_fallback_name` set to `"Chapter {i:02}"`. See the config documentation for more info. - Do not add a `00:00:00.000` Chapter, at all. This is automatically added for you if there's at least 1 Chapter with a timestamp after `00:00:00.000`.
405 lines
15 KiB
Markdown
405 lines
15 KiB
Markdown
# Config Documentation
|
|
|
|
This page documents configuration values and what they do. You begin with an empty configuration file.
|
|
You may alter your configuration with `devine cfg --help`, or find the direct location with `devine env info`.
|
|
Configuration values are listed in alphabetical order.
|
|
|
|
Avoid putting comments in the config file as they may be removed. Comments are currently kept only thanks
|
|
to the usage of `ruamel.yaml` to parse and write YAML files. In the future `yaml` may be used instead,
|
|
which does not keep comments.
|
|
|
|
## aria2c (dict)
|
|
|
|
- `max_concurrent_downloads`
|
|
Maximum number of parallel downloads. Default: `5`
|
|
Note: Currently unused as downloads are multi-threaded by Devine rather than Aria2c.
|
|
Devine internally has a constant set value of 16 for it's parallel downloads.
|
|
- `max_connection_per_server`
|
|
Maximum number of connections to one server for each download. Default: `1`
|
|
- `split`
|
|
Split a file into N chunks and download each chunk on it's own connection. Default: `5`
|
|
- `file_allocation`
|
|
Specify file allocation method. Default: `"prealloc"`
|
|
|
|
- `"none"` doesn't pre-allocate file space.
|
|
- `"prealloc"` pre-allocates file space before download begins. This may take some time depending on the size of the
|
|
file.
|
|
- `"falloc"` is your best choice if you are using newer file systems such as ext4 (with extents support), btrfs, xfs
|
|
or NTFS (MinGW build only). It allocates large(few GiB) files almost instantly. Don't use falloc with legacy file
|
|
systems such as ext3 and FAT32 because it takes almost same time as prealloc, and it blocks aria2 entirely until
|
|
allocation finishes. falloc may not be available if your system doesn't have posix_fallocate(3) function.
|
|
- `"trunc"` uses ftruncate(2) system call or platform-specific counterpart to truncate a file to a specified length.
|
|
|
|
## cdm (dict)
|
|
|
|
Pre-define which widevine device to use for each Service by Service Tag as Key (case-sensitive).
|
|
The value should be a WVD filename without the file extension.
|
|
|
|
For example,
|
|
|
|
```yaml
|
|
AMZN: chromecdm_903_l3
|
|
NF: nexus_6_l1
|
|
```
|
|
|
|
You may also specify this device based on the profile used.
|
|
|
|
For example,
|
|
|
|
```yaml
|
|
AMZN: chromecdm_903_l3
|
|
NF: nexus_6_l1
|
|
DSNP:
|
|
john_sd: chromecdm_903_l3
|
|
jane_uhd: nexus_5_l1
|
|
```
|
|
|
|
You can also specify a fallback value to predefine if a match was not made.
|
|
This can be done using `default` key. This can help reduce redundancy in your specifications.
|
|
|
|
For example, the following has the same result as the previous example, as well as all other
|
|
services and profiles being pre-defined to use `chromecdm_903_l3`.
|
|
|
|
```yaml
|
|
NF: nexus_6_l1
|
|
DSNP:
|
|
jane_uhd: nexus_5_l1
|
|
default: chromecdm_903_l3
|
|
```
|
|
|
|
## chapter_fallback_name (str)
|
|
|
|
The Chapter Name to use when exporting a Chapter without a Name.
|
|
The default is no fallback name at all and no Chapter name will be set.
|
|
|
|
The fallback name can use the following variables in f-string style:
|
|
|
|
- `{i}`: The Chapter number starting at 1.
|
|
E.g., `"Chapter {i}"`: "Chapter 1", "Intro", "Chapter 3".
|
|
- `{j}`: A number starting at 1 that increments any time a Chapter has no title.
|
|
E.g., `"Chapter {j}"`: "Chapter 1", "Intro", "Chapter 2".
|
|
|
|
These are formatted with f-strings, directives are supported.
|
|
For example, `"Chapter {i:02}"` will result in `"Chapter 01"`.
|
|
|
|
## credentials (dict[str, str|list|dict])
|
|
|
|
Specify login credentials to use for each Service, and optionally per-profile.
|
|
|
|
For example,
|
|
|
|
```yaml
|
|
ALL4: jane@gmail.com:LoremIpsum100 # directly
|
|
AMZN: # or per-profile, optionally with a default
|
|
default: jane@example.tld:LoremIpsum99 # <-- used by default if -p/--profile is not used
|
|
james: james@gmail.com:TheFriend97
|
|
john: john@example.tld:LoremIpsum98
|
|
NF: # the `default` key is not necessary, but no credential will be used by default
|
|
john: john@gmail.com:TheGuyWhoPaysForTheNetflix69420
|
|
```
|
|
|
|
The value should be in string form, i.e. `john@gmail.com:password123` or `john:password123`.
|
|
Any arbitrary values can be used on the left (username/password/phone) and right (password/secret).
|
|
You can also specify these in list form, i.e., `["john@gmail.com", ":PasswordWithAColon"]`.
|
|
|
|
If you specify multiple credentials with keys like the `AMZN` and `NF` example above, then you should
|
|
use a `default` key or no credential will be loaded automatically unless you use `-p/--profile`. You
|
|
do not have to use a `default` key at all.
|
|
|
|
Please be aware that this information is sensitive and to keep it safe. Do not share your config.
|
|
|
|
## curl_impersonate (dict)
|
|
|
|
- `browser` - The Browser to impersonate as. A list of available Browsers and Versions are listed here:
|
|
<https://github.com/yifeikong/curl_cffi#sessions>
|
|
|
|
## directories (dict)
|
|
|
|
Override the default directories used across devine.
|
|
The directories are set to common values by default.
|
|
|
|
The following directories are available and may be overridden,
|
|
|
|
- `commands` - CLI Command Classes.
|
|
- `services` - Service Classes.
|
|
- `vaults` - Vault Classes.
|
|
- `downloads` - Downloads.
|
|
- `temp` - Temporary files or conversions during download.
|
|
- `cache` - Expiring data like Authorization tokens, or other misc data.
|
|
- `cookies` - Expiring Cookie data.
|
|
- `logs` - Logs.
|
|
- `wvds` - Widevine Devices.
|
|
|
|
For example,
|
|
|
|
```yaml
|
|
downloads: "D:/Downloads/devine"
|
|
temp: "D:/Temp/devine"
|
|
```
|
|
|
|
There are directories not listed that cannot be modified as they are crucial to the operation of devine.
|
|
|
|
## dl (dict)
|
|
|
|
Pre-define default options and switches of the `dl` command.
|
|
The values will be ignored if explicitly set in the CLI call.
|
|
|
|
The Key must be the same value Python click would resolve it to as an argument.
|
|
E.g., `@click.option("-r", "--range", "range_", type=...` actually resolves as `range_` variable.
|
|
|
|
For example to set the default primary language to download to German,
|
|
|
|
```yaml
|
|
lang: de
|
|
```
|
|
|
|
to set `--bitrate=CVBR` for the AMZN service,
|
|
|
|
```yaml
|
|
lang: de
|
|
AMZN:
|
|
bitrate: CVBR
|
|
```
|
|
|
|
or to change the output subtitle format from the default (SubRip SRT) to WebVTT,
|
|
|
|
```yaml
|
|
sub_format: vtt
|
|
```
|
|
|
|
## downloader (str)
|
|
|
|
Choose what software to use to download data throughout Devine where needed.
|
|
|
|
Options:
|
|
|
|
- `requests` (default) - https://github.com/psf/requests
|
|
- `aria2c` - https://github.com/aria2/aria2
|
|
- `curl_impersonate` - https://github.com/yifeikong/curl-impersonate (via https://github.com/yifeikong/curl_cffi)
|
|
|
|
Note that aria2c can reach the highest speeds as it utilizes threading and more connections than the other
|
|
downloaders. However, aria2c can also be one of the more unstable downloaders. It will work one day, then
|
|
not another day. It also does not support HTTP(S) proxies while the other downloaders do.
|
|
|
|
## headers (dict)
|
|
|
|
Case-Insensitive dictionary of headers that all Services begin their Request Session state with.
|
|
All requests will use these unless changed explicitly or implicitly via a Server response.
|
|
These should be sane defaults and anything that would only be useful for some Services should not
|
|
be put here.
|
|
|
|
Avoid headers like 'Accept-Encoding' as that would be a compatibility header that Python-requests will
|
|
set for you.
|
|
|
|
I recommend using,
|
|
|
|
```yaml
|
|
Accept-Language: "en-US,en;q=0.8"
|
|
User-Agent: "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36"
|
|
```
|
|
|
|
## key_vaults (list\[dict])
|
|
|
|
Key Vaults store your obtained Content Encryption Keys (CEKs) and Key IDs per-service.
|
|
|
|
This can help reduce unnecessary License calls even during the first download. This is because a Service may
|
|
provide the same Key ID and CEK for both Video and Audio, as well as for multiple resolutions or bitrates.
|
|
|
|
You can have as many Key Vaults as you would like. It's nice to share Key Vaults or use a unified Vault on
|
|
Teams as sharing CEKs immediately can help reduce License calls drastically.
|
|
|
|
Three types of Vaults are in the Core codebase, API, SQLite and MySQL. API makes HTTP requests to a RESTful API,
|
|
whereas SQLite and MySQL directly connect to an SQLite or MySQL Database.
|
|
|
|
Note: SQLite and MySQL vaults have to connect directly to the Host/IP. It cannot be in front of a PHP API or such.
|
|
Beware that some Hosting Providers do not let you access the MySQL server outside their intranet and may not be
|
|
accessible outside their hosting platform.
|
|
|
|
### Using an API Vault
|
|
|
|
API vaults use a specific HTTP request format, therefore API or HTTP Key Vault APIs from other projects or services may
|
|
not work in Devine. The API format can be seen in the [API Vault Code](devine/vaults/API.py).
|
|
|
|
```yaml
|
|
- type: API
|
|
name: "John#0001's Vault" # arbitrary vault name
|
|
uri: "https://key-vault.example.com" # api base uri (can also be an IP or IP:Port)
|
|
# uri: "127.0.0.1:80/key-vault"
|
|
# uri: "https://api.example.com/key-vault"
|
|
token: "random secret key" # authorization token
|
|
```
|
|
|
|
### Using a MySQL Vault
|
|
|
|
MySQL vaults can be either MySQL or MariaDB servers. I recommend MariaDB.
|
|
A MySQL Vault can be on a local or remote network, but I recommend SQLite for local Vaults.
|
|
|
|
```yaml
|
|
- type: MySQL
|
|
name: "John#0001's Vault" # arbitrary vault name
|
|
host: "127.0.0.1" # host/ip
|
|
# port: 3306 # port (defaults to 3306)
|
|
database: vault # database used for devine
|
|
username: jane11
|
|
password: Doe123
|
|
```
|
|
|
|
I recommend giving only a trustable user (or yourself) CREATE permission and then use devine to cache at least one CEK
|
|
per Service to have it create the tables. If you don't give any user permissions to create tables, you will need to
|
|
make tables yourself.
|
|
|
|
- Use a password on all user accounts.
|
|
- Never use the root account with devine (even if it's you).
|
|
- Do not give multiple users the same username and/or password.
|
|
- Only give users access to the database used for devine.
|
|
- You may give trusted users CREATE permission so devine can create tables if needed.
|
|
- Other uses should only be given SELECT and INSERT permissions.
|
|
|
|
### Using an SQLite Vault
|
|
|
|
SQLite Vaults are usually only used for locally stored vaults. This vault may be stored on a mounted Cloud storage
|
|
drive, but I recommend using SQLite exclusively as an offline-only vault. Effectively this is your backup vault in
|
|
case something happens to your MySQL Vault.
|
|
|
|
```yaml
|
|
- type: SQLite
|
|
name: "My Local Vault" # arbitrary vault name
|
|
path: "C:/Users/Jane11/Documents/devine/data/key_vault.db"
|
|
```
|
|
|
|
**Note**: You do not need to create the file at the specified path.
|
|
SQLite will create a new SQLite database at that path if one does not exist.
|
|
Try not to accidentally move the `db` file once created without reflecting the change in the config, or you will end
|
|
up with multiple databases.
|
|
|
|
If you work on a Team I recommend every team member having their own SQLite Vault even if you all use a MySQL vault
|
|
together.
|
|
|
|
## muxing (dict)
|
|
|
|
- `set_title`
|
|
Set the container title to `Show SXXEXX Episode Name` or `Movie (Year)`. Default: `true`
|
|
|
|
## proxy_providers (dict)
|
|
|
|
Enable external proxy provider services.
|
|
|
|
### basic (list\[dict])
|
|
|
|
Define a mapping of country to proxy to use where required.
|
|
The keys are region Alpha 2 Country Codes. Alpha 2 Country Codes are `[a-z]{2}` codes, e.g., `us`, `gb`, and `jp`.
|
|
Don't get this mixed up with language codes like `en` vs. `gb`, or `ja` vs. `jp`.
|
|
|
|
Do note that each key's value is not a string but a list or sequence.
|
|
It will randomly choose which entry to use.
|
|
|
|
For example,
|
|
|
|
```yaml
|
|
us:
|
|
- "http://john%40email.tld:password123@proxy-us.domain.tld:8080"
|
|
- "http://jane%40email.tld:password456@proxy-us.domain2.tld:8080"
|
|
de:
|
|
- "http://127.0.0.1:8888"
|
|
```
|
|
|
|
### nordvpn (dict)
|
|
|
|
Set your NordVPN Service credentials with `username` and `password` keys to automate the use of NordVPN as a Proxy
|
|
system where required.
|
|
|
|
You can also specify specific servers to use per-region with the `servers` key.
|
|
Sometimes a specific server works best for a service than others, so hard-coding one for a day or two helps.
|
|
|
|
For example,
|
|
|
|
```yaml
|
|
username: zxqsR7C5CyGwmGb6KSvk8qsZ # example of the login format
|
|
password: wXVHmht22hhRKUEQ32PQVjCZ
|
|
servers:
|
|
- us: 12 # force US server #12 for US proxies
|
|
```
|
|
|
|
The username and password should NOT be your normal NordVPN Account Credentials.
|
|
They should be the `Service credentials` which can be found on your Nord Account Dashboard.
|
|
|
|
Once set, you can also specifically opt in to use a NordVPN proxy by specifying `--proxy=gb` or such.
|
|
You can even set a specific server number this way, e.g., `--proxy=gb2366`.
|
|
|
|
Note that `gb` is used instead of `uk` to be more consistent across regional systems.
|
|
|
|
## remote_cdm (list\[dict])
|
|
|
|
Use [pywidevine] Serve-compliant Remote CDMs in devine as if it was a local widevine device file.
|
|
The name of each defined device maps as if it was a local device and should be used like a local device.
|
|
|
|
For example,
|
|
|
|
```yaml
|
|
- name: chromecdm_903_l3 # name must be unique for each remote CDM
|
|
# the device type, system id and security level must match the values of the device on the API
|
|
# if any of the information is wrong, it will raise an error, if you do not know it ask the API owner
|
|
device_type: CHROME
|
|
system_id: 1234
|
|
security_level: 3
|
|
host: "http://xxxxxxxxxxxxxxxx/the_cdm_endpoint"
|
|
secret: "secret/api key"
|
|
device_name: "remote device to use" # the device name from the API, usually a wvd filename
|
|
```
|
|
|
|
[pywidevine]: <https://github.com/rlaphoenix/pywidevine>
|
|
|
|
## serve (dict)
|
|
|
|
Configuration data for pywidevine's serve functionality run through devine.
|
|
This effectively allows you to run `devine serve` to start serving pywidevine Serve-compliant CDMs right from your
|
|
local widevine device files.
|
|
|
|
For example,
|
|
|
|
```yaml
|
|
users:
|
|
secret_key_for_jane: # 32bit hex recommended, case-sensitive
|
|
devices: # list of allowed devices for this user
|
|
- generic_nexus_4464_l3
|
|
username: jane # only for internal logging, users will not see this name
|
|
secret_key_for_james:
|
|
devices:
|
|
- generic_nexus_4464_l3
|
|
username: james
|
|
secret_key_for_john:
|
|
devices:
|
|
- generic_nexus_4464_l3
|
|
username: john
|
|
# devices can be manually specified by path if you don't want to add it to
|
|
# devine's WVDs directory for whatever reason
|
|
# devices:
|
|
# - 'C:\Users\john\Devices\test_devices_001.wvd'
|
|
```
|
|
|
|
## services (dict)
|
|
|
|
Configuration data for each Service. The Service will have the data within this section merged into the `config.yaml`
|
|
before provided to the Service class.
|
|
|
|
Think of this config to be used for more sensitive configuration data, like user or device-specific API keys, IDs,
|
|
device attributes, and so on. A `config.yaml` file is typically shared and not meant to be modified, so use this for
|
|
any sensitive configuration data.
|
|
|
|
The Key is the Service Tag, but can take any arbitrary form for its value. It's expected to begin as either a list or
|
|
a dictionary.
|
|
|
|
For example,
|
|
|
|
```yaml
|
|
NOW:
|
|
client:
|
|
auth_scheme: MESSO
|
|
# ... more sensitive data
|
|
```
|
|
|
|
## tag (str)
|
|
|
|
Group or Username to postfix to the end of all download filenames following a dash.
|
|
For example, `tag: "J0HN"` will have `-J0HN` at the end of all download filenames.
|