#+OPTIONS: toc:nil

* subed news
** Version 1.4.2 - 2026-04-18 - Sacha Chua

- New commands:
  - ~subed-vtt-insert-chapter-comments~ takes chapter markers as a string and adds NOTE comments defining those chapters, which you can extract with ~subed-section-comments-as-chapters~ after you adjust them.
  - ~subed-vtt-combine-separate-speaker-files~ can combine VTT, such as when you transcribe different tracks of a conversation.
  - ~subed-duplicate-subtitle~
  - ~subed-mpv-jump-to-timestamp-or-current-subtitle~
  - ~subed-vtt-insert-word-timestamp~
- New hooks:
  - ~subed-subtitle-split-hook~.
  - ~subed-waveform-make-overlay-hook~
- New functions:
  - ~subed-subtitle-end-pos~
- New autoloads:
  - ~subed-word-data-fix-subtitle-timing~
  - ~subed-word-data-compare-normalized-string-distance~
- ~[Speaker]:~ tags are copied or deduplicated when splitting or merging subtitles.
- subed-vtt:
  - Check for the end of the buffer.
  - Sanitize/validate to make sure there are separators.
- subed-waveform:
  - ~subed-waveform--mouse-event-to-ms~ now takes an optional parameter for the X coordinate to convert.
  - Refresh waveforms after splitting.
  - ~subed-waveform-jump-to-timestamp~: Copy the timestamp for easier pasting.
  - New options ~subed-waveform-image-width~ and ~subed-waveform-image-height~
- subed-word-data: Include speaker diarization if available.
- ~subed-align-mfa-set-word-data~ can now work on a region or sepcify beam size.
- ~subed-file-duration-ms~: Cache based on filename to support multiple files.
- Updated tests to work on Emacs 31.

** Version 1.4.1 - 2026-02-16 - Sacha Chua

- You can now use Montreal Forced Aligner or Aeneas to generate word timestamps using ~subed-align-mfa-set-word-data~ or ~subed-align-aeneas-set-word-data~.
- subed-word-data now uses approximate matches by default.

** Version 1.4.0 - 2026-02-10 - Sacha Chua

- subed-word-data.el can now load word timing from TextGrid files produced by the Montreal Forced Aligner.
- New functions: ~subed-word-data-add-word-timestamps~, ~subed-word-data-remove-word-timestamps~

** Version 1.3.1 - 2026-01-03 - Sacha Chua

- ~subed-convert~ can convert from plain text files now. Each line is turned into a subtitle.
- ~subed-wdiff-subtitle-text-with-file~ allows you to ignore a regxep when comparing.

** Version 1.3.0 - 2026-01-03 - Sacha Chua

- subed no longer sorts subtitles by default on saving the file, since that was taking a long time.
  If you would like to sort subtitles, use =subed-sort=.

** Version 1.2.25 - 2025-01-28 - Sacha Chua

- subed-vtt: Don't require blank lines before timestamps. Support multiple components in a cue.
- Document YouTube workflow.

** Version 1.2.24 - 2025-01-24 - Sacha Chua

- New command subed-section-comments-as-chapters.
- subed-word-data.el: Load word data from Youtube VTT files.
- Approximately match word data.
- Move CPS overlay more often.
- subed-sum-time can take a list of subtitles.
- subed-vtt merges comments as well.

** Version 1.2.23 - 2024-12-19 - Sacha Chua

- New menu.

** Version 1.2.22 - 2024-12-19 - Sacha Chua

- New commands:
  - subed-sum-time displays the total time for the
    subtitles. Note that this is the sum of the
    duration of each subtitle, not the difference
    between the earliest start time and the latest
    end time.
  - subed-retime-subtitles: provide a transient map for setting subtitle times.
  - subed-align-region: use Aeneas to realign the
    text within the region using the start and end
    time in the region.
  - subed-word-data-fix-subtitle-timing: use
    WhisperX or SRV2 word data to adjust timing in
    the region or buffer.
  - subed-crop-subtitles, subed-crop-media-file
  - lots of new commands for controlling MPV,
    starting with the C-c C-f shortcut for
    subed-mpv-control which uses
    subed-mpv-control-map as the transient keymap.
    Use M-x describe-variable
    subed-mpv-control-map for details.
- New hook: subed-region-adjusted-hook
- Renamed subed-waveform-ffmpeg-executable to
  subed-ffmpeg-executable, moved duration from
  subed-waveform to subed.
- Bugfixes and minor improvements:
  - VTT bugfix: Require subtitle separator before NOTE so that cues can contain the string "Note"
  - Fix compiler warnings.
  - subed-word-data-load-from-file: offer directories during completion for easier navigation.
- Added more notes to the README.org.

** Version 1.2.20, 1.2.21 - 2024-11-17 - Sacha Chua

- subed-word-data.el: Bugfix, whoops. I should write tests for this someday...

** Version 1.2.19 - 2024-11-16 - Sacha Chua

- subed-word-data.el: Enhancement: Show transcription confidence based on WhisperX JSON data.
- subed-waveform.el: Bugfix: Handle files with invalid duration.

** Version 1.2.18 - 2024-11-06 - Sacha Chua

- Bugfix: VTT: Ignore timestamp-like text at the start of subtitle cues.

** Version 1.2.17 - 2024-10-17 - Sacha Chua

- subed-word-data: Load JSON data from WhisperX.
- Merging should not include the current subtitle if the point is at the beginning of the subtitle.

** Version 1.2.16 - 2024-10-06 - Sacha Chua

- subed-merge-with-next separates subtitles
  with spaces instead of newlines. If you prefer
  it the other way (keeping line breaks), let me
  know and we can make it an option.

- subed-create-file regenerates IDs.

** Version 1.2.15 - 2024-09-06 - Sacha Chua

- Bugfix: Handle extra attributes after VTT timestamps (for example, from YouTube VTTs).
  Thanks to Jeff Trull for reporting this!

** Version 1.2.14 - 2024-07-05 - Sacha Chua

- Bugfix: subed-waveform should now handle the
  case where the stop time +
  subed-waveform-preview-msecs-after might extend
  past the end of the file.

  Thanks to rodrigomorales1 and rndusr for the bug reports and pull requests!
  
** Version 1.2.13 - 2024-07-05 - Sacha Chua

- Bugfix: Fix the requires in subed-waveform to load subed-common.

** Version 1.2.12 - 2024-07-05 - Sacha Chua

- Bugfix: Handle SRT cues that have lines that
  only contain numbers, as they were getting
  confused with cue IDs.

** Version 1.2.11 - 2022-12-20 - Sacha Chua

- New commands ~subed-shift-subtitles-to-start-at-timestamp~ and
  ~subed-move-subtitles-to-start-at-timestamp~ should make it easier
  to adjust timestamps without doing msec math.
- Add workflow notes to README.org.

** Version 1.2.10 - 2023-12-20 - Sacha Chua

- Add extra line after comments in text output.
- ~subed-guess-format~ can now take a filename.

** Version 1.2.9 - 2023-12-19 - Sacha Chua

- New ol-subed adds subed: links to Org Mode. To use it, add ~(require
  'ol-subed)~ to your configuration. Then you can store links with
  ~org-store-link~.
- ~M-mouse-2~ (M-middle-click) on a subed waveform shifts subtitles.
- VTT: msecs are now optional.
- New command ~subed-wdiff-subtitle-text-with-file~ compares subtitle
  text with a script or other subtitles. It uses the external wdiff
  tool.
- subed-subtitle-comment now returns nil when there's no comment.

** Version 1.2.8 - 2023-11-28 - Sacha Chua

- subed-waveform:
	- ~M-mouse-1~ (M-left click) and ~M-mouse-3~ (M-right-click) now set
    the start or end timestamp and copy it to the previous or next
    subtitle, respectively. This makes it easier to hold ~M-~ down to
    change timestamps with the mouse or with ~M-[~, ~M-]~, ~M-{~, and
    M-}, navigating between subtitles with ~M-n~ and ~M-p~.
	- You can now show waveforms for all the subtitles using M-x
    subed-waveform-show-all. Set subed-waveform-show-all to non-nil if
    you want this to be the default behavior of ~M-x subed-waveform
    minor-mode~.
- Default to keeping MPV open at the end of the file.
- New hooks: ~subed-subtitles-sorted-hook~,
	~subed-subtitle-merged-hook~
- New function ~subed-media-file~ for things like [[https://github.com/sachac/subed-record][subed-record]] which
  can refer to multiple sources in one file.

** Version 1.2.7 - 2023-11-10 - Sacha Chua

- subed-align: Use current media file even if it's a video, and
  restore the comments assuming the subtitles are in sequence.
- add .m4a to the list of media extensions

** Version 1.2.6 - 2023-11-05 - Sacha Chua

New commands and functions:
- M-J: subed-mpv-jump-to-current-subtitle-near-end
- subed-waveform:
  - S-mouse-1: subed-waveform-set-start-and-copy-to-previous
  - S-mouse-3 (right-click): subed-waveform-set-stop-and-copy-to-next
- subed-append-subtitle-list

New option:
- subed-sample-msecs

Other changes:
- Update loop after adjusting timestamps
- Appending or splitting subtitles in VTT files with comments now puts
  new subtitles before the next comment.

** Version 1.2.5 - 2023-10-15 - Sacha Chua

Ignore MPV socket errors when closing files on remote computers.

** Version 1.2.4 - 2023-09-11 - Sacha Chua

Guess the format when the generic subed-mode is loaded. Also, require
svg when subed-waveform is loaded.

** Version 1.2.3 - 2023-06-18 - Sacha Chua

Added subed-waveform, which you can enable with
subed-waveform-minor-mode. This makes it easier to review the waveform
for the current subtitle so that you can use it to adjust the start or
stop time. It requires the ffmpeg executable. Thanks, mbork!

** Version 1.2.2 - 2023-04-09 - Sacha Chua

subed should not autoplay media over TRAMP.

** Version 1.2.1 - 2023-03-21 - Sacha Chua

Adjusting the starting or stopping timestamp (including via merges)
should now also update the looping start and stop times.

** Version 1.2.0 - 2023-03-10 - Sacha Chua

I changed ~subed-mode~ so that it doesn't add functions to local
hooks, because that seems to mess up configuring hooks from your Emacs
init file. Please see README.org for recommended code to add to your
~subed-mode-hook~. I decided to suggest each line separately so that
it's easier for people to disable specific behaviors instead of hiding
it in ~subed-setup-defaults~.

** Version 1.1.0 - 2023-03-07 - Sacha Chua

There are new customizable values for subed-enforce-time-boundaries
that affect setting or adjusting the start or stop times if a subtitle
will end up overlapping with the previous or next subtitle (based on
subed-subtitle-spacing), or if a subtitle will have negative duration.

- ='adjust=: the new default. If a subtitle will have invalid times,
  adjust the other time to resolve the conflict.
- ='clip=: set the current time to at most (or at least) the other time, taking spacing into account.
- ='error=: report an error when trying to set an invalid time.
- =nil=: don't perform any checks, just set the time.

By default, you can adjust times with ~M-[~ (~decrease-start-time~), ~M-]~ (~increase-start-time~), ~M-{~ (~decrease-stop-time~), and ~M-}~ (~increase-stop-time~).

I've been writing more tests to cover the behavior, but I might've
missed stuff, so please let me know if things turn up!

** Version 1.0.29 - 2022-12-29 - Sacha Chua

subed-toggle-sync-point-to-player should not confuse subed when it is
already looping over a subtitle. Also, subed-loop-seconds-before and
subed-loop-seconds-after now default to 0 for less confusion.

** Version 1.0.28 - 2022-12-22 - Sacha Chua

subed-parse-file should handle nil filenames now. Also, it should not
try to autoplay media.

** Version 1.0.27 - 2022-12-16 - Sacha Chua

Bugfix: Actually include VTT comments when inserting subtitles
programmatically.

** Version 1.0.26 - 2022-11-30 - Sacha Chua

subed-align now keeps VTT comments. It also doesn't remove silences by
default now, since aeneas turned out to be a little too aggressive
about silence detection.

** Version 1.0.25 - 2022-11-30 - Sacha Chua

subed-move-subtitles and subed-scale-subtitles are now interactive
commands. The documentation for subed-scale-subtitles now mentions
subed-move-subtitles, and I've updated the README to mention them.

** Version 1.0.24 - 2022-11-18 - Sacha Chua

subed should compile without checkdoc warnings or obsolete functions now.

** Version 1.0.23 - 2022-11-18 - Sacha Chua

You can now use ~subed-copy-region-text~ to copy the text from
subtitles in a region. Call it with a prefix argument (~C-u M-x
subed-copy-region-text~) to include comments.

Calling ~C-u M-x subed-convert~ will retain comments in the TXT
output.

** Version 1.0.22 - 2022-11-17 - Sacha Chua

VTT comments are now parsed and returned as part of ~subed-subtitle~
and ~subed-subtitle-list~. This makes it easier to build workflows
that use the comment information, such as adding NOTE lines for
chapters and then creating a new file based on those lines and the
subtitles following them.

A new function ~subed-create-file~ helps create a file with a list of
subtitles.

Sanitizing VTT files with ~subed-sanitize~ should retain comments now.

~subed-convert~ should now create a buffer instead of a file if the
source is a buffer that isn't a file.

** Version 1.0.21 - 2022-11-16 - Sacha Chua

- subed-align-options is a new variable that will be passed to aeneas
  during execution.
- Calling subed-split-subtitle with the C-u prefix will now allow you
  to specify either an offset or a timestamp. If a timestamp is
  specified, it will be used as the starting timestamp of the second
  subtitle.

** Version 1.0.20 - 2022-11-16 - Sacha Chua

subed now talks about media files instead of video files, since audio
files are fine too. Updating the function names and documentations to
refer to media instead of video files can help people think of using
subed for audio files as well. Distinguishing between video and audio
extensions can be useful for tools like aeneas, which expect audio
files.

I defined obsolete function and variable aliases for most things, but
subed-mpv-media-file (used to be subed-mpv-video-file) uses
defvar-local, so it didn't work well with
define-obsolete-variable-alias. If you have any code that uses
subed-mpv-video-file, please rewrite it to refer to
subed-mpv-media-file instead.

** Version 1.0.19 - 2022-11-11 - Sacha Chua

New commands subed-merge-dwim, subed-merge-region,
subed-merge-region-and-set-text, and subed-set-subtitle-text can help
with making chapter files.

Added more details to the README.org.

This version also includes bugfixes for subed-align and subed-vtt.

** Version 1.0.18 - 2022-11-08 - Sacha Chua

New function subed-parse-file.

** Version 1.0.17 - 2022-11-07 - Sacha Chua

New command subed-align in the subed-align.el file lets you use aeneas
for forced alignment. This can assign timestamps to each line of text.

VTT files can now have optional cue identifiers. A cue identifier is a
line of text before the timestamps that can identify the cue. It
should not contain "-->".

** Version 1.0.16 - 2022-10-26 - Sacha Chua

When you load word data, subtitle words that were successfully matched
with the word-level timestamps will now be highlighted so that it's
easier to split at them.

** Version 1.0.15 - 2022-10-26 - Sacha Chua

Added support for SRV2 files in subed-word-data.el. You can use
subed-word-data-load-from-file to load word-level timing data from
SRV2 files or add subed-word-data-load-maybe to the subed-mode-hook.

VTT no longer assumes that the start of the file is part of
the first subtitle.

VTT and SRT are now less confused by spaces at the end of a subtitle
when splitting.

** Version 1.0.14 - 2022-10-25 - Sacha Chua

Delete the CPS overlay when disabling it

** Version 1.0.13 - 2022-10-25 - Sacha Chua

Fixed TSV fontlocking.
Improved subed-convert so that the new buffer is also visiting a file.

** Version 1.0.12 - 2022-10-23 - Sacha Chua

Added new command ~subed-convert~.

** Version 1.0.11 - 2022-10-23 - Sacha Chua

Added subed-tsv.el for Audacity label exports. Use M-x subed-tsv-mode to load it.

** Version 1.0.10 - 2022-09-20 - Sacha Chua

Use - instead of : in mpv socket names to see if that will make it work better on Microsoft Windows.

** Version 1.0.9 - 2022-09-14 - Sacha Chua

- Consolidated the different faces to subed-id-face, subed-time-face,
  and subed-time-separator-face. Added tests for font-locking. Dropped
  text font-locking for now since we didn't have a good regular
  expression for it.

  Obsolete:
  - subed-srt-id-face
  - subed-srt-time-face
  - subed-srt-time-separator-face
  - subed-srt-text-face
  - subed-vtt-id-face
  - subed-vtt-time-face
  - subed-vtt-time-separator-face
  - subed-vtt-text-face
  - subed-ass-id-face
  - subed-ass-time-face
  - subed-ass-time-separator-face
  - subed-ass-text-face
  
Thanks to Igor for the bug report!

** Version 1.0.8 - 2022-09-08 - Sacha Chua

- Added support for SRT comment syntax thanks to mbork.
  http://mbork.pl/2022-09-05_Comments_in_srt_files

** Version 1.0.6 - 2022-07-22 - Sacha Chua

- Allow mm:ss.000 (optional hours) when validating VTT files.
- Use just the buffer name hash when naming the MPV socket.

** Version 1.0.3 - 2022-02-07 - Sacha Chua

subed now tries to avoid sorting already-sorted buffers, which should
reduce interference with mark rings and other things.

** Version 1.0.1 - 2022-02-01 - Sacha Chua

Added obsolete function aliases in case people are calling
format-specific functions in their code.

** Version 1.0.0 - 2022-01-02 - Sacha Chua

Format-specific modes are now initialized with =(subed-srt-mode)=,
=(subed-vtt-mode)=, or =(subed-ass-mode)= instead of the corresponding
=(subed-vtt--init)= functions.

I implemented the format-specific functions with =cl-defmethod=, so if
you have any code that refers to functions like
=subed-vtt--timestamp-to-msecs=, you will need to change your code to
use generic functions such as =subed-timestamp-to-msecs=.
