# ffmusicsync
A simple utility which creates an encoded music folder out of your library and keeps it updated using as least ffmpeg
runs as possible.
## Requirements
- [ffmpeg](https://ffmpeg.org/) installed and added to PATH
- [rclone](https://rclone.org/) installed and added to PATH (Optional, only when using remotes)
## Features
- Encode an entire folder, copying already encoded songs
- Keep the folder updated with subsequent runs - you can remove and add songs to the original one
- Remove brackets from the filenames - no more `(Original Mix)` in every single name, customizable
- Lots of file formats supported - acts as a ffmpeg wrapper, supports everything ffmpeg does
- Keep a list of the encoded files so even if you change the renaming settings it won't need to re-encode them
- Copy covers to files post-encode*
- Support files being on rclone remotes - automatically downloads them, encodes locally and uploads
*See the [lofty crate](https://docs.rs/lofty/0.6.3/lofty/index.html#supported-formats) for a list of supported formats
to copy from/to
## Configuration examples
`config.json` can contain comments, so you can just copy-paste the example.
```jsonc
{
// Input and output directory
// Can be either a string or an object:
// If it's a string and contains a ':', it will be treated as an rclone remote
"inputDirectory": "MyStorage:FLAC",
"outputDirectory": {
// Both fields are optional
// If remote is not present or blank it will be treated as a local location
"remote": "MyStorage",
"path": "Encoded"
},
// Optional, used only when either the input or output directory is remote
"tempDirectory": "temp",
// An array of all extensions that will be encoded
// All that are not present here (such as mp3 in this case) will be just copied to the output directory
"extensionsToEncode": [
"flac"
],
// A string containing the extension for encoded files
"encodedExtension": "ogg",
// Add covers to files after encoding them
// ffmpeg can't do that by itself for OGG files
// The option doesn't need to be present, defaults to false
"copyCovers": true,
// A string containing the ffmpeg params
// ffmpeg command looks like:
// ffmpeg -i