Stream media files over SSH in a convenient way
Find a file
2021-05-09 19:18:02 +02:00
flake.lock update flake 2021-05-04 01:00:11 +02:00
flake.nix update flake 2021-04-30 10:22:40 +02:00
README.org update README 2021-05-04 01:33:46 +02:00
strm add album to statusline 2021-05-09 19:18:02 +02:00
strm.config allow spaces in media directory paths 2021-05-01 07:38:13 +02:00

strm

strm is a small Bash script that lets you stream media files over SSH in a convenient way.

No need for mounting and navigating through complex directory structures anymore. Just provide a query and the matching media files are played locally (or remote) via mpv.

Here is an example.. let's assume you have the shortfilm The Daily Dweebs stored on a remote machine in the following directory structure:

  media
  └── movies
      ├── ...
      ├── The Daily Dweebs (2017)
      │   └── The Daily Dweebs (2017).mkv
      └── ...

If strm is configured to use the media directory, you can play the shortfilm e.g. with the following command:

  strm daily dweebs

Every argument which is not assigned to a flag is interpreted as part of the query. The query arguments are interpreted as glob patterns, additionally surrounded by wildcards (*). If every pattern matches any filepath in the configured media directories, the matched filepaths are interpreted as result. The --or flag can be set to get results which match at least one pattern. Matchings are always done case-insensitive.

The shortfilm from the example above could have also been played with one of the following commands:

  strm dweebs daily
  strm movies dwee
  strm d d 17

It is possible that multiple files are matched by one of the commands. All files are then played in the order of the configured media directories, followed by lexicographical order of the filepath.

strm consists mainly of two parts:

  1. Execute find via SSH on a machine
  2. Play the matched files with mpv over SFTP

The rest is just bells and whistles.

Features

  • List remote files by query
  • Play remote files via mpv
  • Query multiple remote directories with one command
  • Play remote files on other machines (need to have strm installed)

You can access your local machine also via SSH, so every occurrence of remote in the list can be replaced with local.

mpv has a nice feature which lets you resume playback. This is handy if you want to e.g. continue watching you favourite series at a later point in time. Check the usage below to see how this works.

Dependencies

The dependencies vary, based on the purpose of a machine:

The machine shall serve as data storage
It must be available via SSH.
The machine shall serve as player
mpv and an SSH client must be installed.
The machine shall serve as player and will be remote controlled
mpv, strm, tmux and an SSH client must be installed and it must be available via SSH.
The machine shall serve only as controller
An SSH client must be installed.

A machine can be used for multiple purposes, make sure all required dependencies are fulfilled.

Installation

strm is just a script, you can execute it directly. Or grab it, make it executable and place it in your $PATH.

This project is also a Nix flake. You can execute it with the following command if you have a recent version of Nix installed and flakes are enabled:

  nix run github:Deleh/strm -- --help

If you use it this way, mpv is started with MPRIS support by default.

Usage

  Usage: strm [OPTIONS] QUERIES ... [OPTIONS]

  Stream media files over SSH in a convenient way.

  OPTIONS
    -h, --help                                 Show this help message
    -c, --config CONFIG_FILE                   Path to config file (default: ~/.config/strm/strm.config)
    -f, --fullscreen                           Play video files in fullscreen
    -l, --list                                 List files instead of playing
    -m, --media-directories MEDIA_DIRECTORIES  Use given media directories, config is ignored
    -o, --or                                   Use a logical OR for queries (default: AND)
    -r, --remote SSH_CONNECTION_STRING         Execute strm with other given arguments on remote machine (-f is set by default)
    -s, --shuffle                              Play files in random order

  EXAMPLES
    strm -l .             # List all available files
    strm Elephants Dream  # Play files whose path contain 'elephants' and 'dream'
    strm e*phants         # Play files whose path matches the glob pattern 'e*phants'

The usual mpv controls are available while playback. Here is a subset:

LEFT and RIGHT
Seek backward/forward.
p and SPACE
Pause (pressing again unpauses).
< and >
Go backward/forward in the playlist.
f
Toggle fullscreen.
q
Stop playing and quit.
Q
Like q, but store the current playback position. Playing the same file later will resume at the old playback position if possible. This works for single and mutliple files. To listen e.g. to an audiobook in multiple stages you can always use the same command (strm audiobook). Just make sure you always quit with Q. To clear all stored positions remove the directory (~/.config/mpv/watch_later).

The --remote flag

The --remote flag executes strm on another machine in a tmux session and passes all other given arguments to it. Launching it in a tmux session allows to detach from the session with C-b d. If a session is already running on the target machine, the session gets attached and further commands are ignored (it is even sufficient to call strm -r <remote> to reattach).

If you pass the --media-directories flag, strm doesn't need to be configured but make sure your arguments are correct from the point of view of the remote machine. The same holds true if you pass the --config flag.

--fullscreen is inverted when playing on a remote machine. It is set by default and not set if you explicitly pass it.

On the remote, the $DISPLAY variable is set by default to :0 which should fit most setups. If you wish to change this, search for the line containing DISPLAY in the script and adjust it.

Configuration

If the --media-directories argument is not set, the script looks for a configuration file with the following content:

  # Media directories on remote machines of the following form:
  #
  #   <SSH connection string><absolute_path_to_media_directory>
  #
  # Multiple media directories can be set with a comma (,) as delimiter.
  # Spaces must be escaped with a backslash (\).
  # Media directories are queried and played in order.
  #
  # Examples:
  #   localhost/home/bob/videos
  #   remote-machine/home/bob/music
  #   bob@another-machine/media/movies,bob@10.0.0.1/home/bob/series
  media_directories=""

An example configuration file can be found in the repository.

The default path of the configuration is $HOME/.config/strm/strm.config. You can use the --config flag to set another configuration file.

The flag --media-directories is used in favour of a configuration file and can be used with the same syntax as described above.