2022-09-16 19:52:59 +00:00
## About
2023-09-11 01:29:11 +00:00
Sometimes, you just need a way to randomly display media from your filesystem.
2022-09-16 19:52:59 +00:00
2022-10-18 21:58:15 +00:00
Simply point this tool at one or more directories, and then open the specified port (default `8080` ) in your browser.
2022-09-16 19:52:59 +00:00
2023-09-11 01:29:11 +00:00
A new file will be selected if you open `/` directly, or if you click on any displayed files.
2022-09-16 19:52:59 +00:00
2023-09-11 01:29:11 +00:00
Browser history is preserved, so you can always go back to any previously displayed media.
2022-09-16 19:52:59 +00:00
2022-11-11 05:33:20 +00:00
Feature requests, code criticism, bug reports, general chit-chat, and unrelated angst accepted at `roulette@seedno.de` .
2022-11-11 05:34:31 +00:00
Static binary builds available [here ](https://cdn.seedno.de/builds/roulette ).
2022-11-11 23:51:02 +00:00
I only test the linux/amd64, linux/arm64, and windows/amd64 builds, the rest are all best-effort™.
x86_64 and ARM Docker images of latest version: `oci.seedno.de/seednode/roulette:latest` .
2023-09-05 15:20:04 +00:00
Dockerfile available [here ](https://git.seedno.de/seednode/roulette/raw/branch/master/docker/Dockerfile ).
2022-09-16 19:52:59 +00:00
2023-10-13 18:09:59 +00:00
An example instance with most features enabled can be found [here ](https://nature.seedno.de/ ).
2023-12-17 12:50:55 +00:00
## Admin prefix
2024-01-30 16:12:05 +00:00
You can restrict access to certain functionality (the REST API and profiling endpoints) by prepending a secret string to the paths.
2023-12-17 12:50:55 +00:00
For example, providing the `--admin-prefix=abc123` flag will register the index rebuild path as `/abc123/index/rebuild` .
2023-12-31 21:50:13 +00:00
The restricted paths are:
2024-01-14 15:29:22 +00:00
- `/debug/pprof/allocs`
- `/debug/pprof/block`
2023-12-17 12:50:55 +00:00
- `/debug/pprof/cmdline`
2024-01-14 15:29:22 +00:00
- `/debug/pprof/goroutine`
- `/debug/pprof/heap`
- `/debug/pprof/mutex`
2023-12-17 12:50:55 +00:00
- `/debug/pprof/profile`
- `/debug/pprof/symbol`
2024-01-14 15:29:22 +00:00
- `/debug/pprof/threadcreate`
2023-12-17 12:50:55 +00:00
- `/debug/pprof/trace`
- `/extensions/available`
- `/extensions/enabled`
2024-01-15 14:51:41 +00:00
- `/index/`
2023-12-17 12:50:55 +00:00
- `/index/rebuild`
- `/types/available`
- `/types/enabled`
2023-12-17 13:28:21 +00:00
While this might thwart very basic attacks, the proper solution for most use cases would likely be to add authentication via a reverse proxy.
2024-01-30 16:12:05 +00:00
## API
If the `--api` flag is passed, a number of REST endpoints are registered.
The first of these—`/index/`—responds to GET requests with the contents of the index, in JSON format.
The second—`/index/rebuild`—responds to POST requests by rebuilding the index.
This can prove useful when confirming whether the index is generated successfully, or whether a given file is in the index.
The remaining four endpoints respond to GET requests with information about the registered file types:
- `/extensions/available`
- `/extensions/enabled`
- `/types/available`
- `/types/enabled`
2022-10-20 00:56:42 +00:00
## Filtering
2022-11-10 20:54:55 +00:00
You can provide a comma-delimited string of alphanumeric patterns to match via the `include=` query parameter, assuming the `-f|--filter` flag is enabled.
2022-10-20 00:56:42 +00:00
Only filenames matching one or more of the patterns will be served.
2022-11-10 20:54:17 +00:00
You can also provide a comma-delimited string of alphanumeric patterns to exclude, via the `exclude=` query parameter.
2022-10-20 00:56:42 +00:00
Filenames matching any of these patterns will not be served.
2023-09-28 08:36:26 +00:00
You can combine these two parameters, with exclusions taking priority over inclusions.
2022-10-20 00:56:42 +00:00
Both filtering parameters ignore the file extension and full path; they only compare against the bare filename.
2023-12-07 16:34:19 +00:00
## Ignoring directories
2024-01-30 17:14:36 +00:00
If the `--ignore <filename>` flag is passed, any directory containing a file with the specified name will be skipped during the scanning stage.
2023-12-07 16:34:19 +00:00
2023-09-28 15:09:45 +00:00
## Indexing
2024-01-15 15:28:59 +00:00
If the `-i|--index` flag is passed, all specified paths will be indexed on start.
2023-09-28 15:09:45 +00:00
This will slightly increase the delay before the application begins responding to requests, but should significantly speed up subsequent requests.
2024-01-30 17:14:36 +00:00
Automatic index rebuilds can be enabled via the `--index-interval <duration>` flag, which accepts [time.Duration ](https://pkg.go.dev/time#ParseDuration ) strings.
2024-01-30 10:38:29 +00:00
2024-01-30 17:14:36 +00:00
If `--index-file <filename>` is set, the index will be loaded from the specified file on start, and written to the file whenever it is re-generated.
2023-09-28 15:09:45 +00:00
2024-01-30 10:49:46 +00:00
The index file consists of [zstd ](https://facebook.github.io/zstd/ )-compressed [gobs ](https://pkg.go.dev/encoding/gob ).
2023-12-31 21:50:13 +00:00
2022-11-09 01:24:49 +00:00
## Refresh
2023-09-14 05:07:54 +00:00
If the `--refresh` flag is passed and a positive-value `refresh=<integer><unit>` query parameter is provided, the page will reload after that interval.
2022-11-09 01:24:49 +00:00
2023-10-09 13:17:32 +00:00
This can be used to generate a sort of slideshow of files in any browser with Javascript support.
Pressing Spacebar will pause automatic refreshing until Spacebar is pressed again, the page is manually refreshed, or a new page is loaded.
2022-11-09 01:24:49 +00:00
2023-08-21 20:38:56 +00:00
Minimum accepted value is 500ms, as anything lower seems to cause inconsistent behavior. This might be changed in a future release.
2023-01-18 15:58:14 +00:00
Supported units are `ns` , `us` /`µs`, `ms` , `s` , `m` , and `h` .
2023-09-13 22:02:43 +00:00
## Russian
If the `--russian` flag is passed, everything functions exactly as you would expect.
2023-02-05 20:34:22 +00:00
2023-09-13 22:02:43 +00:00
That is, files will be deleted after being served. This is not a joke, you *will* lose data.
2023-09-13 04:35:17 +00:00
2024-01-30 10:49:46 +00:00
This uses [os.Remove() ](https://pkg.go.dev/os#Remove ) and checks to ensure the specified file is inside one of the paths passed to `roulette` .
2023-09-12 19:00:15 +00:00
2023-09-13 22:02:43 +00:00
That said, this has not been tested to any real extent, so only pass this flag on systems you don't care about.
2023-09-13 03:35:15 +00:00
2023-09-13 22:02:43 +00:00
Enjoy!
2023-09-13 04:35:17 +00:00
2023-09-13 22:02:43 +00:00
## Sorting
2023-09-28 08:36:26 +00:00
You can specify a sorting direction via the `sort=` query parameter, assuming the `-s|--sort` flag is enabled.
2023-09-12 19:00:15 +00:00
2023-09-13 22:02:43 +00:00
A value of `sort=asc` means files will be served in ascending order (lowest-numbered to highest).
2023-01-19 18:07:15 +00:00
2023-09-13 22:02:43 +00:00
If a file exists with a numbered suffix one higher than the currently displayed file, it will be served next.
2023-01-19 18:07:15 +00:00
2023-09-13 22:02:43 +00:00
A value of `sort=desc` means files will be served in descending order (highest-numbered to lowest).
2023-01-19 18:07:15 +00:00
2023-09-13 22:02:43 +00:00
If a file exists with a numbered suffix one lower than the currently displayed file, it will be served next.
2023-09-13 04:35:17 +00:00
2023-09-13 22:02:43 +00:00
In either case, if no sequential file is found, a new random one will be chosen.
2023-09-10 02:27:57 +00:00
2023-09-13 22:02:43 +00:00
For `sort=asc` , the lowest-numbered file matching a given name will be served first.
2023-09-10 02:27:57 +00:00
2023-09-13 22:02:43 +00:00
For `sort=desc` , the highest-numbered file will be served instead.
2023-09-10 02:27:57 +00:00
2023-09-13 22:02:43 +00:00
If any other (or no) value is provided, the selected file will be random.
2023-09-10 02:27:57 +00:00
2023-09-28 08:36:26 +00:00
Note: These options require sequentially-numbered files matching the following pattern: `filename[0-9]*.extension` .
2023-09-10 02:27:57 +00:00
2023-09-15 03:13:21 +00:00
## Themes
The `--code` handler provides syntax highlighting via [alecthomas/chroma ](https://github.com/alecthomas/chroma ).
2024-01-30 17:14:36 +00:00
Any [supported theme ](https://pkg.go.dev/github.com/alecthomas/chroma/v2@v2.9.1/styles#pkg-variables ) can be passed via the `--code-theme` flag.
2023-09-15 03:13:21 +00:00
By default, [`solarized-dark256` ](https://xyproto.github.io/splash/docs/solarized-dark256.html ) is used.
2022-09-16 19:52:59 +00:00
## Usage output
```
2023-09-11 01:29:11 +00:00
Serves random media from the specified directories.
2023-08-02 18:29:37 +00:00
2023-02-05 20:42:31 +00:00
Usage:
2023-01-19 18:12:40 +00:00
roulette < path > [path]... [flags]
2022-09-16 19:52:59 +00:00
Flags:
2024-01-30 10:35:49 +00:00
--admin-prefix string string to prepend to administrative paths
-a, --all enable all supported file types
--allow-empty allow specifying paths containing no supported files
2024-01-30 16:12:05 +00:00
--api expose REST API
2024-01-30 10:35:49 +00:00
--audio enable support for audio files
-b, --bind string address to bind to (default "0.0.0.0")
--case-insensitive use case-insensitive matching for filters
--code enable support for source code files
--code-theme string theme for source code syntax highlighting (default "solarized-dark256")
--concurrency int maximum concurrency for scan threads (default 1024)
2024-01-30 17:14:36 +00:00
-d, --debug log file permission errors instead of simply skipping the files
2024-01-30 10:35:49 +00:00
--disable-buttons disable first/prev/next/last buttons
--exit-on-error shut down webserver on error, instead of just printing error
--fallback serve files as application/octet-stream if no matching format is registered
-f, --filter enable filtering
--flash enable support for shockwave flash files (via ruffle.rs)
--fun add a bit of excitement to your day
-h, --help help for roulette
2024-01-30 16:12:05 +00:00
--ignore string filename used to indicate directory should be skipped
2024-01-30 10:35:49 +00:00
--images enable support for image files
2024-01-30 17:14:36 +00:00
-i, --index generate index of supported file paths at startup
2024-01-30 10:35:49 +00:00
--index-file string path to optional persistent index file
2024-01-30 16:12:05 +00:00
--index-interval string interval at which to regenerate index (e.g. "5m" or "1h")
2024-01-30 10:35:49 +00:00
--max-file-count int skip directories with file counts above this value (default 2147483647)
--min-file-count int skip directories with file counts below this value
-p, --port int port to listen on (default 8080)
--prefix string root path for http handlers (for reverse proxying) (default "/")
--profile register net/http/pprof handlers
-r, --recursive recurse into subdirectories
--refresh enable automatic page refresh via query parameter
--russian remove selected images after serving
-s, --sort enable sorting
--text enable support for text files
-v, --verbose log accessed files and other information to stdout
-V, --version display version and exit
--video enable support for video files
2023-09-05 13:22:06 +00:00
```
## Building the Docker container
From inside the `docker/` subdirectory, build the image using the following command:
2023-10-13 18:09:59 +00:00
`REGISTRY=<registry url> LATEST=yes TAG=alpine ./build.sh`