# Dual-audio video maker

You can pass 2 playlists (or 2 lists with playlists), first for extracting audio (`audio-playlists`), second for resulting video (`video-playlists`), and get video with both audio tracks. For the first playlists it is better to use low quality video.

## Dependencies

You need installed in system `ffmpeg` (work with media), `wget` (download) and `grep` utilities.

## Install

```bash
pip install dual-audio
```

## Usage example

Extract audios from video files from `audio-playlist.m3u` and add to related videos from `video-playlist.m3u` (for example, `1x1.aac` will be added to `1x1.mp4`).

```bash
dual-audio --out-dir . -a audio-playlist.m3u -v video-playlist.m3u
```

Number of entries in both audio and video playlists should be equal.

After downloading and converting, you may also want to specify a language for each audio track. Create a file with filenames to do this mapping, e.g. `list.txt` (or use `finished.txt`), then if the first audio track is russian and the second is english, run:

```bash
dual-audio \
	--fix-audio-lang \
	--fix-audio-lang-list list.txt \
	--first-audio-lang rus \
	--second-audio-lang eng
```

First track from video playlist, second from audio playlist.

## CLI arguments

| Argument                | Action                                                       |
|:------------------------|:-------------------------------------------------------------|
| `-d, --out-dir`         | Directory where place audio and video folders                |
| `-a, --audio-playlists` | Path(s) to playlist(s) with videos from which extract audio  |
| `-v, --video-playlists` | Path(s) to playlist(s) with videos to add a second audio     |
| `--args`                | Pass shell arguments via file                                |
| `--preserve-video`      | Preserving original videos from `video-playlists`            |
| `-h, --help`            | Show help message and exit                                   |
| `--fix-audio-lang`      | Fix audio tracks language metadata <sup>1</sup>              |
| `--fix-audio-lang-list` | File with list of filenames to fix language                  |
| `--first-audio-lang`    | Language in first audio track (from video file) <sup>2</sup> |
| `--second-audio-lang`   | Language in second audio track (from extracted audio)        |

<sup>1</sup> If specified, downloading and converting will not be performed.

<sup>2</sup> Language is 3-letter identifier like "eng" or "rus".

## Shortened M3U playlist syntax

You can write playlists manually by this template:

```
#EXTM3U
#EXTINF: <duration>,<title>
#EXTVLCOPT:
<link>
```

- `#EXTM3U` is the required header for the file,
- duration can be zero,
- the title must not contain commas,
- the link should be on a separate line,
- other lines and directives are ignored and can be omitted.

*For example*:

```
#EXTM3U
#EXTINF: 0,Your show - episode 1
http://example.com/1x1.mp4
#EXTINF: 0,Your show - episode 2
http://example.com/1x2.mp4
```

These videos will be saved as `Your show - episode 1.mp4` and `Your show - episode 2.mp4`.

## How it works

1. Parse playlists.
2. Download `audio-playlists`. For each playlist:
	- Download videos to `video-cache` folder,
	- Extract audio to `audio` folder and select extension based on `ffprobe` (from `ffmpeg`) output,

	For example, from the `Stream #0:0: Audio: aac (LC), 48000 Hz, stereo, fltp, 94 kb/s` line will be taken `aac`.
3. For each playlist from `video-playlists` download videos to `video/` folder.
4. Correlate audio and video file names (for example, `1x1.aac` will be added to `1x1.mp4`).
5. Join audios and videos and save to `video-result` folder.
6. If `--preserve-video` is not passed, move resulting videos to `video` folder.
