;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2024 Tomas Volf <~@wolfsden.cz> ;;; ;;; This file is part of GNU Guix. ;;; ;;; GNU Guix is free software; you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 3 of the License, or (at ;;; your option) any later version. ;;; ;;; GNU Guix is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with GNU Guix. If not, see . (define-module (gnu home services mpv) #:use-module (gnu home services) #:use-module (guix gexp) #:use-module (ice-9 match) #:use-module (ice-9 regex) #:use-module (srfi srfi-1) #:use-module (srfi srfi-2) #:use-module (srfi srfi-9) #:use-module (srfi srfi-26) #:use-module (srfi srfi-71) #:export (make-home-mpv-configuration home-mpv-configuration? home-mpv-configuration-global home-mpv-configuration-profiles home-mpv-configuration-extra-config home-mpv-configuration-source-location serialize-home-mpv-configuration %unset make-mpv-profile-configuration mpv-profile-configuration? ;; Field accessor procedures are exported by a syntax form when ;; they are defined, so they are not listed here. home-mpv-service-type)) (define %unset '(*unset*)) ;;; ;;; Basic types. ;;; (define (serialize-type/boolean field-name value) #~(string-append #$(symbol->string field-name) "=" #$(if value "yes" "no") "\n")) (define type/boolean? (const #t)) (define (serialize-type/integer field-name value) #~(string-append #$(symbol->string field-name) "=" #$(number->string value) "\n")) (define (type/integer? n) ;; We assume integer is a signed 32bit number. (and-let* (((integer? n)) ((>= n -2147483648)) ((<= n 2147483647))))) (define (serialize-type/integer64 field-name value) #~(string-append #$(symbol->string field-name) "=" #$(number->string value) "\n")) (define (type/integer64? n) ;; We assume integer is a signed 64bit number. (and-let* (((integer? n)) ((>= n -9223372036854775808)) ((<= n 9223372036854775807))))) (define (serialize-type/string field-name value) #~(string-append #$(symbol->string field-name) "=" #$value "\n")) (define type/string? string?) (define (serialize-type/float field-name value) #~(string-append #$(symbol->string field-name) "=" #$(number->string (exact->inexact value)) "\n")) (define type/float? ;; I am not sure how to validate floats. real?) (define (serialize-type/double field-name value) #~(string-append #$(symbol->string field-name) "=" #$(number->string (exact->inexact value)) "\n")) (define (type/double? value) ;; I am not sure how to validate doubles. real?) ;;; ;;; Additional types (possible based on the basic ones). ;;; ;;; Aspect seems to be treated as an integer, so define it in terms of it. (define serialize-type/aspect serialize-type/integer) (define type/aspect? type/integer?) ;;; `Audio channels or channel map' seems to be basically a free form string ;;; with no way to validate. (define serialize-type/audio-channels-or-channel-map serialize-type/string) (define type/audio-channels-or-channel-map? type/string?) ;;; Does not seem possible to validate. (define serialize-type/audio-format serialize-type/string) (define type/audio-format? type/string?) ;;; While most options list 4.6116860184274e+18 as a maximum value, we will ;;; use integer64 here. That should be enough for everyone for few more ;;; years. (define serialize-type/byte-size serialize-type/integer64) (define type/byte-size? type/integer64?) (define (serialize-type/color field-name value) #~(string-append #$(symbol->string field-name) "=" #$(if (list? value) (string-join (map number->string value) "/") value) "\n")) (define (type/color? value) (define (ok-num? n) (and (number? n) (>= n 0) (<= n 1))) (if (list? value) ;; Either a list of 3(4) numbers encoding RGB(A) on range from 0 to 1... (match value (((? ok-num? r) (? ok-num? g) (? ok-num? b)) #t) (((? ok-num? r) (? ok-num? g) (? ok-num? b) (? ok-num? alpha)) #t) (_ #f)) ;; ... or RGB(A) hex encoding. (string-match "^#([A-Fa-f0-9]{2})?[A-Fa-f0-9]{6}$" value))) ;;; I do not see value mirroring fourcc.org's database here. It is further ;;; complicated by arbitrary hex being accepted as well. So string it is. (define serialize-type/fourcc serialize-type/string) (define type/fourcc? type/string?) ;;; No way to validate. (define serialize-type/image-format serialize-type/string) (define type/image-format? type/string?) ;;; Looking at the documentation for --start, there is no way to make this ;;; bullet-proof, especially since even chapter numbers are accepted. (define serialize-type/relative-time-or-percent-position serialize-type/string) (define type/relative-time-or-percent-position? type/string?) (define serialize-type/time serialize-type/string) (define type/time? type/string?) (define serialize-type/video-rectangle serialize-type/string) (define (type/video-rectangle? value) (or (string-match "-?[0-9]+%?:-?[0-9]+%?" value) (string-match "^(-?[0-9]+%?(x-?[0-9]+%?)?)?([+-]-?[0-9]+%?[+-]-?[0-9]+%?)?$" value))) (define serialize-type/window-geometry serialize-type/string) (define (type/window-geometry? value) (or (string-match "-?[0-9]+%?:-?[0-9]+%?" value) (string-match "^(-?[0-9]+%?(x-?[0-9]+%?)?)?([+-]-?[0-9]+%?[+-]-?[0-9]+%?)?(/[0-9]+)?$" value))) (define serialize-type/window-size serialize-type/string) (define (type/window-size? value) (string-match "^([0-9]+%?(x[0-9]+%?)?)?$" value)) (define (serialize-type/enumeration field-name value) #~(string-append #$(symbol->string field-name) "=" ;; This could be either symbol or (in case of enumerations ;; with alternate type) anything. So just use `format'. #$(format #f "~s" value) "\n")) (define (type/enumeration? value) ;; There is no general way to check enumerations. The field always has to ;; define custom sanitizer. #t) ;;; ;;; List types. ;;; (define (serialize-type/list-of-string field-name lst) #~(string-append #$(symbol->string field-name) "=" #$(string-join lst ",") "\n")) (define (type/list-of-string? lst) (every type/string? lst)) (define (serialize-type/list-of-key-value field-name lst) #~(string-append #$(symbol->string field-name) "=" #$(string-join (map (match-lambda ((k . v) (format #f "~a=~a" k v))) lst) ",") "\n")) (define (type/list-of-key-value? lst) (every (match-lambda (((? string?) . (? string?)) #t) (_ #f)) lst)) (define serialize-type/list-of-object-setting serialize-type/list-of-string) (define type/list-of-object-setting? type/list-of-string?) (define serialize-type/list-of-output-verbosity serialize-type/list-of-key-value) (define type/list-of-output-verbosity? type/list-of-key-value?) ;;; ;;; Actual configuration record. Contains a lot of generated code. ;;; (define-record-type (make-profile-option name type-check serializer) profile-option? (name profile-option-name) (type-check profile-option-type-check) (serializer profile-option-serializer)) (define %opts (make-hash-table)) (define-syntax define-opt (lambda (x) (syntax-case x () ((_ name type extra-checks ...) (let* ((d/n (syntax->datum #'name)) (d/t (syntax->datum #'type)) (d/accessor (string->symbol (format #f "mpv-profile-configuration-~a" d/n))) (d/type-check (string->symbol (format #f "type/~a?" d/t))) (d/serializer (string->symbol (format #f "serialize-type/~a" d/t)))) (with-syntax ((kw (datum->syntax x (symbol->keyword d/n))) (accessor (datum->syntax x d/accessor)) (type-check (datum->syntax x d/type-check)) (serializer (datum->syntax x d/serializer)) (val (datum->syntax x 'val))) #'(begin (hashq-set! %opts 'name (make-profile-option (symbol->string 'name) (lambda (val) (and (type-check val) extra-checks ...)) serializer)) (define-public (accessor cfg) (let ((x (hashq-ref (%mpv-profile-configuration-data cfg) 'name %unset))) (if (eq? x %unset) %unset (car x))))))))))) ;;; Generated code - START. (define-opt ab-loop-a time) (define-opt ab-loop-b time) (define-opt ab-loop-count enumeration (or (memq val '(inf)) (and (integer? val) (>= val 0) (<= val 2147483647)))) (define-opt access-references boolean) (define-opt ad string) (define-opt ad-lavc-ac3drc float (>= val 0) (<= val 6)) (define-opt ad-lavc-downmix boolean) (define-opt ad-lavc-o list-of-key-value) (define-opt ad-lavc-threads integer (>= val 0) (<= val 16)) (define-opt ad-queue-enable boolean) (define-opt ad-queue-max-bytes byte-size (>= val 0) (<= val 4.6116860184274e18)) (define-opt ad-queue-max-samples integer64 (>= val 0)) (define-opt ad-queue-max-secs double (>= val 0)) (define-opt af list-of-object-setting) (define-opt audio enumeration (or (memq val '(no auto)) (and (integer? val) (>= val 0) (<= val 8190)))) (define-opt alang list-of-string) (define-opt allow-delayed-peak-detect boolean) (define-opt alsa-buffer-time integer (>= val 0) (<= val 2147483647)) (define-opt alsa-ignore-chmap boolean) (define-opt alsa-mixer-device string) (define-opt alsa-mixer-index integer (>= val 0) (<= val 99)) (define-opt alsa-mixer-name string) (define-opt alsa-non-interleaved boolean) (define-opt alsa-periods integer (>= val 0) (<= val 2147483647)) (define-opt alsa-resample boolean) (define-opt ao list-of-object-setting) (define-opt ao-null-broken-delay boolean) (define-opt ao-null-broken-eof boolean) (define-opt ao-null-buffer float (>= val 0) (<= val 100)) (define-opt ao-null-channel-layouts audio-channels-or-channel-map) (define-opt ao-null-format audio-format) (define-opt ao-null-latency float (>= val 0) (<= val 100)) (define-opt ao-null-outburst integer (>= val 1) (<= val 100000)) (define-opt ao-null-speed float (>= val 0) (<= val 10000)) (define-opt ao-null-untimed boolean) (define-opt ao-pcm-append boolean) (define-opt ao-pcm-file string) (define-opt ao-pcm-waveheader boolean) (define-opt audio-backward-batch integer (>= val 0) (<= val 1024)) (define-opt audio-backward-overlap enumeration (or (memq val '(auto)) (and (integer? val) (>= val 0) (<= val 1024)))) (define-opt audio-buffer double (>= val 0) (<= val 10)) (define-opt audio-channels audio-channels-or-channel-map) (define-opt audio-client-name string) (define-opt audio-delay float) (define-opt audio-demuxer string) (define-opt audio-device string) (define-opt audio-display enumeration (memq val '(no embedded-first external-first))) (define-opt audio-exclusive boolean) (define-opt audio-exts list-of-string) (define-opt audio-fallback-to-null boolean) (define-opt audio-file-auto enumeration (memq val '(no exact fuzzy all))) (define-opt audio-file-paths list-of-string) (define-opt audio-files list-of-string) (define-opt audio-format audio-format) (define-opt audio-normalize-downmix boolean) (define-opt audio-pitch-correction boolean) (define-opt audio-resample-cutoff double (>= val 0) (<= val 1)) (define-opt audio-resample-filter-size integer (>= val 0) (<= val 32)) (define-opt audio-resample-linear boolean) (define-opt audio-resample-max-output-size double) (define-opt audio-resample-phase-shift integer (>= val 0) (<= val 30)) (define-opt audio-reversal-buffer byte-size (>= val 0) (<= val 4.6116860184274e18)) (define-opt audio-samplerate integer (>= val 0) (<= val 768000)) (define-opt audio-spdif string) (define-opt audio-stream-silence boolean) (define-opt audio-swresample-o list-of-key-value) (define-opt audio-wait-open float (>= val 0) (<= val 60)) (define-opt auto-window-resize boolean) (define-opt autocreate-playlist enumeration (memq val '(no filter same))) (define-opt autofit window-size) (define-opt autofit-larger window-size) (define-opt autofit-smaller window-size) (define-opt autoload-files boolean) (define-opt autosync enumeration (or (memq val '(no)) (and (integer? val) (>= val 0) (<= val 10000)))) (define-opt background enumeration (memq val '(none color tiles))) (define-opt background-color color) (define-opt blend-subtitles enumeration (memq val '(no yes video))) (define-opt bluray-device string) (define-opt border boolean) (define-opt border-background enumeration (memq val '(none color tiles))) (define-opt brightness float (>= val -100) (<= val 100)) (define-opt cache enumeration (memq val '(no auto yes))) (define-opt cache-on-disk boolean) (define-opt cache-pause boolean) (define-opt cache-pause-initial boolean) (define-opt cache-pause-wait float (>= val 0)) (define-opt cache-secs double (>= val 0)) (define-opt cdda-cdtext boolean) (define-opt cdda-device string) (define-opt cdda-overlap integer (>= val 0) (<= val 75)) (define-opt cdda-paranoia integer (>= val 0) (<= val 2)) (define-opt cdda-sector-size integer (>= val 1) (<= val 100)) (define-opt cdda-skip boolean) (define-opt cdda-span-a integer) (define-opt cdda-span-b integer) (define-opt cdda-speed integer (>= val 1) (<= val 100)) (define-opt cdda-toc-offset integer) (define-opt chapter-merge-threshold integer (>= val 0) (<= val 10000)) (define-opt chapter-seek-threshold double) (define-opt chapters-file string) (define-opt config boolean) (define-opt container-fps-override double (>= val 0)) (define-opt contrast float (>= val -100) (<= val 100)) (define-opt cookies boolean) (define-opt cookies-file string) (define-opt corner-rounding float (>= val 0) (<= val 1)) (define-opt correct-downscaling boolean) (define-opt correct-pts boolean) (define-opt cover-art-auto enumeration (memq val '(no exact fuzzy all))) (define-opt cover-art-files list-of-string) (define-opt cover-art-whitelist list-of-string) (define-opt cscale enumeration (memq val '(bilinear bicubic_fast oversample spline16 spline36 spline64 sinc lanczos ginseng bicubic hermite catmull_rom mitchell robidoux robidouxsharp box nearest triangle gaussian jinc ewa_lanczos ewa_hanning ewa_ginseng ewa_lanczossharp ewa_lanczos4sharpest ewa_lanczossoft haasnsoft ewa_robidoux ewa_robidouxsharp bartlett cosine hanning tukey hamming quadric welch kaiser blackman sphinx))) (define-opt cscale-antiring float (>= val 0) (<= val 1)) (define-opt cscale-blur float) (define-opt cscale-clamp float (>= val 0) (<= val 1)) (define-opt cscale-param1 float) (define-opt cscale-param2 float) (define-opt cscale-radius float (>= val 0.5) (<= val 16)) (define-opt cscale-taper float (>= val 0) (<= val 1)) (define-opt cscale-window enumeration (memq val '(bartlett cosine hanning tukey hamming quadric welch kaiser blackman sphinx jinc))) (define-opt cscale-wparam float) (define-opt cscale-wtaper float (>= val 0) (<= val 1)) (define-opt cursor-autohide enumeration (or (memq val '(no always)) (and (integer? val) (>= val 0) (<= val 30000)))) (define-opt cursor-autohide-fs-only boolean) (define-opt deband boolean) (define-opt deband-grain float (>= val 0) (<= val 4096)) (define-opt deband-iterations integer (>= val 0) (<= val 16)) (define-opt deband-range float (>= val 1) (<= val 64)) (define-opt deband-threshold float (>= val 0) (<= val 4096)) (define-opt deinterlace enumeration (memq val '(no yes auto))) (define-opt deinterlace-field-parity enumeration (memq val '(tff bff auto))) (define-opt demuxer string) (define-opt demuxer-backward-playback-step double (>= val 0)) (define-opt demuxer-cache-dir string) (define-opt demuxer-cache-unlink-files enumeration (memq val '(immediate whendone no))) (define-opt demuxer-cache-wait boolean) (define-opt demuxer-donate-buffer boolean) (define-opt demuxer-hysteresis-secs double (>= val 0)) (define-opt demuxer-lavf-allow-mimetype boolean) (define-opt demuxer-lavf-analyzeduration float (>= val 0) (<= val 3600)) (define-opt demuxer-lavf-buffersize integer (>= val 1) (<= val 10485760)) (define-opt demuxer-lavf-format string) (define-opt demuxer-lavf-hacks boolean) (define-opt demuxer-lavf-linearize-timestamps enumeration (memq val '(no auto yes))) (define-opt demuxer-lavf-o list-of-key-value) (define-opt demuxer-lavf-probe-info enumeration (memq val '(no yes auto nostreams))) (define-opt demuxer-lavf-probescore integer (>= val 1) (<= val 100)) (define-opt demuxer-lavf-probesize integer (>= val 32) (<= val 2147483647)) (define-opt demuxer-lavf-propagate-opts boolean) (define-opt demuxer-max-back-bytes byte-size (>= val 0) (<= val 4.6116860184274e18)) (define-opt demuxer-max-bytes byte-size (>= val 0) (<= val 4.6116860184274e18)) (define-opt demuxer-mkv-probe-start-time boolean) (define-opt demuxer-mkv-probe-video-duration enumeration (memq val '(no yes full))) (define-opt demuxer-mkv-subtitle-preroll enumeration (memq val '(no yes index))) (define-opt demuxer-mkv-subtitle-preroll-secs double (>= val 0)) (define-opt demuxer-mkv-subtitle-preroll-secs-index double (>= val 0)) (define-opt demuxer-rawaudio-channels audio-channels-or-channel-map) (define-opt demuxer-rawaudio-format enumeration (memq val '(u8 s8 u16le u16be s16le s16be u24le u24be s24le s24be u32le u32be s32le s32be floatle floatbe doublele doublebe u16 s16 u24 s24 u32 s32 float double))) (define-opt demuxer-rawaudio-rate integer (>= val 1000) (<= val 384000)) (define-opt demuxer-rawvideo-codec string) (define-opt demuxer-rawvideo-format fourcc) (define-opt demuxer-rawvideo-fps float (>= val 0.001) (<= val 1000)) (define-opt demuxer-rawvideo-h integer (>= val 1) (<= val 8192)) (define-opt demuxer-rawvideo-mp-format image-format) (define-opt demuxer-rawvideo-size integer (>= val 1) (<= val 268435456)) (define-opt demuxer-rawvideo-w integer (>= val 1) (<= val 8192)) (define-opt demuxer-readahead-secs double (>= val 0)) (define-opt demuxer-seekable-cache enumeration (memq val '(auto no yes))) (define-opt demuxer-termination-timeout double) (define-opt demuxer-thread boolean) (define-opt directory-filter-types list-of-string) (define-opt directory-mode enumeration (memq val '(auto lazy recursive ignore))) (define-opt display-fps-override double (>= val 0)) (define-opt display-tags list-of-string) (define-opt dither enumeration (memq val '(fruit ordered error-diffusion no))) (define-opt dither-depth enumeration (or (memq val '(no auto)) (and (integer? val) (>= val -1) (<= val 16)))) (define-opt dither-size-fruit integer (>= val 2) (<= val 8)) (define-opt drag-and-drop enumeration (memq val '(no auto replace append insert-next))) (define-opt drm-connector string) (define-opt drm-device string) (define-opt drm-draw-plane enumeration (or (memq val '(primary overlay)) (and (integer? val) (>= val 0) (<= val 2147483647)))) (define-opt drm-draw-surface-size window-size) (define-opt drm-drmprime-video-plane enumeration (or (memq val '(primary overlay)) (and (integer? val) (>= val 0) (<= val 2147483647)))) (define-opt drm-format enumeration (memq val '(xrgb8888 xrgb2101010 xbgr8888 xbgr2101010 yuyv))) (define-opt drm-mode string) (define-opt drm-vrr-enabled enumeration (memq val '(no yes auto))) (define-opt dscale enumeration (memq val '(bilinear bicubic_fast oversample spline16 spline36 spline64 sinc lanczos ginseng bicubic hermite catmull_rom mitchell robidoux robidouxsharp box nearest triangle gaussian jinc ewa_lanczos ewa_hanning ewa_ginseng ewa_lanczossharp ewa_lanczos4sharpest ewa_lanczossoft haasnsoft ewa_robidoux ewa_robidouxsharp bartlett cosine hanning tukey hamming quadric welch kaiser blackman sphinx))) (define-opt dscale-antiring float (>= val 0) (<= val 1)) (define-opt dscale-blur float) (define-opt dscale-clamp float (>= val 0) (<= val 1)) (define-opt dscale-param1 float) (define-opt dscale-param2 float) (define-opt dscale-radius float (>= val 0.5) (<= val 16)) (define-opt dscale-taper float (>= val 0) (<= val 1)) (define-opt dscale-window enumeration (memq val '(bartlett cosine hanning tukey hamming quadric welch kaiser blackman sphinx jinc))) (define-opt dscale-wparam float) (define-opt dscale-wtaper float (>= val 0) (<= val 1)) (define-opt dump-stats string) (define-opt dvbin-card integer (>= val 0) (<= val 15)) (define-opt dvbin-channel-switch-offset integer) (define-opt dvbin-file string) (define-opt dvbin-full-transponder boolean) (define-opt dvbin-prog string) (define-opt dvbin-timeout integer (>= val 1) (<= val 30)) (define-opt dvd-angle integer (>= val 1) (<= val 99)) (define-opt dvd-device string) (define-opt dvd-speed integer) (define-opt edition enumeration (or (memq val '(auto)) (and (integer? val) (>= val 0) (<= val 8190)))) (define-opt egl-config-id integer) (define-opt egl-output-format enumeration (memq val '(auto rgb8 rgba8 rgb10 rgb10_a2 rgb16 rgba16 rgb16f rgba16f rgb32f rgba32f))) (define-opt embeddedfonts boolean) (define-opt end relative-time-or-percent-position) (define-opt error-diffusion string) (define-opt external-files list-of-string) (define-opt fbo-format string) (define-opt focus-on enumeration (memq val '(never open all))) (define-opt force-media-title string) (define-opt force-render boolean) (define-opt force-rgba-osd-rendering boolean) (define-opt force-seekable boolean) (define-opt force-window enumeration (memq val '(no yes immediate))) (define-opt force-window-position boolean) (define-opt framedrop enumeration (memq val '(no vo decoder decoder+vo))) (define-opt frames enumeration (or (memq val '(all)) (and (integer? val) (>= val 0) (<= val 2147483647)))) (define-opt fs-screen enumeration (or (memq val '(all current)) (and (integer? val) (>= val 0) (<= val 32)))) (define-opt fs-screen-name string) (define-opt fullscreen boolean) (define-opt gamma float (>= val -100) (<= val 100)) (define-opt gamma-auto boolean) (define-opt gamma-factor float (>= val 0.1) (<= val 2)) (define-opt gamut-mapping-mode enumeration (memq val '(auto clip perceptual relative saturation absolute desaturate darken warn linear))) (define-opt gapless-audio enumeration (memq val '(no yes weak))) (define-opt geometry window-geometry) (define-opt glsl-shader-opts list-of-key-value) (define-opt glsl-shaders list-of-string) (define-opt gpu-api list-of-object-setting) (define-opt gpu-context list-of-object-setting) (define-opt gpu-debug boolean) (define-opt gpu-dumb-mode enumeration (memq val '(auto yes no))) (define-opt gpu-hwdec-interop string) (define-opt gpu-shader-cache boolean) (define-opt gpu-shader-cache-dir string) (define-opt gpu-sw boolean) (define-opt gpu-tex-pad-x integer (>= val 0) (<= val 4096)) (define-opt gpu-tex-pad-y integer (>= val 0) (<= val 4096)) (define-opt hdr-compute-peak enumeration (memq val '(auto yes no))) (define-opt hdr-contrast-recovery float (>= val 0) (<= val 2)) (define-opt hdr-contrast-smoothness float (>= val 1) (<= val 100)) (define-opt hdr-peak-decay-rate float (>= val 0) (<= val 1000)) (define-opt hdr-peak-percentile float (>= val 0) (<= val 100)) (define-opt hdr-scene-threshold-high float (>= val 0) (<= val 20)) (define-opt hdr-scene-threshold-low float (>= val 0) (<= val 20)) (define-opt hidpi-window-scale boolean) (define-opt hls-bitrate enumeration (or (memq val '(no min max)) (and (integer? val) (>= val 0) (<= val 2147483647)))) (define-opt hr-seek enumeration (memq val '(no absolute yes always default))) (define-opt hr-seek-demuxer-offset float) (define-opt hr-seek-framedrop boolean) (define-opt http-header-fields list-of-string) (define-opt http-proxy string) (define-opt hue float (>= val -100) (<= val 100)) (define-opt hwdec list-of-string) (define-opt hwdec-codecs string) (define-opt hwdec-extra-frames integer (>= val 0) (<= val 256)) (define-opt hwdec-image-format image-format) (define-opt icc-3dlut-size string) (define-opt icc-cache boolean) (define-opt icc-cache-dir string) (define-opt icc-force-contrast enumeration (or (memq val '(no inf)) (and (integer? val) (>= val 0) (<= val 1000000)))) (define-opt icc-intent integer) (define-opt icc-profile string) (define-opt icc-profile-auto boolean) (define-opt icc-use-luma boolean) (define-opt idle enumeration (memq val '(no once yes))) (define-opt ignore-path-in-watch-later-config boolean) (define-opt image-display-duration double (>= val 0)) (define-opt image-exts list-of-string) (define-opt image-lut string) (define-opt image-lut-type enumeration (memq val '(auto native normalized conversion))) (define-opt image-subs-video-resolution boolean) (define-opt include string) (define-opt index enumeration (memq val '(default recreate))) (define-opt initial-audio-sync boolean) (define-opt input-ar-delay integer) (define-opt input-ar-rate integer) (define-opt input-builtin-bindings boolean) (define-opt input-builtin-dragging boolean) (define-opt input-commands list-of-string) (define-opt input-conf string) (define-opt input-cursor boolean) (define-opt input-cursor-passthrough boolean) (define-opt input-default-bindings boolean) (define-opt input-doubleclick-time integer (>= val 0) (<= val 1000)) (define-opt input-dragging-deadzone integer) (define-opt input-ipc-client string) (define-opt input-ipc-server string) (define-opt input-key-fifo-size integer (>= val 2) (<= val 65000)) (define-opt input-media-keys boolean) (define-opt input-preprocess-wheel boolean) (define-opt input-right-alt-gr boolean) (define-opt input-terminal boolean) (define-opt input-test boolean) (define-opt input-touch-emulate-mouse boolean) (define-opt input-vo-keyboard boolean) (define-opt interpolation boolean) (define-opt interpolation-preserve boolean) (define-opt interpolation-threshold float) (define-opt inverse-tone-mapping boolean) (define-opt jack-autostart boolean) (define-opt jack-connect boolean) (define-opt jack-name string) (define-opt jack-port string) (define-opt jack-std-channel-layout enumeration (memq val '(waveext any))) (define-opt keep-open enumeration (memq val '(no yes always))) (define-opt keep-open-pause boolean) (define-opt keepaspect boolean) (define-opt keepaspect-window boolean) (define-opt lavfi-complex string) (define-opt length relative-time-or-percent-position) (define-opt libplacebo-opts list-of-key-value) (define-opt linear-downscaling boolean) (define-opt linear-upscaling boolean) (define-opt load-auto-profiles enumeration (memq val '(no yes auto))) (define-opt load-osd-console boolean) (define-opt load-scripts boolean) (define-opt load-select boolean) (define-opt load-stats-overlay boolean) (define-opt load-unsafe-playlists boolean) (define-opt log-file string) (define-opt loop-file enumeration (or (memq val '(no inf yes)) (and (integer? val) (>= val 0) (<= val 10000)))) (define-opt loop-playlist enumeration (or (memq val '(no inf yes force)) (and (integer? val) (>= val 1) (<= val 10000)))) (define-opt lut string) (define-opt lut-type enumeration (memq val '(auto native normalized conversion))) (define-opt mc float (>= val 0) (<= val 100)) (define-opt media-controls enumeration (memq val '(no player yes))) (define-opt merge-files boolean) (define-opt metadata-codepage string) (define-opt mf-fps double) (define-opt mf-type string) (define-opt monitoraspect float (>= val 0) (<= val 9)) (define-opt monitorpixelaspect float (>= val 0.03125) (<= val 32)) (define-opt msg-color boolean) (define-opt msg-level list-of-output-verbosity) (define-opt msg-module boolean) (define-opt msg-time boolean) (define-opt mute boolean) (define-opt native-fs boolean) (define-opt native-keyrepeat boolean) (define-opt native-touch boolean) (define-opt network-timeout double (>= val 0)) (define-opt oac string) (define-opt oacopts list-of-key-value) (define-opt ocopy-metadata boolean) (define-opt of string) (define-opt ofopts list-of-key-value) (define-opt on-all-workspaces boolean) (define-opt ontop boolean) (define-opt ontop-level enumeration (or (memq val '(window system desktop)) (and (integer? val) (>= val 0) (<= val 2147483647)))) (define-opt opengl-check-pattern-a integer) (define-opt opengl-check-pattern-b integer) (define-opt opengl-early-flush enumeration (memq val '(no yes auto))) (define-opt opengl-es enumeration (memq val '(auto yes no))) (define-opt opengl-glfinish boolean) (define-opt opengl-pbo boolean) (define-opt opengl-rectangle-textures boolean) (define-opt opengl-swapinterval integer) (define-opt opengl-waitvsync boolean) (define-opt orawts boolean) (define-opt ordered-chapters boolean) (define-opt ordered-chapters-files string) (define-opt oremove-metadata list-of-string) (define-opt osc boolean) (define-opt osd-align-x enumeration (memq val '(left center right))) (define-opt osd-align-y enumeration (memq val '(top center bottom))) (define-opt osd-back-color color) (define-opt osd-bar boolean) (define-opt osd-bar-align-x float (>= val -1) (<= val 1)) (define-opt osd-bar-align-y float (>= val -1) (<= val 1)) (define-opt osd-bar-h float (>= val 0.1) (<= val 50)) (define-opt osd-bar-outline-size float (>= val 0) (<= val 1000)) (define-opt osd-bar-w float (>= val 1) (<= val 100)) (define-opt osd-blur float (>= val 0) (<= val 20)) (define-opt osd-bold boolean) (define-opt osd-border-style enumeration (memq val '(outline-and-shadow opaque-box background-box))) (define-opt osd-color color) (define-opt osd-duration integer (>= val 0) (<= val 3600000)) (define-opt osd-font string) (define-opt osd-font-provider enumeration (memq val '(auto none fontconfig))) (define-opt osd-font-size float (>= val 1) (<= val 9000)) (define-opt osd-fonts-dir string) (define-opt osd-fractions boolean) (define-opt osd-italic boolean) (define-opt osd-justify enumeration (memq val '(auto left center right))) (define-opt osd-level enumeration (memq val '(#{0}# #{1}# #{2}# #{3}#))) (define-opt osd-margin-x integer (>= val 0) (<= val 300)) (define-opt osd-margin-y integer (>= val 0) (<= val 600)) (define-opt osd-msg1 string) (define-opt osd-msg2 string) (define-opt osd-msg3 string) (define-opt osd-on-seek enumeration (memq val '(no bar msg msg-bar))) (define-opt osd-outline-color color) (define-opt osd-outline-size float) (define-opt osd-playing-msg string) (define-opt osd-playing-msg-duration integer (>= val 0) (<= val 3600000)) (define-opt osd-playlist-entry enumeration (memq val '(title filename both))) (define-opt osd-scale float (>= val 0) (<= val 100)) (define-opt osd-scale-by-window boolean) (define-opt osd-shadow-offset float) (define-opt osd-spacing float (>= val -10) (<= val 10)) (define-opt osd-status-msg string) (define-opt oset-metadata list-of-key-value) (define-opt ovc string) (define-opt ovcopts list-of-key-value) (define-opt panscan float (>= val 0) (<= val 1)) (define-opt pause boolean) (define-opt pitch double (>= val 0.01) (<= val 100)) (define-opt play-direction enumeration (memq val '(forward + backward -))) (define-opt player-operation-mode enumeration (memq val '(cplayer pseudo-gui))) (define-opt playlist-start enumeration (or (memq val '(auto no)) (and (integer? val) (>= val 0) (<= val 2147483647)))) (define-opt prefetch-playlist boolean) (define-opt profile list-of-string) (define-opt pulse-allow-suspended boolean) (define-opt pulse-buffer enumeration (or (memq val '(native)) (and (integer? val) (>= val 1) (<= val 2000)))) (define-opt pulse-host string) (define-opt pulse-latency-hacks boolean) (define-opt quiet boolean) (define-opt really-quiet boolean) (define-opt rebase-start-time boolean) (define-opt referrer string) (define-opt replaygain enumeration (memq val '(no track album))) (define-opt replaygain-clip boolean) (define-opt replaygain-fallback float (>= val -200) (<= val 60)) (define-opt replaygain-preamp float (>= val -150) (<= val 150)) (define-opt reset-on-next-file list-of-string) (define-opt resume-playback boolean) (define-opt resume-playback-check-mtime boolean) (define-opt rtsp-transport enumeration (memq val '(lavf udp tcp http udp_multicast))) (define-opt saturation float (>= val -100) (<= val 100)) (define-opt save-position-on-quit boolean) (define-opt scale enumeration (memq val '(bilinear bicubic_fast oversample spline16 spline36 spline64 sinc lanczos ginseng bicubic hermite catmull_rom mitchell robidoux robidouxsharp box nearest triangle gaussian jinc ewa_lanczos ewa_hanning ewa_ginseng ewa_lanczossharp ewa_lanczos4sharpest ewa_lanczossoft haasnsoft ewa_robidoux ewa_robidouxsharp bartlett cosine hanning tukey hamming quadric welch kaiser blackman sphinx))) (define-opt scale-antiring float (>= val 0) (<= val 1)) (define-opt scale-blur float) (define-opt scale-clamp float (>= val 0) (<= val 1)) (define-opt scale-param1 float) (define-opt scale-param2 float) (define-opt scale-radius float (>= val 0.5) (<= val 16)) (define-opt scale-taper float (>= val 0) (<= val 1)) (define-opt scale-window enumeration (memq val '(bartlett cosine hanning tukey hamming quadric welch kaiser blackman sphinx jinc))) (define-opt scale-wparam float) (define-opt scale-wtaper float (>= val 0) (<= val 1)) (define-opt scaler-resizes-only boolean) (define-opt screen enumeration (or (memq val '(default)) (and (integer? val) (>= val 0) (<= val 32)))) (define-opt screen-name string) (define-opt screenshot-avif-encoder string) (define-opt screenshot-avif-opts list-of-key-value) (define-opt screenshot-avif-pixfmt string) (define-opt screenshot-directory string) (define-opt screenshot-format enumeration (memq val '(jpg jpeg png webp jxl avif))) (define-opt screenshot-high-bit-depth boolean) (define-opt screenshot-jpeg-quality integer (>= val 0) (<= val 100)) (define-opt screenshot-jpeg-source-chroma boolean) (define-opt screenshot-jxl-distance double (>= val 0) (<= val 15)) (define-opt screenshot-jxl-effort integer (>= val 1) (<= val 9)) (define-opt screenshot-png-compression integer (>= val 0) (<= val 9)) (define-opt screenshot-png-filter integer (>= val 0) (<= val 5)) (define-opt screenshot-sw boolean) (define-opt screenshot-tag-colorspace boolean) (define-opt screenshot-template string) (define-opt screenshot-webp-compression integer (>= val 0) (<= val 6)) (define-opt screenshot-webp-lossless boolean) (define-opt screenshot-webp-quality integer (>= val 0) (<= val 100)) (define-opt script-opts list-of-key-value) (define-opt scripts list-of-string) (define-opt secondary-sid enumeration (or (memq val '(no auto)) (and (integer? val) (>= val 0) (<= val 8190)))) (define-opt secondary-sub-ass-override enumeration (memq val '(no yes scale force strip))) (define-opt secondary-sub-delay float) (define-opt secondary-sub-pos float (>= val 0) (<= val 150)) (define-opt secondary-sub-visibility boolean) (define-opt sharpen float) (define-opt show-in-taskbar boolean) (define-opt shuffle boolean) (define-opt sub enumeration (or (memq val '(no auto)) (and (integer? val) (>= val 0) (<= val 8190)))) (define-opt sigmoid-center float (>= val 0) (<= val 1)) (define-opt sigmoid-slope float (>= val 1) (<= val 20)) (define-opt sigmoid-upscaling boolean) (define-opt slang list-of-string) (define-opt snap-window boolean) (define-opt speed double (>= val 0.01) (<= val 100)) (define-opt spirv-compiler enumeration (memq val '(auto))) (define-opt sstep double (>= val 0)) (define-opt start relative-time-or-percent-position) (define-opt stop-playback-on-init-failure boolean) (define-opt stop-screensaver enumeration (memq val '(no yes always))) (define-opt stream-buffer-size byte-size (>= val 4096) (<= val 536870912)) (define-opt stream-dump string) (define-opt stream-lavf-o list-of-key-value) (define-opt stream-record string) (define-opt stretch-dvd-subs boolean) (define-opt stretch-image-subs-to-screen boolean) (define-opt sub-align-x enumeration (memq val '(left center right))) (define-opt sub-align-y enumeration (memq val '(top center bottom))) (define-opt sub-ass boolean) (define-opt sub-ass-force-margins boolean) (define-opt sub-ass-hinting enumeration (memq val '(none light normal native))) (define-opt sub-ass-justify boolean) (define-opt sub-ass-line-spacing float (>= val -1000) (<= val 1000)) (define-opt sub-ass-override enumeration (memq val '(no yes scale force strip))) (define-opt sub-ass-scale-with-window boolean) (define-opt sub-ass-shaper enumeration (memq val '(simple complex))) (define-opt sub-ass-style-overrides list-of-string) (define-opt sub-ass-styles string) (define-opt sub-ass-use-video-data enumeration (memq val '(none aspect-ratio all))) (define-opt sub-ass-video-aspect-override aspect (>= val 0) (<= val 10)) (define-opt sub-ass-vsfilter-color-compat enumeration (memq val '(no basic full force-601))) (define-opt sub-auto enumeration (memq val '(no exact fuzzy all))) (define-opt sub-auto-exts list-of-string) (define-opt sub-back-color color) (define-opt sub-blur float (>= val 0) (<= val 20)) (define-opt sub-bold boolean) (define-opt sub-border-style enumeration (memq val '(outline-and-shadow opaque-box background-box))) (define-opt sub-clear-on-seek boolean) (define-opt sub-codepage string) (define-opt sub-color color) (define-opt sub-create-cc-track boolean) (define-opt sub-delay float) (define-opt sub-demuxer string) (define-opt sub-file-paths list-of-string) (define-opt sub-files list-of-string) (define-opt sub-filter-jsre list-of-string) (define-opt sub-filter-regex list-of-string) (define-opt sub-filter-regex-enable boolean) (define-opt sub-filter-regex-plain boolean) (define-opt sub-filter-regex-warn boolean) (define-opt sub-filter-sdh boolean) (define-opt sub-filter-sdh-enclosures string) (define-opt sub-filter-sdh-harder boolean) (define-opt sub-fix-timing boolean) (define-opt sub-font string) (define-opt sub-font-provider enumeration (memq val '(auto none fontconfig))) (define-opt sub-font-size float (>= val 1) (<= val 9000)) (define-opt sub-fonts-dir string) (define-opt sub-forced-events-only boolean) (define-opt sub-fps float) (define-opt sub-gauss float (>= val 0) (<= val 3)) (define-opt sub-gray boolean) (define-opt sub-italic boolean) (define-opt sub-justify enumeration (memq val '(auto left center right))) (define-opt sub-lavc-o list-of-key-value) (define-opt sub-margin-x integer (>= val 0) (<= val 300)) (define-opt sub-margin-y integer (>= val 0) (<= val 600)) (define-opt sub-outline-color color) (define-opt sub-outline-size float) (define-opt sub-past-video-end boolean) (define-opt sub-pos float (>= val 0) (<= val 150)) (define-opt sub-scale float (>= val 0) (<= val 100)) (define-opt sub-scale-by-window boolean) (define-opt sub-scale-with-window boolean) (define-opt sub-shadow-offset float) (define-opt sub-spacing float (>= val -10) (<= val 10)) (define-opt sub-speed float) (define-opt sub-stretch-durations boolean) (define-opt sub-use-margins boolean) (define-opt sub-visibility boolean) (define-opt sub-vsfilter-bidi-compat boolean) (define-opt subs-fallback enumeration (memq val '(no default yes))) (define-opt subs-fallback-forced enumeration (memq val '(no yes always))) (define-opt subs-match-os-language boolean) (define-opt subs-with-matching-audio enumeration (memq val '(no forced yes))) (define-opt swapchain-depth integer (>= val 1) (<= val 8)) (define-opt sws-allow-zimg boolean) (define-opt sws-bitexact boolean) (define-opt sws-cgb float (>= val 0) (<= val 100)) (define-opt sws-chs integer) (define-opt sws-cs float (>= val -100) (<= val 100)) (define-opt sws-cvs integer) (define-opt sws-fast boolean) (define-opt sws-lgb float (>= val 0) (<= val 100)) (define-opt sws-ls float (>= val -100) (<= val 100)) (define-opt sws-scaler enumeration (memq val '(fast-bilinear bilinear bicubic x point area bicublin gauss sinc lanczos spline))) (define-opt target-colorspace-hint boolean) (define-opt target-contrast enumeration (or (memq val '(auto inf)) (and (integer? val) (>= val 10) (<= val 1000000)))) (define-opt target-gamut enumeration (memq val '(auto bt.601-525 bt.601-625 bt.709 bt.2020 bt.470m apple adobe prophoto cie1931 dci-p3 display-p3 v-gamut s-gamut ebu3213 film-c aces-ap0 aces-ap1))) (define-opt target-lut string) (define-opt target-peak enumeration (or (memq val '(auto)) (and (integer? val) (>= val 10) (<= val 10000)))) (define-opt target-prim enumeration (memq val '(auto bt.601-525 bt.601-625 bt.709 bt.2020 bt.470m apple adobe prophoto cie1931 dci-p3 display-p3 v-gamut s-gamut ebu3213 film-c aces-ap0 aces-ap1))) (define-opt target-trc enumeration (memq val '(auto bt.1886 srgb linear gamma1.8 gamma2.0 gamma2.2 gamma2.4 gamma2.6 gamma2.8 prophoto pq hlg v-log s-log1 s-log2 st428))) (define-opt taskbar-progress boolean) (define-opt teletext-page integer (>= val -1) (<= val 999)) (define-opt temporal-dither boolean) (define-opt temporal-dither-period integer (>= val 1) (<= val 128)) (define-opt term-osd enumeration (memq val '(force auto no))) (define-opt term-osd-bar boolean) (define-opt term-osd-bar-chars string) (define-opt term-playing-msg string) (define-opt term-status-msg string) (define-opt term-title string) (define-opt terminal boolean) (define-opt title string) (define-opt title-bar boolean) (define-opt tls-ca-file string) (define-opt tls-cert-file string) (define-opt tls-key-file string) (define-opt tls-verify boolean) (define-opt tone-mapping enumeration (memq val '(auto clip mobius reinhard hable gamma linear spline bt.2390 bt.2446a st2094-40 st2094-10))) (define-opt tone-mapping-max-boost float (>= val 1) (<= val 10)) (define-opt tone-mapping-param float) (define-opt tone-mapping-visualize boolean) (define-opt track-auto-selection boolean) (define-opt tscale enumeration (memq val '(oversample linear spline16 spline36 spline64 sinc lanczos ginseng bicubic hermite catmull_rom mitchell robidoux robidouxsharp box nearest triangle gaussian bartlett cosine hanning tukey hamming quadric welch kaiser blackman sphinx jinc))) (define-opt tscale-antiring float (>= val 0) (<= val 1)) (define-opt tscale-blur float) (define-opt tscale-clamp float (>= val 0) (<= val 1)) (define-opt tscale-param1 float) (define-opt tscale-param2 float) (define-opt tscale-radius float (>= val 0.5) (<= val 16)) (define-opt tscale-taper float (>= val 0) (<= val 1)) (define-opt tscale-window enumeration (memq val '(bartlett cosine hanning tukey hamming quadric welch kaiser blackman sphinx jinc))) (define-opt tscale-wparam float) (define-opt tscale-wtaper float (>= val 0) (<= val 1)) (define-opt untimed boolean) (define-opt use-embedded-icc-profile boolean) (define-opt use-filedir-conf boolean) (define-opt user-agent string) (define-opt vaapi-device string) (define-opt vd string) (define-opt vd-apply-cropping boolean) (define-opt vd-lavc-assume-old-x264 boolean) (define-opt vd-lavc-bitexact boolean) (define-opt vd-lavc-check-hw-profile boolean) (define-opt vd-lavc-dr enumeration (memq val '(auto no yes))) (define-opt vd-lavc-fast boolean) (define-opt vd-lavc-film-grain enumeration (memq val '(auto cpu gpu))) (define-opt vd-lavc-framedrop enumeration (memq val '(none default nonref bidir nonkey all))) (define-opt vd-lavc-o list-of-key-value) (define-opt vd-lavc-show-all boolean) (define-opt vd-lavc-skipframe enumeration (memq val '(none default nonref bidir nonkey all))) (define-opt vd-lavc-skipidct enumeration (memq val '(none default nonref bidir nonkey all))) (define-opt vd-lavc-skiploopfilter enumeration (memq val '(none default nonref bidir nonkey all))) (define-opt vd-lavc-software-fallback enumeration (or (memq val '(no yes)) (and (integer? val) (>= val 1) (<= val 2147483647)))) (define-opt vd-lavc-threads integer (>= val 0)) (define-opt vd-queue-enable boolean) (define-opt vd-queue-max-bytes byte-size (>= val 0) (<= val 4.6116860184274e18)) (define-opt vd-queue-max-samples integer64 (>= val 0)) (define-opt vd-queue-max-secs double (>= val 0)) (define-opt vf list-of-object-setting) (define-opt video enumeration (or (memq val '(no auto)) (and (integer? val) (>= val 0) (<= val 8190)))) (define-opt video-align-x float (>= val -1) (<= val 1)) (define-opt video-align-y float (>= val -1) (<= val 1)) (define-opt video-aspect-method enumeration (memq val '(bitstream container))) (define-opt video-aspect-override aspect (>= val -1) (<= val 10)) (define-opt video-backward-batch integer (>= val 0) (<= val 1024)) (define-opt video-backward-overlap enumeration (or (memq val '(auto)) (and (integer? val) (>= val 0) (<= val 1024)))) (define-opt video-crop video-rectangle) (define-opt video-exts list-of-string) (define-opt video-latency-hacks boolean) (define-opt video-margin-ratio-bottom float (>= val 0) (<= val 1)) (define-opt video-margin-ratio-left float (>= val 0) (<= val 1)) (define-opt video-margin-ratio-right float (>= val 0) (<= val 1)) (define-opt video-margin-ratio-top float (>= val 0) (<= val 1)) (define-opt video-osd boolean) (define-opt video-output-levels enumeration (memq val '(auto limited full))) (define-opt video-pan-x float) (define-opt video-pan-y float) (define-opt video-reversal-buffer byte-size (>= val 0) (<= val 4.6116860184274e18)) (define-opt video-rotate enumeration (or (memq val '(no)) (and (integer? val) (>= val 0) (<= val 359)))) (define-opt video-scale-x float (>= val 0) (<= val 10000)) (define-opt video-scale-y float (>= val 0) (<= val 10000)) (define-opt video-sync enumeration (memq val '(audio display-resample display-resample-vdrop display-resample-desync display-tempo display-adrop display-vdrop display-desync desync))) (define-opt video-sync-max-audio-change double (>= val 0) (<= val 1)) (define-opt video-sync-max-factor integer (>= val 1) (<= val 10)) (define-opt video-sync-max-video-change double (>= val 0)) (define-opt video-timing-offset double (>= val 0) (<= val 1)) (define-opt video-unscaled enumeration (memq val '(no yes downscale-big))) (define-opt video-zoom float (>= val -20) (<= val 20)) (define-opt vlang list-of-string) (define-opt vo list-of-object-setting) (define-opt vo-image-avif-encoder string) (define-opt vo-image-avif-opts list-of-key-value) (define-opt vo-image-avif-pixfmt string) (define-opt vo-image-format enumeration (memq val '(jpg jpeg png webp jxl avif))) (define-opt vo-image-high-bit-depth boolean) (define-opt vo-image-jpeg-quality integer (>= val 0) (<= val 100)) (define-opt vo-image-jpeg-source-chroma boolean) (define-opt vo-image-jxl-distance double (>= val 0) (<= val 15)) (define-opt vo-image-jxl-effort integer (>= val 1) (<= val 9)) (define-opt vo-image-outdir string) (define-opt vo-image-png-compression integer (>= val 0) (<= val 9)) (define-opt vo-image-png-filter integer (>= val 0) (<= val 5)) (define-opt vo-image-tag-colorspace boolean) (define-opt vo-image-webp-compression integer (>= val 0) (<= val 6)) (define-opt vo-image-webp-lossless boolean) (define-opt vo-image-webp-quality integer (>= val 0) (<= val 100)) (define-opt vo-kitty-alt-screen boolean) (define-opt vo-kitty-cols integer) (define-opt vo-kitty-config-clear boolean) (define-opt vo-kitty-height integer) (define-opt vo-kitty-left integer) (define-opt vo-kitty-rows integer) (define-opt vo-kitty-top integer) (define-opt vo-kitty-use-shm boolean) (define-opt vo-kitty-width integer) (define-opt vo-null-fps double (>= val 0) (<= val 10000)) (define-opt vo-sixel-alt-screen boolean) (define-opt vo-sixel-buffered boolean) (define-opt vo-sixel-cols integer) (define-opt vo-sixel-config-clear boolean) (define-opt vo-sixel-dither enumeration (memq val '(auto none atkinson fs jajuni stucki burkes arithmetic xor))) (define-opt vo-sixel-fixedpalette boolean) (define-opt vo-sixel-height integer) (define-opt vo-sixel-left integer) (define-opt vo-sixel-pad-x integer) (define-opt vo-sixel-pad-y integer) (define-opt vo-sixel-reqcolors integer) (define-opt vo-sixel-rows integer) (define-opt vo-sixel-threshold integer) (define-opt vo-sixel-top integer) (define-opt vo-sixel-width integer) (define-opt vo-tct-256 boolean) (define-opt vo-tct-algo enumeration (memq val '(plain half-blocks))) (define-opt vo-tct-buffering enumeration (memq val '(pixel line frame))) (define-opt vo-tct-height integer) (define-opt vo-tct-width integer) (define-opt vo-vaapi-scaled-osd boolean) (define-opt vo-vaapi-scaling enumeration (memq val '(default fast hq nla))) (define-opt vo-vdpau-chroma-deint boolean) (define-opt vo-vdpau-colorkey color) (define-opt vo-vdpau-composite-detect boolean) (define-opt vo-vdpau-denoise float (>= val 0) (<= val 1)) (define-opt vo-vdpau-force-yuv boolean) (define-opt vo-vdpau-fps double) (define-opt vo-vdpau-hqscaling integer (>= val 0) (<= val 9)) (define-opt vo-vdpau-output-surfaces integer (>= val 2) (<= val 15)) (define-opt vo-vdpau-pullup boolean) (define-opt vo-vdpau-queuetime-fs integer) (define-opt vo-vdpau-queuetime-windowed integer) (define-opt vo-vdpau-sharpen float (>= val -1) (<= val 1)) (define-opt volume float (>= val -1) (<= val 1000)) (define-opt volume-gain float (>= val -150) (<= val 150)) (define-opt volume-gain-max float (>= val 0) (<= val 150)) (define-opt volume-gain-min float (>= val -150) (<= val 0)) (define-opt volume-max float (>= val 100) (<= val 1000)) (define-opt vulkan-async-compute boolean) (define-opt vulkan-async-transfer boolean) (define-opt vulkan-device string) (define-opt vulkan-display-display integer) (define-opt vulkan-display-mode integer) (define-opt vulkan-display-plane integer) (define-opt vulkan-queue-count integer (>= val 1) (<= val 8)) (define-opt vulkan-swap-mode enumeration (memq val '(auto fifo fifo-relaxed mailbox immediate))) (define-opt watch-later-directory string) (define-opt watch-later-options list-of-string) (define-opt wayland-app-id string) (define-opt wayland-configure-bounds enumeration (memq val '(auto no yes))) (define-opt wayland-content-type enumeration (memq val '(auto none photo video game))) (define-opt wayland-disable-vsync boolean) (define-opt wayland-edge-pixels-pointer integer (>= val 0) (<= val 2147483647)) (define-opt wayland-edge-pixels-touch integer (>= val 0) (<= val 2147483647)) (define-opt wayland-present boolean) (define-opt wid integer64) (define-opt window-dragging boolean) (define-opt window-maximized boolean) (define-opt window-minimized boolean) (define-opt window-scale double (>= val 0.001) (<= val 100)) (define-opt write-filename-in-watch-later-config boolean) (define-opt x11-bypass-compositor enumeration (memq val '(no yes fs-only never))) (define-opt x11-name string) (define-opt x11-netwm enumeration (memq val '(auto no yes))) (define-opt x11-present enumeration (memq val '(no auto yes))) (define-opt x11-wid-title boolean) (define-opt xv-adaptor integer (>= val -1)) (define-opt xv-buffers integer (>= val 1) (<= val 10)) (define-opt xv-ck enumeration (memq val '(use set cur))) (define-opt xv-ck-method enumeration (memq val '(none bg man auto))) (define-opt xv-colorkey integer) (define-opt xv-port integer (>= val 0)) (define-opt ytdl boolean) (define-opt ytdl-format string) (define-opt ytdl-raw-options list-of-key-value) (define-opt zimg-dither enumeration (memq val '(no ordered random error-diffusion))) (define-opt zimg-fast boolean) (define-opt zimg-scaler enumeration (memq val '(point bilinear bicubic spline16 spline36 lanczos))) (define-opt zimg-scaler-chroma enumeration (memq val '(point bilinear bicubic spline16 spline36 lanczos))) (define-opt zimg-scaler-chroma-param-a double) (define-opt zimg-scaler-chroma-param-b double) (define-opt zimg-scaler-param-a double) (define-opt zimg-scaler-param-b double) (define-opt zimg-threads enumeration (or (memq val '(auto)) (and (integer? val) (>= val 1) (<= val 64)))) ;;; Generated code - END. (define-record-type (%make-mpv-profile-configuration data) mpv-profile-configuration? (data %mpv-profile-configuration-data)) (define (make-mpv-profile-configuration . args) ;; I am not sure how can I copy a hash-map. Documentation does not mention ;; anything. (let ((new (make-hash-table))) (let loop ((args args)) (match args ((#:inherit cfg . tail) (hash-for-each (lambda (key val) (hashq-set! new key val)) (%mpv-profile-configuration-data cfg)) (loop tail)) (((? keyword? key) val . tail) (let* ((key (keyword->symbol key)) (opt (hashq-ref %opts key))) (unless opt (throw 'bad-config "Option not found" key)) (unless ((profile-option-type-check opt) val) (throw 'bad-config "Invalid value for" key val)) (hashq-set! new key (cons val (profile-option-serializer opt)))) (loop tail)) (() (%make-mpv-profile-configuration new)))))) (define (serialize-mpv-profile-configuration _ cfg) (let ((sorted (sort (hash-map->list cons (%mpv-profile-configuration-data cfg)) (lambda (a b) (stringstring (car a)) (symbol->string (car b))))))) #~(string-append #$@(map (match-lambda ((field-name . value) ((cdr value) field-name (car value)))) sorted)))) ;;; ;;; Configuration base. ;;; (define (serialize-type/mpv-profile-configurations _ profiles) #~(string-append #$@(map (match-lambda ((name . config) #~(string-append #$(format #f "[~a]~%" name) #$(serialize-mpv-profile-configuration _ config)))) profiles))) (define (type/mpv-profile-configurations? alist) (every (match-lambda (((? symbol?) . (? mpv-profile-configuration?)) #t) (_ #f)) alist)) (define (serialize-type/extra _ value) (if value #~(string-append #$value ;; Ensure the extra content ends in a new line. #$(if (string-suffix? "\n" value) "" "\n")) #~"")) (define (type/extra? val) (or (string? val) (gexp? val))) (define-record-type (%make-home-mpv-configuration global profiles extra-config) home-mpv-configuration? (global home-mpv-configuration-global) (profiles home-mpv-configuration-profiles) (extra-config home-mpv-configuration-extra-config)) (define* (make-home-mpv-configuration #:key (inherit #f) (global (if inherit (home-mpv-configuration-global inherit) (make-mpv-profile-configuration))) (profiles (if inherit (home-mpv-configuration-profiles inherit) '())) (extra-config (if inherit (home-mpv-configuration-extra-config inherit) #f))) (unless (or (not global) (mpv-profile-configuration? global)) (throw 'bad-config "global must satisfy mpv-profile-configuration?")) (unless (type/mpv-profile-configurations? profiles) (throw 'bad-config "profiles must be an alist of mpv-profile-configuration?")) (unless (or (not extra-config) (type/extra? extra-config)) (throw 'bad-config "extra-config must be a string or a gexp")) (%make-home-mpv-configuration global profiles extra-config)) (define (serialize-home-mpv-configuration cfg) #~(string-append #$(serialize-mpv-profile-configuration 'global (home-mpv-configuration-global cfg)) #$(serialize-type/mpv-profile-configurations 'profiles (home-mpv-configuration-profiles cfg)) #$(serialize-type/extra 'extra-config (home-mpv-configuration-extra-config cfg)))) (define (mpv-configuration-files cfg) `(("mpv/mpv.conf" ,(mixed-text-file "mpv.conf" (serialize-home-mpv-configuration cfg))))) (define home-mpv-service-type (service-type (name 'home-mpv) (extensions (list (service-extension home-xdg-configuration-files-service-type mpv-configuration-files))) (description "Install configuration files for mpv into XDG configuration directory.")))