README.md

# Subtitles

**This library provides several tools for manipulating and converting subtitles**

## Installation

If [available in Hex](https://hex.pm/docs/publish), the package can be installed
by adding `subtitles` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:subtitles, "~> 0.1.0"}
  ]
end
```

Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc)
and published on [HexDocs](https://hexdocs.pm). Once published, the docs can
be found at [https://hexdocs.pm/subtitles](https://hexdocs.pm/subtitles).

## Usage

This library only supports subtitles in UTF-8 format.  

All functions convert all line endings to LF before operations are done.

### Tests

Run tests:  

`$ mix espec`

## Functions

### Subtitles

**Subtitles.get_format(subtitle)**

Returns the subtitle format as an atom, defaults to `:unknown`

```
subtitle = "WEBVTT\n\n..."
Subtitles.get_format(subtitle) # :vtt

subtitle = "1\r\n..."
Subtitles.get_format(subtitle) # :srt

subtitle = "Anything else"
Subtitles.get_format(subtitle) # :unknown
```

**Subtitles.parse(subtitle)**

Tries to figure out the format of the subtitle and then parse it  
by using the correct parser, returning a tuple:

```
subtitle = "WEBVTT\n\n..."
Subtitles.parse(subtitle) # {:ok, result}

subtitle = "Anything else"
Subtitles.parse(subtitle) # {:error, "Unknown subtitle format"}
```

**Subtitles.parse(subtitle, type)**

Dispatches the subtitle to the parser of type `type` and returns a tuple (see above):

```
Subtitles.parse(sub, :vtt) == Subtitles.VttParser.parse(sub)
Subtitles.parse(sub, :srt) == Subtitles.SrtParser.parse(sub)
```

### Subtitles.SrtParser/Subtitles.VttParser

**Subtitles.SrtParser.parse(subtitle)**
**Subtitles.VttParser.parse(subtitle)**

Returns a parsed list of all cues in the subtitle in the following format:

```
%Subtitle{
  from: ~T[00:00:00.000], # cue from, Elixir Time
  to: ~T[00:00:12.345],   # cue to, Elixir time
  parts: [
    %SubtitlePart{          # Cue data, one per line
      text_data: "Cue text" # actual text of the cue
    }
  ]
}
```

### Subtitles.SrtFormatter

**Subtitles.SrtFormatter.format(subtitles)**

Takes a list of `Subtitle` structs and returns an srt string

### Subtitles.VttFormatter

**Subtitles.SrtFormatter.format(subtitles)**

Takes a list of `Subtitle` structs and returns a vtt string  

## Notes

The current format detectors are quite dumb and will only match as follows:  

**vtt** -> starts with WEBVTT  

**srt** -> starts with a full cue