Received: (at 74801) by debbugs.gnu.org; 23 May 2025 11:27:32 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 23 07:27:32 2025 Received: from localhost ([127.0.0.1]:46069 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1uIQYl-0006KN-R9 for submit <at> debbugs.gnu.org; Fri, 23 May 2025 07:27:32 -0400 Received: from mail-ej1-x630.google.com ([2a00:1450:4864:20::630]:46459) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from <sarg@HIDDEN>) id 1uIQYj-0006K6-8R for 74801 <at> debbugs.gnu.org; Fri, 23 May 2025 07:27:30 -0400 Received: by mail-ej1-x630.google.com with SMTP id a640c23a62f3a-ad560321ed9so794126766b.1 for <74801 <at> debbugs.gnu.org>; Fri, 23 May 2025 04:27:29 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sarg.org.ru; s=google; t=1747999643; x=1748604443; darn=debbugs.gnu.org; h=mime-version:message-id:date:user-agent:subject:cc:to:from:from:to :cc:subject:date:message-id:reply-to; bh=zt11V53x3GLlkkKOzlfeOXkwQXCuooeRjXKuQ2G8izI=; b=Ot6W/tnbi8LB2WiOrvlPWRlhMkeIpFiN7EVxM6wXTK4X+eu2w9+4J0Uxd+jAyGUYtw k+H4K/03WehO2Nntjb3/sT02aI1v+LpVbk2hJoMyvckcKvoKF9I7JpKjR8h+oQh5H1/N +zBjin7yr86TvVp6gw6lTpm9BzG2COh+GskE9V1uBq2e7YyHQKQqx3CrwtX2jT2jIbV6 ug1VmKnS7JHNN8ZwOFbo3q1vk1A4gLluhNeB3mDDzqSEyx+ILjlgy6YrQl9w6fD6u8t/ 7iO1iWgAXrDdCnLfdxIvOHmBhHxG/fR1xGVA90WxrEbe+xPgrMyIcS7WX9I8IpM5meIo EKsg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747999643; x=1748604443; h=mime-version:message-id:date:user-agent:subject:cc:to:from :x-gm-message-state:from:to:cc:subject:date:message-id:reply-to; bh=zt11V53x3GLlkkKOzlfeOXkwQXCuooeRjXKuQ2G8izI=; b=TCVTG3+kR84JzfSgrHyDdVIMQcthrgpHRRgGhvBrXYyHpZOpQYQANnX8NrRDtO5F2d mWh7RPn1gvVcjFUXnCh7xrl3dVe+q30ye4+KiaiIscKL3LOzECUBrUQc+CHbEfsdZDeI DW07C7RpqbxEGENbj/m2f7MUhTIxXaAy9F9FwXvj+3/EAn8cM2sLtryca2Mynp76GcZO tJZumRCaglg5NPGmXbibZiyMoSB0oK+NYWRguALGoyVaMFjBTlVAAia8kNALmeq4RUT5 Chl2fQ8/lgnKHWAozfYxeIkWhAQSkToeUOD+PJqPCHUVdIDo/IglKswA6YoOfYMZQT2M ZTWQ== X-Gm-Message-State: AOJu0YxgA2cCarUTqTh5aMtGWSEFQcu5KGzsnYS0vN3Zc60us0zW8J0Y ba19z+C8UiXDYELQ2FN/e6yfsLnNdNE2ItZPlkSjV+ugsNf91g2q7ciLv6a9a2oH+9RSb+5rEH0 Vkee8ZvE= X-Gm-Gg: ASbGncua8maULN7DdeXsRiEWmeipWltc6VvYzP+UuW5M/DOIhLXOqFeE72FVrsGDuCX V18LqNtfNinl0v2EUHJsSkINGm3xt1leIXD2QAGicr7Vv2o6SHSYeyrJZQOwITyTMIfyERC8ejo OjpnD9RasKIh+/Eucl313/2XUjNAFApbAdTpcOoJJn9KEVD4T28x5ZJVPSeYb1okIkS5Ye/ouzD dMkw8V6Hkmtzqu4lFznV/CpAYW12csReOL6ORcjAoPCuu6GHS4sOkjBQlEJHnqDdytOX6Vw0TyX n/PBTeuSGzffVP4yFViLhmNzmQE4OWMbGDuB0lynyFFPFCEWeYFgC+raHNY3 X-Google-Smtp-Source: AGHT+IFb4NZk0Z6MP3V+ey5ha999vfm+Tucv7SwGIkcoBtI18E7HcCMN/r87fWOIvwLwbEvC9nh5nA== X-Received: by 2002:a17:907:3e0a:b0:ad5:20ba:210e with SMTP id a640c23a62f3a-ad52d4ca85fmr2612584966b.26.1747999642922; Fri, 23 May 2025 04:27:22 -0700 (PDT) Received: from localhost ([2a02:2454:a095:5600:a64e:31ff:fe38:fd6c]) by smtp.gmail.com with ESMTPSA id a640c23a62f3a-ad52d4382c0sm1231289466b.90.2025.05.23.04.27.22 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 23 May 2025 04:27:22 -0700 (PDT) From: Sergey Trofimov <sarg@HIDDEN> To: Tomas Volf <~@wolfsden.cz> Subject: Re: [bug#74801] [PATCH v4] gnu: home: services: Add home-mpv-service-type. User-Agent: mu4e 1.12.9; emacs 30.0.92 Date: Fri, 23 May 2025 13:27:21 +0200 Message-ID: <87bjrja7om.fsf@HIDDEN> MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 74801 Cc: 74801 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -1.0 (-) Hi Tomas, Tomas Volf <~@wolfsden.cz> writes: > This commit adds a new service type to generate configuration file for the mpv > media player. > I've just noticed this got merged and tried to use it in my config. I've mostly translated the config, but stumbled on the scripts settings: --8<---------------cut here---------------start------------->8--- (service home-mpv-service-type (make-home-mpv-configuration #:global (make-mpv-profile-configuration #:scripts (list (file-append #$mpv-mpris "/lib/mpris.so") (file-append #$mpv-thumbfast "/share/mpv/scripts/thumbfast.lua") (file-append #$mpv-uosc "/share/mpv/scripts/uosc"))))) --8<---------------cut here---------------end--------------->8--- Such config doesn't work as `scripts` option is of `list-of-string` type. I've also tried to workaround with `#:extra-config #~(...)`, but this didn't work either, raising an error in `string-suffix?`. To make it work, I think a new "file" type is necessary, which would allow gexps. Options that are marked as "[file]" (`mpv --list-options | grep -F "[file]"`) should assume this new type.
guix-patches@HIDDEN
:bug#74801
; Package guix-patches
.
Full text available.Received: (at 74801-done) by debbugs.gnu.org; 13 May 2025 01:57:27 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon May 12 21:57:27 2025 Received: from localhost ([127.0.0.1]:56201 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1uEetb-0008FE-84 for submit <at> debbugs.gnu.org; Mon, 12 May 2025 21:57:27 -0400 Received: from mail-pj1-x1035.google.com ([2607:f8b0:4864:20::1035]:60698) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from <maxim.cournoyer@HIDDEN>) id 1uEetX-0008Ep-8f for 74801-done <at> debbugs.gnu.org; Mon, 12 May 2025 21:57:25 -0400 Received: by mail-pj1-x1035.google.com with SMTP id 98e67ed59e1d1-30a8cbddce3so4449244a91.1 for <74801-done <at> debbugs.gnu.org>; Mon, 12 May 2025 18:57:23 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1747101437; x=1747706237; darn=debbugs.gnu.org; h=content-transfer-encoding:mime-version:user-agent:message-id:date :references:in-reply-to:subject:cc:to:from:from:to:cc:subject:date :message-id:reply-to; bh=L2GwAibNYFPQhsGMlCht1ciC1JVQwvR4W51kIu6RyvY=; b=bhH7tYad/b8l7G+lNfr+5WCS3liY8E7j+aR93R/V7oi3QgB1Ho8DnPOwd+C1rT8eRe sRUl2O38BZEZYKyBOYBOVk/HgZDKwSIiOvBxUzYcfzt7CPz3IvnQkRyudM9MphL61YSB lYOJj7kie6ZdSok6yJpcSmnON5Bcvod++xk+Ub+GYtWDpgkxQ/snfjDMBM3H8+VeI9iB lKIuu85oI9T5ihjuLca3osWjNtDIQYIJTZeu0KuRyNVR7HmQLApeAMPddaqYjYhrdY4E w3m/XFQAUQzAS+lXJo8rdIqj2vu2lQ1usfLuSAKeHF42kHtUHYg+nSpImP2Q1gLuFpBd JolA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1747101437; x=1747706237; h=content-transfer-encoding:mime-version:user-agent:message-id:date :references:in-reply-to:subject:cc:to:from:x-gm-message-state:from :to:cc:subject:date:message-id:reply-to; bh=L2GwAibNYFPQhsGMlCht1ciC1JVQwvR4W51kIu6RyvY=; b=fLqfz0rrnnuFG8yTAFc72ril3PF6wNLpbAcYHKVwFVh87NJ+7hY/hkaQfUVKXF2rNo NClikU96DPujA8UurlrSGK5YlTvqbofW4bLNmGRn668wvQfMMZIaTPlMnyf4rRURMAOH 2T7nqcyLnTFsCssIKBIfPH43UKGlnR1Ih2jt6qE5jpNihIEB+05nCgole6Bhwbslx5g4 SAFl4+Sw6Hq4RiBdi6B5+hzoDMOwHrQ9+2E1FVUZQd6vKTGnrETasFAPLIMoZDdRUm+1 CN2IiHAqSYt3NIcwY2TUI/0FqidslQINt43nzvlh2FTJACHdiZIxeMMN9SUM6etJYSKu wfGA== X-Forwarded-Encrypted: i=1; AJvYcCW9Dmjd8X13q3YPSsICsJnqvALIxiqkz/OKpyVGzqvlRc26em+S8bbKVxPec+xKNXPRP2NVlrX+Ur0g <at> debbugs.gnu.org X-Gm-Message-State: AOJu0YwWbq/Mp9+P7AQus47y8OIZdCOYaFnD96RjJrhIZq3eRl2cKwiL LSiy4uUrXveHcJ1hS08uRH1W7o/oiExgsyHQw5DD+OQjd+eAEqld X-Gm-Gg: ASbGncskBJBI+OjsvqIodJd0T+L+j2dEKjK+lliGxpoiGsMfOYl7gApuqNMfUrdht6l PkB/L7JTp4FlR1QPdptNMmDU7jw6oRy2Gf1WWOX85b6v8LvcI0c/nhe+YrPnyLyxHce/nEnVSqX N0bG/gDa4hyD8uFfsAqSezCbxP3iweJitBGaJyQ1Ywby38piPEW5nRehnD7eiuRtJvletGDRfHe aF9jOxBZ4RTxcsLHxRg7unwz52DQmmAiG7PSfkUB6nv7WAm0h+RWbFCi5ExJTtk5eLvE5GWc1vy cQsGIvNcwZ9ekpZpwTvHt30ohidZtzD+OsJP+pcHh7oYopMIjw== X-Google-Smtp-Source: AGHT+IEv8XNLentoqrRP+ZYAIHxWZEBbOoN+xS+Q6xrfWsel4SEhmaBMb9djnhuiwS9wyGXvZUjQwA== X-Received: by 2002:a17:90b:394e:b0:305:5f32:d9f5 with SMTP id 98e67ed59e1d1-30c3cafda6cmr23773628a91.7.1747101437063; Mon, 12 May 2025 18:57:17 -0700 (PDT) Received: from terra ([2405:6586:be0:0:83c8:d31d:2cec:f542]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-30c39dc8a63sm7452279a91.4.2025.05.12.18.57.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 12 May 2025 18:57:16 -0700 (PDT) From: Maxim Cournoyer <maxim.cournoyer@HIDDEN> To: Tomas Volf <~@wolfsden.cz> Subject: Re: [bug#74801] [PATCH] gnu: home: services: Add home-mpv-service-type. In-Reply-To: <87bjrxvlf9.fsf@HIDDEN> (Tomas Volf's message of "Mon, 12 May 2025 18:33:14 +0200") References: <29d3cc661a49b7bef951041f8ec3c7600c9777a7.1733953822.git.~@wolfsden.cz> <3f2fe502b4e02c3c9d2a0890da8ed46b37598ce9.1746786834.git.~@wolfsden.cz> <87frha5mnx.fsf_-_@HIDDEN> <87bjrxvlf9.fsf@HIDDEN> Date: Tue, 13 May 2025 10:57:12 +0900 Message-ID: <87v7q5mfwn.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 74801-done Cc: Tanguy Le Carrour <tanguy@HIDDEN>, Ludovic =?utf-8?Q?Court=C3=A8s?= <ludo@HIDDEN>, Gabriel Wicki <gabriel@HIDDEN>, Andrew Tropin <andrew@HIDDEN>, Hilton Chain <hako@HIDDEN>, Janneke Nieuwenhuizen <janneke@HIDDEN>, 74801-done <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -1.0 (-) Hi, Tomas Volf <~@wolfsden.cz> writes: > Ludovic Court=C3=A8s <ludo@HIDDEN> writes: > >>> + #:global (make-mpv-profile-configuration >>> + #:fullscreen #t >> >> Are we missing a question mark? >> >>> + #:profiles `((fullscreen . ,(make-mpv-profile-configuration >>> + #:fullscreen #t)))) >> >> Here also. > > Yes, you are right. I forgot to add the ? into the documentation as > well. Fixed in v4. Sorry. :/ Applied, at last! Thanks to everyone involved. --=20 Maxim
Tomas Volf <~@wolfsden.cz>
:Maxim Cournoyer <maxim.cournoyer@HIDDEN>
:Received: (at 74801) by debbugs.gnu.org; 12 May 2025 16:33:19 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon May 12 12:33:19 2025 Received: from localhost ([127.0.0.1]:54352 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1uEW5f-0004mC-5m for submit <at> debbugs.gnu.org; Mon, 12 May 2025 12:33:19 -0400 Received: from wolfsden.cz ([37.205.8.62]:41130) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from <~@wolfsden.cz>) id 1uEW5b-0004lz-2O for 74801 <at> debbugs.gnu.org; Mon, 12 May 2025 12:33:16 -0400 Received: by wolfsden.cz (Postfix, from userid 104) id 9E6B938C7D3; Mon, 12 May 2025 16:33:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail; t=1747067593; bh=MG4+zLhfVbGYSu7nsbQEv9uhBGNZAAjTVZD0kzuBEiI=; h=From:To:Cc:Subject:In-Reply-To:References:Date; b=pZseRsXXahcRQNxBgO09FYl4FYFfhAevhnO3Wr5nYaE3i19bEsVdY5ZaM7Ux9kfD3 lXx9u4U1d3ruoaqPaOv9aqRg7mw62/izlGspk75rQXWacxmcTnTY/CYcv0FzU6YCa9 UsiadviCmgOdUdjmV5tPE2tI/oSv2SG75Li7HQjsyRSjlv7adI+B1Ol3TrspbGjPae oQxBEelBGKK6lPJAK6EkMQ8C8fvnu/capWSEazxXH2OziT+gXLm5Qc2rvTlGsU6X+S 8RLWyki2gGmfk8cOvUypjm0qGZBWXXZCZM2nfPLKnFpIp1U9Ko7znvIIyYZCJ/5Wnu MoFncUGcDkUuO0/+m0CtK1P618gwfaIr0vr6uQd3OaXa/On1hFMK+AXnpptlfLptki qL87JpDQezBd8oeHAanlQwRfUfH1+jrs5N9Hl1Jktn9ljbKMTw5ZKyswJNnxxqK2AW da8nPD0s5yVzKN2ehf8OujTjjDm/G776i0aPl9xLYzgiQJ8LzDAnC0D189EjfMreyr nGqDUY54Og0sq5nBMT4+trbWp28yhYA+mQuIXygNHE+MTzfb4bJph1OaeckWWEOYz5 MMN5q6grZgVb2YZ1vWPlLD9ssgYRWICQ587/GiZfip+9miY58EqwjQolVlmV7vGyiN 44p/hAC3abbbzCqzvvrPPr9A= X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on wolfsden X-Spam-Level: X-Spam-Status: No, score=-3.1 required=5.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 Received: from localhost (unknown [128.0.188.242]) by wolfsden.cz (Postfix) with ESMTPSA id 52AF238DA09; Mon, 12 May 2025 16:33:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail; t=1747067593; bh=MG4+zLhfVbGYSu7nsbQEv9uhBGNZAAjTVZD0kzuBEiI=; h=From:To:Cc:Subject:In-Reply-To:References:Date; b=pZseRsXXahcRQNxBgO09FYl4FYFfhAevhnO3Wr5nYaE3i19bEsVdY5ZaM7Ux9kfD3 lXx9u4U1d3ruoaqPaOv9aqRg7mw62/izlGspk75rQXWacxmcTnTY/CYcv0FzU6YCa9 UsiadviCmgOdUdjmV5tPE2tI/oSv2SG75Li7HQjsyRSjlv7adI+B1Ol3TrspbGjPae oQxBEelBGKK6lPJAK6EkMQ8C8fvnu/capWSEazxXH2OziT+gXLm5Qc2rvTlGsU6X+S 8RLWyki2gGmfk8cOvUypjm0qGZBWXXZCZM2nfPLKnFpIp1U9Ko7znvIIyYZCJ/5Wnu MoFncUGcDkUuO0/+m0CtK1P618gwfaIr0vr6uQd3OaXa/On1hFMK+AXnpptlfLptki qL87JpDQezBd8oeHAanlQwRfUfH1+jrs5N9Hl1Jktn9ljbKMTw5ZKyswJNnxxqK2AW da8nPD0s5yVzKN2ehf8OujTjjDm/G776i0aPl9xLYzgiQJ8LzDAnC0D189EjfMreyr nGqDUY54Og0sq5nBMT4+trbWp28yhYA+mQuIXygNHE+MTzfb4bJph1OaeckWWEOYz5 MMN5q6grZgVb2YZ1vWPlLD9ssgYRWICQ587/GiZfip+9miY58EqwjQolVlmV7vGyiN 44p/hAC3abbbzCqzvvrPPr9A= From: Tomas Volf <~@wolfsden.cz> To: Ludovic =?utf-8?Q?Court=C3=A8s?= <ludo@HIDDEN> Subject: Re: bug#74801: [PATCH] gnu: home: services: Add home-mpv-service-type. In-Reply-To: <87frha5mnx.fsf_-_@HIDDEN> ("Ludovic =?utf-8?Q?Court=C3=A8s?= =?utf-8?Q?=22's?= message of "Mon, 12 May 2025 09:10:58 +0200") References: <29d3cc661a49b7bef951041f8ec3c7600c9777a7.1733953822.git.~@wolfsden.cz> <3f2fe502b4e02c3c9d2a0890da8ed46b37598ce9.1746786834.git.~@wolfsden.cz> <87frha5mnx.fsf_-_@HIDDEN> Date: Mon, 12 May 2025 18:33:14 +0200 Message-ID: <87bjrxvlf9.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 74801 Cc: Tanguy Le Carrour <tanguy@HIDDEN>, Maxim Cournoyer <maxim.cournoyer@HIDDEN>, Gabriel Wicki <gabriel@HIDDEN>, Andrew Tropin <andrew@HIDDEN>, Hilton Chain <hako@HIDDEN>, 74801 <at> debbugs.gnu.org, Janneke Nieuwenhuizen <janneke@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -1.0 (-) Ludovic Court=C3=A8s <ludo@HIDDEN> writes: >> + #:global (make-mpv-profile-configuration >> + #:fullscreen #t > > Are we missing a question mark? > >> + #:profiles `((fullscreen . ,(make-mpv-profile-configuration >> + #:fullscreen #t)))) > > Here also. Yes, you are right. I forgot to add the ? into the documentation as well. Fixed in v4. Sorry. :/ Tomas --=20 There are only two hard things in Computer Science: cache invalidation, naming things and off-by-one errors.
guix-patches@HIDDEN
:bug#74801
; Package guix-patches
.
Full text available.Received: (at 74801) by debbugs.gnu.org; 12 May 2025 16:32:04 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon May 12 12:32:04 2025 Received: from localhost ([127.0.0.1]:54338 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1uEW4N-0004jT-MC for submit <at> debbugs.gnu.org; Mon, 12 May 2025 12:32:04 -0400 Received: from wolfsden.cz ([37.205.8.62]:48734) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from <~@wolfsden.cz>) id 1uEW4F-0004iy-RC for 74801 <at> debbugs.gnu.org; Mon, 12 May 2025 12:31:57 -0400 Received: by wolfsden.cz (Postfix, from userid 104) id 64FC438C446; Mon, 12 May 2025 16:31:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail; t=1747067509; bh=wkgI8MMR5hsPZcVpCDGSiQ1wCf9rNHv2/GDnZdGOstg=; h=From:To:Cc:Subject:Date; b=Sf1MFGpOQKEQWfYu0Xpj4oZPyh3rkRWUZO6n6D9jno++nDBUdnn8jchcEMBk6C41I jCvx/IHyDZWg2hcReypH4UmL5Gq74tgV4nNtvtBL+A9yzdjEY4f+QnBtAlamgygBMl ZHQ4dN3p2mq777nvQsdtg23iJIEgarMshowb6OlYjm9G3M4Y9TDxxttQZk3dKSv5n/ L8j5qZ/mYYfUGplJu29qLD7Hp3Ell/zJKTo4PDzSZ2tX81CWHYm78bhoTjX7OmME64 CgUzCVV+mp7QpuNBsP9fwRSIlFIB3EWPmNSb5v4k9F+AIlGikZ5z4HscRmkUcfTlMH e546W4V2jsE2R6MJeIwik+mFwqVRP/xtcnBcWOCjbgRLhfyrFxAJGj5FIgSCSl8tG+ GRMKHCbzUBqAGX4oYi4030/xbah51fPhOx6IU6zl7/DZxnLvtrAGV18PV54eqISu1t A9AwdZYWdsihei9IrvX7mVbeZG+AopC7lkUzlQOoaPeTZ3Yvf94o6RwsfCQ+7lOxrZ 9q5g/AtpTNmvNdSoEkbSWJYYsglsvzJG3zVCPrAgzMGt2ZJ6ObLwEno/HmjBzsh8nn uQsV5DwLkXRm8ia4EYC69eyO8SVnZlts1aRb2W9Sb8B0IZAnN2/5bmZi7vUO8XsAgW xSHrDyvmpccLFeRS9n1M0MfE= X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on wolfsden X-Spam-Level: X-Spam-Status: No, score=-3.1 required=5.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.6 Received: from localhost (unknown [128.0.188.242]) by wolfsden.cz (Postfix) with ESMTPSA id 5E1E738C6A0; Mon, 12 May 2025 16:31:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail; t=1747067504; bh=wkgI8MMR5hsPZcVpCDGSiQ1wCf9rNHv2/GDnZdGOstg=; h=From:To:Cc:Subject:Date; b=yqLAD3NtRvB4xuZLsxXZv9jUaJ7msqIkRYQ8uTgep+YIcOmgdl0atTUoavdJUkvk/ yB6Wv7fdYBrUvyuGSdc/mO0FoqCRXkBMMSu4zCUBXtzmkAEprbcKf9UJuukhYGmN9J Kw9Nxr8eHzywB6MLmhKCTsaUaV4r8AxsKOpUwZ/833gJkomiPBxqIdTh7UUfR+Cs4p d7a+CqnIok5Ff0k8i2nHu6hTxM6COGCf841iIt+mNXEJDGtc8e1sk8XAPPCWhS8NNI Gf6YI9rP00WtUhUCZE6r8/8EqQSJCZROtf8Bk6gJ9Qp0NhQ6ksHOKmFn2QAXQiaV6s Ia6xXYz9schaD/efL/4kKx94ikgidMlaYo4C2mjQ4suTByVYxS3Qli+fZnkATYl8SZ hzKG6kR3szCyk3fNQoV9iqiQEx54Z5D+E+597zHLSutqQmhQwWTHaJGU+OqhZkcMzg 5+YR3NkcjzlZILpWfI8XMcf/bL7KHSwEBLBnxvXbrorZb12d60NsanAauT/cR2pDtB Qp2iYdxAMLM+fr0HgjWq3eYAnAXSp0TN3hHwx+mmqHqqbLAvcz9Sh/PMryc0tJ1OSs a5fyFEgezPmXBL0DK96sa9c1WoLLS/TgzTcw+Is9hfcYOxsHV5YT+eufIOdaLHk/Yx xWLeDN7ned/wiYZKi8ac7L0Q= From: Tomas Volf <~@wolfsden.cz> To: 74801 <at> debbugs.gnu.org Subject: [PATCH v4] gnu: home: services: Add home-mpv-service-type. Date: Mon, 12 May 2025 18:31:21 +0200 Message-ID: <7050aac6dcef5bb359ef908058c4b341720dc8ef.1747067481.git.~@wolfsden.cz> X-Mailer: git-send-email 2.49.0 MIME-Version: 1.0 X-Debbugs-Cc: Andrew Tropin <andrew@HIDDEN>, Gabriel Wicki <gabriel@HIDDEN>, Hilton Chain <hako@HIDDEN>, Janneke Nieuwenhuizen <janneke@HIDDEN>, Ludovic Courtès <ludo@HIDDEN>, Maxim Cournoyer <maxim.cournoyer@HIDDEN>, Tanguy Le Carrour <tanguy@HIDDEN> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 74801 Cc: Tomas Volf <~@wolfsden.cz> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -1.0 (-) This commit adds a new service type to generate configuration file for the mpv media player. Originally I attempted to use Guix Records (via define-configuration) for this, but ran into the bug #74748, so I had to switch to procedures instead. The usage is (hopefully) sufficiently described in the documentation. When the bug is resolved, I will update it to use define-configuration instead. The full list of supported options is documented, however I decided to *not* document types and purpose for each individual fields. While I had mostly working prototype to extract the documentation from mpv, once I realized it would be few 10k of lines added, I decided it is not worth it. It would bloat the .texi file (by more than 50%), be hard to maintain and, in my opinion, would not provide enough value to justify that. The current version seems like sane middle ground. * gnu/home/services/mpv.scm: New file. * gnu/local.mk (GNU_SYSTEM_MODULES): Register it. * doc/guix.texi (mpv Media Player): Document it. Change-Id: I2deb44799a28047cb5d67da97dc6007a9df873af --- v4: - Also add ? into the documentation. doc/guix.texi | 429 ++++++ gnu/home/services/mpv.scm | 2751 +++++++++++++++++++++++++++++++++++++ gnu/local.mk | 1 + 3 files changed, 3181 insertions(+) create mode 100644 gnu/home/services/mpv.scm diff --git a/doc/guix.texi b/doc/guix.texi index 889eab2ab3..ed823073e5 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -50747,6 +50747,435 @@ Media Home Services @end table @end deftp +@c This is ugly, but upstream does *not* capitalize the ``m'' even when +@c at the beginning of a sentence. So let us follow the branding. +@node mpv Media Player +@subsection mpv Media Player + +@cindex mpv, Home Service +@cindex mpv, configuration +Configuring the @uref{https://mpv.io/, mpv media player} can be somewhat +daunting task, due to the sheer amount of options available, especially +if one wants to be able to inherit the configuration in their code. The +@code{home-mpv-service-type} is provided to help with that problem. +When the service is added to your home environment, file based on the +passed configuration is generated and placed into the correct location. + +Due to the bug #74748, it does not use Guix Records to represent the +configuration, but uses keyword arguments to achieve similar result. +Example follows: + +@lisp +(service home-mpv-service-type + (make-home-mpv-configuration + #:global (make-mpv-profile-configuration + #:fullscreen? #t + #:alang '("jpn" "eng")))) +@end lisp + +@defvar home-mpv-service-type +This is the type of the mpv home service, whose value is a +@code{home-mpv-configuration} object. +@end defvar + +@deffn {Procedure} make-home-mpv-configuration +Return a new instance of @code{home-mpv-configuration}. Available +keyword arguments are: + +@table @asis +@item @code{inherit} (default: @code{#t}) +Inherit fields from an another instance. + +@item @code{global} (default: @code{(make-mpv-profile-configuration)}) +The global configuration preceding all profiles. + +@item @code{profiles} (default: @code{()}) +An alist containing configuration for any additional profiles to include +in the configuration file. + +@lisp +(make-home-mpv-configuration + #:profiles `((fullscreen . ,(make-mpv-profile-configuration + #:fullscreen? #t)))) +@end lisp + +@item @code{extra-config} (default: @code{#f}) +Additional content to include in the configuration file. It is placed +at the end of the file. + +@end table +@end deffn + +@deffn {Procedure} make-mpv-profile-configuration +Return a new instance of @code{mpv-profile-configuration}. As above, it +also supports the @code{#:inherit} argument. Additionally it supports +keyword arguments named after the options of @command{mpv}. Hence +@option{--fullscreen} (or @code{fullscreen} in the configuration file) +becomes @code{#:fullscreen?}. + +Few options are using their aliases instead. @option{audio} instead of +@option{aid}, @option{video} instead of @option{vid}, @option{sub} +instead of @option{sid}, @option{screenshot-directory} instead of +@option{screenshot-dir} and @option{watch-later-directory} instead of +@option{watch-later-dir}. + +Valid values for the fields depend on their type. + +@table @asis +@item Flags +The value should be @code{#f} or @code{#t}. + +@item Numerical fields +Integer and integer64 fields are validated by @code{integer?}, float and +double fields by @code{real?}. Ranges are checked when applicable. + +@item Aspect +Same as integer. + +@item ByteSize +Same as integer64. + +@item Choice +The value should be a symbol representing member of the enumeration. If +the choice has @samp{or ...} part, it can also be value of that +alternative type. + +@item @var{type} list +The value should be a list of the @var{type}. + +@end table + +Other types accept strings, with validation of the values where possible +(e.g. type @samp{Color} is validated, but type @samp{Audio channels or +channel map} is not). + +The full list of currently supported keyword arguments is below. For +the types, allowed values and full description please refer to the +@command{mpv --list-options} and +@uref{https://mpv.io/manual/stable/#options, mpv manual}. + +Only set fields are outputted to the configuration file. Accessors are +provided for every field, returning either their value or a sentinel +object @code{%unset-value} (from @code{(gnu services configuration)}). + +@code{ab-loop-a}, @code{ab-loop-b}, @code{ab-loop-count}, +@code{access-references?}, @code{ad}, @code{ad-lavc-ac3drc}, +@code{ad-lavc-downmix?}, @code{ad-lavc-o}, @code{ad-lavc-threads}, +@code{ad-queue-enable?}, @code{ad-queue-max-bytes}, +@code{ad-queue-max-samples}, @code{ad-queue-max-secs}, @code{af}, +@code{audio}, @code{alang}, @code{allow-delayed-peak-detect?}, +@code{alsa-buffer-time}, @code{alsa-ignore-chmap?}, +@code{alsa-mixer-device}, @code{alsa-mixer-index}, +@code{alsa-mixer-name}, @code{alsa-non-interleaved?}, +@code{alsa-periods}, @code{alsa-resample?}, @code{ao}, +@code{ao-null-broken-delay?}, @code{ao-null-broken-eof?}, +@code{ao-null-buffer}, @code{ao-null-channel-layouts}, +@code{ao-null-format}, @code{ao-null-latency}, @code{ao-null-outburst}, +@code{ao-null-speed}, @code{ao-null-untimed?}, @code{ao-pcm-append?}, +@code{ao-pcm-file}, @code{ao-pcm-waveheader?}, +@code{audio-backward-batch}, @code{audio-backward-overlap}, +@code{audio-buffer}, @code{audio-channels}, @code{audio-client-name}, +@code{audio-delay}, @code{audio-demuxer}, @code{audio-device}, +@code{audio-display}, @code{audio-exclusive?}, @code{audio-exts}, +@code{audio-fallback-to-null?}, @code{audio-file-auto}, +@code{audio-file-paths}, @code{audio-files}, @code{audio-format}, +@code{audio-normalize-downmix?}, @code{audio-pitch-correction?}, +@code{audio-resample-cutoff}, @code{audio-resample-filter-size}, +@code{audio-resample-linear?}, @code{audio-resample-max-output-size}, +@code{audio-resample-phase-shift}, @code{audio-reversal-buffer}, +@code{audio-samplerate}, @code{audio-spdif}, +@code{audio-stream-silence?}, @code{audio-swresample-o}, +@code{audio-wait-open}, @code{auto-window-resize?}, +@code{autocreate-playlist}, @code{autofit}, @code{autofit-larger}, +@code{autofit-smaller}, @code{autoload-files?}, @code{autosync}, +@code{background}, @code{background-color}, @code{blend-subtitles}, +@code{bluray-device}, @code{border?}, @code{border-background}, +@code{brightness}, @code{cache}, @code{cache-on-disk?}, +@code{cache-pause?}, @code{cache-pause-initial?}, +@code{cache-pause-wait}, @code{cache-secs}, @code{cdda-cdtext?}, +@code{cdda-device}, @code{cdda-overlap}, @code{cdda-paranoia}, +@code{cdda-sector-size}, @code{cdda-skip?}, @code{cdda-span-a}, +@code{cdda-span-b}, @code{cdda-speed}, @code{cdda-toc-offset}, +@code{chapter-merge-threshold}, @code{chapter-seek-threshold}, +@code{chapters-file}, @code{config?}, @code{container-fps-override}, +@code{contrast}, @code{cookies?}, @code{cookies-file}, +@code{corner-rounding}, @code{correct-downscaling?}, +@code{correct-pts?}, @code{cover-art-auto}, @code{cover-art-files}, +@code{cover-art-whitelist}, @code{cscale}, @code{cscale-antiring}, +@code{cscale-blur}, @code{cscale-clamp}, @code{cscale-param1}, +@code{cscale-param2}, @code{cscale-radius}, @code{cscale-taper}, +@code{cscale-window}, @code{cscale-wparam}, @code{cscale-wtaper}, +@code{cursor-autohide}, @code{cursor-autohide-fs-only?}, @code{deband?}, +@code{deband-grain}, @code{deband-iterations}, @code{deband-range}, +@code{deband-threshold}, @code{deinterlace}, +@code{deinterlace-field-parity}, @code{demuxer}, +@code{demuxer-backward-playback-step}, @code{demuxer-cache-dir}, +@code{demuxer-cache-unlink-files}, @code{demuxer-cache-wait?}, +@code{demuxer-donate-buffer?}, @code{demuxer-hysteresis-secs}, +@code{demuxer-lavf-allow-mimetype?}, +@code{demuxer-lavf-analyzeduration}, @code{demuxer-lavf-buffersize}, +@code{demuxer-lavf-format}, @code{demuxer-lavf-hacks?}, +@code{demuxer-lavf-linearize-timestamps}, @code{demuxer-lavf-o}, +@code{demuxer-lavf-probe-info}, @code{demuxer-lavf-probescore}, +@code{demuxer-lavf-probesize}, @code{demuxer-lavf-propagate-opts?}, +@code{demuxer-max-back-bytes}, @code{demuxer-max-bytes}, +@code{demuxer-mkv-probe-start-time?}, +@code{demuxer-mkv-probe-video-duration}, +@code{demuxer-mkv-subtitle-preroll}, +@code{demuxer-mkv-subtitle-preroll-secs}, +@code{demuxer-mkv-subtitle-preroll-secs-index}, +@code{demuxer-rawaudio-channels}, @code{demuxer-rawaudio-format}, +@code{demuxer-rawaudio-rate}, @code{demuxer-rawvideo-codec}, +@code{demuxer-rawvideo-format}, @code{demuxer-rawvideo-fps}, +@code{demuxer-rawvideo-h}, @code{demuxer-rawvideo-mp-format}, +@code{demuxer-rawvideo-size}, @code{demuxer-rawvideo-w}, +@code{demuxer-readahead-secs}, @code{demuxer-seekable-cache}, +@code{demuxer-termination-timeout}, @code{demuxer-thread?}, +@code{directory-filter-types}, @code{directory-mode}, +@code{display-fps-override}, @code{display-tags}, @code{dither}, +@code{dither-depth}, @code{dither-size-fruit}, @code{drag-and-drop}, +@code{drm-connector}, @code{drm-device}, @code{drm-draw-plane}, +@code{drm-draw-surface-size}, @code{drm-drmprime-video-plane}, +@code{drm-format}, @code{drm-mode}, @code{drm-vrr-enabled}, +@code{dscale}, @code{dscale-antiring}, @code{dscale-blur}, +@code{dscale-clamp}, @code{dscale-param1}, @code{dscale-param2}, +@code{dscale-radius}, @code{dscale-taper}, @code{dscale-window}, +@code{dscale-wparam}, @code{dscale-wtaper}, @code{dump-stats}, +@code{dvbin-card}, @code{dvbin-channel-switch-offset}, +@code{dvbin-file}, @code{dvbin-full-transponder?}, @code{dvbin-prog}, +@code{dvbin-timeout}, @code{dvd-angle}, @code{dvd-device}, +@code{dvd-speed}, @code{edition}, @code{egl-config-id}, +@code{egl-output-format}, @code{embeddedfonts?}, @code{end}, +@code{error-diffusion}, @code{external-files}, @code{fbo-format}, +@code{focus-on}, @code{force-media-title}, @code{force-render?}, +@code{force-rgba-osd-rendering?}, @code{force-seekable?}, +@code{force-window}, @code{force-window-position?}, @code{framedrop}, +@code{frames}, @code{fs-screen}, @code{fs-screen-name}, +@code{fullscreen?}, @code{gamma}, @code{gamma-auto?}, +@code{gamma-factor}, @code{gamut-mapping-mode}, @code{gapless-audio}, +@code{geometry}, @code{glsl-shader-opts}, @code{glsl-shaders}, +@code{gpu-api}, @code{gpu-context}, @code{gpu-debug?}, +@code{gpu-dumb-mode}, @code{gpu-hwdec-interop}, +@code{gpu-shader-cache?}, @code{gpu-shader-cache-dir}, @code{gpu-sw?}, +@code{gpu-tex-pad-x}, @code{gpu-tex-pad-y}, @code{hdr-compute-peak}, +@code{hdr-contrast-recovery}, @code{hdr-contrast-smoothness}, +@code{hdr-peak-decay-rate}, @code{hdr-peak-percentile}, +@code{hdr-scene-threshold-high}, @code{hdr-scene-threshold-low}, +@code{hidpi-window-scale?}, @code{hls-bitrate}, @code{hr-seek}, +@code{hr-seek-demuxer-offset}, @code{hr-seek-framedrop?}, +@code{http-header-fields}, @code{http-proxy}, @code{hue}, @code{hwdec}, +@code{hwdec-codecs}, @code{hwdec-extra-frames}, +@code{hwdec-image-format}, @code{icc-3dlut-size}, @code{icc-cache?}, +@code{icc-cache-dir}, @code{icc-force-contrast}, @code{icc-intent}, +@code{icc-profile}, @code{icc-profile-auto?}, @code{icc-use-luma?}, +@code{idle}, @code{ignore-path-in-watch-later-config?}, +@code{image-display-duration}, @code{image-exts}, @code{image-lut}, +@code{image-lut-type}, @code{image-subs-video-resolution?}, +@code{include}, @code{index}, @code{initial-audio-sync?}, +@code{input-ar-delay}, @code{input-ar-rate}, +@code{input-builtin-bindings?}, @code{input-builtin-dragging?}, +@code{input-commands}, @code{input-conf}, @code{input-cursor?}, +@code{input-cursor-passthrough?}, @code{input-default-bindings?}, +@code{input-doubleclick-time}, @code{input-dragging-deadzone}, +@code{input-ipc-client}, @code{input-ipc-server}, +@code{input-key-fifo-size}, @code{input-media-keys?}, +@code{input-preprocess-wheel?}, @code{input-right-alt-gr?}, +@code{input-terminal?}, @code{input-test?}, +@code{input-touch-emulate-mouse?}, @code{input-vo-keyboard?}, +@code{interpolation?}, @code{interpolation-preserve?}, +@code{interpolation-threshold}, @code{inverse-tone-mapping?}, +@code{jack-autostart?}, @code{jack-connect?}, @code{jack-name}, +@code{jack-port}, @code{jack-std-channel-layout}, @code{keep-open}, +@code{keep-open-pause?}, @code{keepaspect?}, @code{keepaspect-window?}, +@code{lavfi-complex}, @code{length}, @code{libplacebo-opts}, +@code{linear-downscaling?}, @code{linear-upscaling?}, +@code{load-auto-profiles}, @code{load-osd-console?}, +@code{load-scripts?}, @code{load-select?}, @code{load-stats-overlay?}, +@code{load-unsafe-playlists?}, @code{log-file}, @code{loop-file}, +@code{loop-playlist}, @code{lut}, @code{lut-type}, @code{mc}, +@code{media-controls}, @code{merge-files?}, @code{metadata-codepage}, +@code{mf-fps}, @code{mf-type}, @code{monitoraspect}, +@code{monitorpixelaspect}, @code{msg-color?}, @code{msg-level}, +@code{msg-module?}, @code{msg-time?}, @code{mute?}, @code{native-fs?}, +@code{native-keyrepeat?}, @code{native-touch?}, @code{network-timeout}, +@code{oac}, @code{oacopts}, @code{ocopy-metadata?}, @code{of}, +@code{ofopts}, @code{on-all-workspaces?}, @code{ontop?}, +@code{ontop-level}, @code{opengl-check-pattern-a}, +@code{opengl-check-pattern-b}, @code{opengl-early-flush}, +@code{opengl-es}, @code{opengl-glfinish?}, @code{opengl-pbo?}, +@code{opengl-rectangle-textures?}, @code{opengl-swapinterval}, +@code{opengl-waitvsync?}, @code{orawts?}, @code{ordered-chapters?}, +@code{ordered-chapters-files}, @code{oremove-metadata}, @code{osc?}, +@code{osd-align-x}, @code{osd-align-y}, @code{osd-back-color}, +@code{osd-bar?}, @code{osd-bar-align-x}, @code{osd-bar-align-y}, +@code{osd-bar-h}, @code{osd-bar-outline-size}, @code{osd-bar-w}, +@code{osd-blur}, @code{osd-bold?}, @code{osd-border-style}, +@code{osd-color}, @code{osd-duration}, @code{osd-font}, +@code{osd-font-provider}, @code{osd-font-size}, @code{osd-fonts-dir}, +@code{osd-fractions?}, @code{osd-italic?}, @code{osd-justify}, +@code{osd-level}, @code{osd-margin-x}, @code{osd-margin-y}, +@code{osd-msg1}, @code{osd-msg2}, @code{osd-msg3}, @code{osd-on-seek}, +@code{osd-outline-color}, @code{osd-outline-size}, +@code{osd-playing-msg}, @code{osd-playing-msg-duration}, +@code{osd-playlist-entry}, @code{osd-scale}, +@code{osd-scale-by-window?}, @code{osd-shadow-offset}, +@code{osd-spacing}, @code{osd-status-msg}, @code{oset-metadata}, +@code{ovc}, @code{ovcopts}, @code{panscan}, @code{pause?}, +@code{pipewire-buffer}, @code{pipewire-remote}, +@code{pipewire-volume-mode}, @code{pitch}, @code{play-direction}, +@code{player-operation-mode}, @code{playlist-start}, +@code{prefetch-playlist?}, @code{profile}, +@code{pulse-allow-suspended?}, @code{pulse-buffer}, @code{pulse-host}, +@code{pulse-latency-hacks?}, @code{quiet?}, @code{really-quiet?}, +@code{rebase-start-time?}, @code{referrer}, @code{replaygain}, +@code{replaygain-clip?}, @code{replaygain-fallback}, +@code{replaygain-preamp}, @code{reset-on-next-file}, +@code{resume-playback?}, @code{resume-playback-check-mtime?}, +@code{rtsp-transport}, @code{saturation}, @code{save-position-on-quit?}, +@code{scale}, @code{scale-antiring}, @code{scale-blur}, +@code{scale-clamp}, @code{scale-param1}, @code{scale-param2}, +@code{scale-radius}, @code{scale-taper}, @code{scale-window}, +@code{scale-wparam}, @code{scale-wtaper}, @code{scaler-resizes-only?}, +@code{screen}, @code{screen-name}, @code{screenshot-avif-encoder}, +@code{screenshot-avif-opts}, @code{screenshot-avif-pixfmt}, +@code{screenshot-directory}, @code{screenshot-format}, +@code{screenshot-high-bit-depth?}, @code{screenshot-jpeg-quality}, +@code{screenshot-jpeg-source-chroma?}, @code{screenshot-jxl-distance}, +@code{screenshot-jxl-effort}, @code{screenshot-png-compression}, +@code{screenshot-png-filter}, @code{screenshot-sw?}, +@code{screenshot-tag-colorspace?}, @code{screenshot-template}, +@code{screenshot-webp-compression}, @code{screenshot-webp-lossless?}, +@code{screenshot-webp-quality}, @code{script-opts}, @code{scripts}, +@code{secondary-sid}, @code{secondary-sub-ass-override}, +@code{secondary-sub-delay}, @code{secondary-sub-pos}, +@code{secondary-sub-visibility?}, @code{sharpen}, +@code{show-in-taskbar?}, @code{shuffle?}, @code{sub}, +@code{sigmoid-center}, @code{sigmoid-slope}, @code{sigmoid-upscaling?}, +@code{slang}, @code{snap-window?}, @code{speed}, @code{spirv-compiler}, +@code{sstep}, @code{start}, @code{stop-playback-on-init-failure?}, +@code{stop-screensaver}, @code{stream-buffer-size}, @code{stream-dump}, +@code{stream-lavf-o}, @code{stream-record}, @code{stretch-dvd-subs?}, +@code{stretch-image-subs-to-screen?}, @code{sub-align-x}, +@code{sub-align-y}, @code{sub-ass?}, @code{sub-ass-force-margins?}, +@code{sub-ass-hinting}, @code{sub-ass-justify?}, +@code{sub-ass-line-spacing}, @code{sub-ass-override}, +@code{sub-ass-scale-with-window?}, @code{sub-ass-shaper}, +@code{sub-ass-style-overrides}, @code{sub-ass-styles}, +@code{sub-ass-use-video-data}, @code{sub-ass-video-aspect-override}, +@code{sub-ass-vsfilter-color-compat}, @code{sub-auto}, +@code{sub-auto-exts}, @code{sub-back-color}, @code{sub-blur}, +@code{sub-bold?}, @code{sub-border-style}, @code{sub-clear-on-seek?}, +@code{sub-codepage}, @code{sub-color}, @code{sub-create-cc-track?}, +@code{sub-delay}, @code{sub-demuxer}, @code{sub-file-paths}, +@code{sub-files}, @code{sub-filter-jsre}, @code{sub-filter-regex}, +@code{sub-filter-regex-enable?}, @code{sub-filter-regex-plain?}, +@code{sub-filter-regex-warn?}, @code{sub-filter-sdh?}, +@code{sub-filter-sdh-enclosures}, @code{sub-filter-sdh-harder?}, +@code{sub-fix-timing?}, @code{sub-font}, @code{sub-font-provider}, +@code{sub-font-size}, @code{sub-fonts-dir}, +@code{sub-forced-events-only?}, @code{sub-fps}, @code{sub-gauss}, +@code{sub-gray?}, @code{sub-italic?}, @code{sub-justify}, +@code{sub-lavc-o}, @code{sub-margin-x}, @code{sub-margin-y}, +@code{sub-outline-color}, @code{sub-outline-size}, +@code{sub-past-video-end?}, @code{sub-pos}, @code{sub-scale}, +@code{sub-scale-by-window?}, @code{sub-scale-with-window?}, +@code{sub-shadow-offset}, @code{sub-spacing}, @code{sub-speed}, +@code{sub-stretch-durations?}, @code{sub-use-margins?}, +@code{sub-visibility?}, @code{sub-vsfilter-bidi-compat?}, +@code{subs-fallback}, @code{subs-fallback-forced}, +@code{subs-match-os-language?}, @code{subs-with-matching-audio}, +@code{swapchain-depth}, @code{sws-allow-zimg?}, @code{sws-bitexact?}, +@code{sws-cgb}, @code{sws-chs}, @code{sws-cs}, @code{sws-cvs}, +@code{sws-fast?}, @code{sws-lgb}, @code{sws-ls}, @code{sws-scaler}, +@code{target-colorspace-hint?}, @code{target-contrast}, +@code{target-gamut}, @code{target-lut}, @code{target-peak}, +@code{target-prim}, @code{target-trc}, @code{taskbar-progress?}, +@code{teletext-page}, @code{temporal-dither?}, +@code{temporal-dither-period}, @code{term-osd}, @code{term-osd-bar?}, +@code{term-osd-bar-chars}, @code{term-playing-msg}, +@code{term-status-msg}, @code{term-title}, @code{terminal?}, +@code{title}, @code{title-bar?}, @code{tls-ca-file}, +@code{tls-cert-file}, @code{tls-key-file}, @code{tls-verify?}, +@code{tone-mapping}, @code{tone-mapping-max-boost}, +@code{tone-mapping-param}, @code{tone-mapping-visualize?}, +@code{track-auto-selection?}, @code{tscale}, @code{tscale-antiring}, +@code{tscale-blur}, @code{tscale-clamp}, @code{tscale-param1}, +@code{tscale-param2}, @code{tscale-radius}, @code{tscale-taper}, +@code{tscale-window}, @code{tscale-wparam}, @code{tscale-wtaper}, +@code{untimed?}, @code{use-embedded-icc-profile?}, +@code{use-filedir-conf?}, @code{user-agent}, @code{vaapi-device}, +@code{vd}, @code{vd-apply-cropping?}, @code{vd-lavc-assume-old-x264?}, +@code{vd-lavc-bitexact?}, @code{vd-lavc-check-hw-profile?}, +@code{vd-lavc-dr}, @code{vd-lavc-fast?}, @code{vd-lavc-film-grain}, +@code{vd-lavc-framedrop}, @code{vd-lavc-o}, @code{vd-lavc-show-all?}, +@code{vd-lavc-skipframe}, @code{vd-lavc-skipidct}, +@code{vd-lavc-skiploopfilter}, @code{vd-lavc-software-fallback}, +@code{vd-lavc-threads}, @code{vd-queue-enable?}, +@code{vd-queue-max-bytes}, @code{vd-queue-max-samples}, +@code{vd-queue-max-secs}, @code{vf}, @code{video}, @code{video-align-x}, +@code{video-align-y}, @code{video-aspect-method}, +@code{video-aspect-override}, @code{video-backward-batch}, +@code{video-backward-overlap}, @code{video-crop}, @code{video-exts}, +@code{video-latency-hacks?}, @code{video-margin-ratio-bottom}, +@code{video-margin-ratio-left}, @code{video-margin-ratio-right}, +@code{video-margin-ratio-top}, @code{video-osd?}, +@code{video-output-levels}, @code{video-pan-x}, @code{video-pan-y}, +@code{video-reversal-buffer}, @code{video-rotate}, @code{video-scale-x}, +@code{video-scale-y}, @code{video-sync}, +@code{video-sync-max-audio-change}, @code{video-sync-max-factor}, +@code{video-sync-max-video-change}, @code{video-timing-offset}, +@code{video-unscaled}, @code{video-zoom}, @code{vlang}, @code{vo}, +@code{vo-image-avif-encoder}, @code{vo-image-avif-opts}, +@code{vo-image-avif-pixfmt}, @code{vo-image-format}, +@code{vo-image-high-bit-depth?}, @code{vo-image-jpeg-quality}, +@code{vo-image-jpeg-source-chroma?}, @code{vo-image-jxl-distance}, +@code{vo-image-jxl-effort}, @code{vo-image-outdir}, +@code{vo-image-png-compression}, @code{vo-image-png-filter}, +@code{vo-image-tag-colorspace?}, @code{vo-image-webp-compression}, +@code{vo-image-webp-lossless?}, @code{vo-image-webp-quality}, +@code{vo-kitty-alt-screen?}, @code{vo-kitty-cols}, +@code{vo-kitty-config-clear?}, @code{vo-kitty-height}, +@code{vo-kitty-left}, @code{vo-kitty-rows}, @code{vo-kitty-top}, +@code{vo-kitty-use-shm?}, @code{vo-kitty-width}, @code{vo-null-fps}, +@code{vo-sixel-alt-screen?}, @code{vo-sixel-buffered?}, +@code{vo-sixel-cols}, @code{vo-sixel-config-clear?}, +@code{vo-sixel-dither}, @code{vo-sixel-fixedpalette?}, +@code{vo-sixel-height}, @code{vo-sixel-left}, @code{vo-sixel-pad-x}, +@code{vo-sixel-pad-y}, @code{vo-sixel-reqcolors}, @code{vo-sixel-rows}, +@code{vo-sixel-threshold}, @code{vo-sixel-top}, @code{vo-sixel-width}, +@code{vo-tct-256?}, @code{vo-tct-algo}, @code{vo-tct-buffering}, +@code{vo-tct-height}, @code{vo-tct-width}, @code{vo-vaapi-scaled-osd?}, +@code{vo-vaapi-scaling}, @code{vo-vdpau-chroma-deint?}, +@code{vo-vdpau-colorkey}, @code{vo-vdpau-composite-detect?}, +@code{vo-vdpau-denoise}, @code{vo-vdpau-force-yuv?}, +@code{vo-vdpau-fps}, @code{vo-vdpau-hqscaling}, +@code{vo-vdpau-output-surfaces}, @code{vo-vdpau-pullup?}, +@code{vo-vdpau-queuetime-fs}, @code{vo-vdpau-queuetime-windowed}, +@code{vo-vdpau-sharpen}, @code{volume}, @code{volume-gain}, +@code{volume-gain-max}, @code{volume-gain-min}, @code{volume-max}, +@code{vulkan-async-compute?}, @code{vulkan-async-transfer?}, +@code{vulkan-device}, @code{vulkan-display-display}, +@code{vulkan-display-mode}, @code{vulkan-display-plane}, +@code{vulkan-queue-count}, @code{vulkan-swap-mode}, +@code{watch-later-directory}, @code{watch-later-options}, +@code{wayland-app-id}, @code{wayland-configure-bounds}, +@code{wayland-content-type}, @code{wayland-disable-vsync?}, +@code{wayland-edge-pixels-pointer}, @code{wayland-edge-pixels-touch}, +@code{wayland-present?}, @code{wid}, @code{window-dragging?}, +@code{window-maximized?}, @code{window-minimized?}, @code{window-scale}, +@code{write-filename-in-watch-later-config?}, +@code{x11-bypass-compositor}, @code{x11-name}, @code{x11-netwm}, +@code{x11-present}, @code{x11-wid-title?}, @code{xv-adaptor}, +@code{xv-buffers}, @code{xv-ck}, @code{xv-ck-method}, +@code{xv-colorkey}, @code{xv-port}, @code{ytdl?}, @code{ytdl-format}, +@code{ytdl-raw-options}, @code{zimg-dither}, @code{zimg-fast?}, +@code{zimg-scaler}, @code{zimg-scaler-chroma}, +@code{zimg-scaler-chroma-param-a}, @code{zimg-scaler-chroma-param-b}, +@code{zimg-scaler-param-a}, @code{zimg-scaler-param-b}, and +@code{zimg-threads}. + +@end deffn + @node Sway window manager @subsection Sway window manager diff --git a/gnu/home/services/mpv.scm b/gnu/home/services/mpv.scm new file mode 100644 index 0000000000..8d11fa03a3 --- /dev/null +++ b/gnu/home/services/mpv.scm @@ -0,0 +1,2751 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2024, 2025 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 <http://www.gnu.org/licenses/>. + +(define-module (gnu home services mpv) + #:use-module ((gnu services configuration) #:select (%unset-value + maybe-value-set?)) + #:use-module (gnu home services) + #:autoload (guix diagnostics) (formatted-message) + #:autoload (guix i18n) (G_) + #: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 + + 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)) + + +;;; +;;; Basic types. +;;; +(define (serialize-mpv/boolean field-name value) + #~(string-append (string-trim-right #$(symbol->string field-name) #\?) + "=" + #$(if value "yes" "no") + "\n")) +(define mpv/boolean? boolean?) + +(define (serialize-mpv/integer field-name value) + #~(string-append #$(symbol->string field-name) + "=" + #$(number->string value) + "\n")) +(define (mpv/integer? n) + ;; We assume integer is a signed 32bit number. + (and-let* (((integer? n)) + ((>= n (* -1 (expt 2 (1- 32))))) + ((<= n (1- (expt 2 (1- 32)))))))) + +(define (serialize-mpv/integer64 field-name value) + #~(string-append #$(symbol->string field-name) + "=" + #$(number->string value) + "\n")) +(define (mpv/integer64? n) + ;; We assume integer is a signed 64bit number. + (and-let* (((integer? n)) + ((>= n (* -1 (expt 2 (1- 64))))) + ((<= n (1- (expt 2 (1- 64)))))))) + +(define (serialize-mpv/string field-name value) + #~(string-append #$(symbol->string field-name) + "=" + #$value + "\n")) +(define mpv/string? + string?) + +(define (serialize-mpv/float field-name value) + #~(string-append #$(symbol->string field-name) + "=" + #$(number->string (exact->inexact value)) + "\n")) +(define mpv/float? + ;; I am not sure how to validate floats. + real?) + +(define (serialize-mpv/double field-name value) + #~(string-append #$(symbol->string field-name) + "=" + #$(number->string (exact->inexact value)) + "\n")) +(define mpv/double? + ;; 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-mpv/aspect serialize-mpv/integer) +(define mpv/aspect? mpv/integer?) + +;;; `Audio channels or channel map' seems to be basically a free form string +;;; with no way to validate. +(define serialize-mpv/audio-channels-or-channel-map serialize-mpv/string) +(define mpv/audio-channels-or-channel-map? mpv/string?) + +;;; Does not seem possible to validate. +(define serialize-mpv/audio-format serialize-mpv/string) +(define mpv/audio-format? mpv/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-mpv/byte-size serialize-mpv/integer64) +(define mpv/byte-size? mpv/integer64?) + +(define (serialize-mpv/color field-name value) + #~(string-append #$(symbol->string field-name) + "=" + #$(if (list? value) + (string-join (map number->string value) "/") + value) + "\n")) +(define (mpv/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-mpv/fourcc serialize-mpv/string) +(define mpv/fourcc? mpv/string?) + +;;; No way to validate. +(define serialize-mpv/image-format serialize-mpv/string) +(define mpv/image-format? mpv/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-mpv/relative-time-or-percent-position serialize-mpv/string) +(define mpv/relative-time-or-percent-position? mpv/string?) + +(define serialize-mpv/time serialize-mpv/string) +(define mpv/time? mpv/string?) + +(define serialize-mpv/video-rectangle serialize-mpv/string) +(define (mpv/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-mpv/window-geometry serialize-mpv/string) +(define (mpv/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-mpv/window-size serialize-mpv/string) +(define (mpv/window-size? value) + (string-match "^([0-9]+%?(x[0-9]+%?)?)?$" value)) + +(define (serialize-mpv/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 (mpv/enumeration? value) + ;; There is no general way to check enumerations. The field always has to + ;; define custom sanitizer. + #t) + + + + +;;; +;;; List types. +;;; +(define (serialize-mpv/list-of-string field-name lst) + #~(string-append #$(symbol->string field-name) + "=" + #$(string-join lst ",") + "\n")) +(define (mpv/list-of-string? lst) + (every mpv/string? lst)) + +(define (serialize-mpv/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 (mpv/list-of-key-value? lst) + (every (match-lambda + (((? string?) . (? string?)) #t) + (_ #f)) + lst)) + +(define serialize-mpv/list-of-object-setting serialize-mpv/list-of-string) +(define mpv/list-of-object-setting? mpv/list-of-string?) + +(define serialize-mpv/list-of-output-verbosity serialize-mpv/list-of-key-value) +(define mpv/list-of-output-verbosity? mpv/list-of-key-value?) + + + + +;;; +;;; Actual configuration record. Contains a lot of generated code. +;;; + +(define-record-type <profile-option> + (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 "mpv/~a?" d/t))) + (d/serializer (string->symbol + (format #f "serialize-mpv/~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-value))) + (if (eq? x %unset-value) + %unset-value + (car x))))))))))) + +;;; Generated by: https://git.wolfsden.cz/guix/tree/etc/update-mpv-configuration +;;; 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 + pipewire-buffer + enumeration + (or (memq val '(native)) + (and (integer? val) (>= val 1) (<= val 2000)))) +(define-opt pipewire-remote string) +(define-opt + pipewire-volume-mode + enumeration + (memq val '(channel global))) +(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 <mpv-profile-configuration> + (%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 + (raise-exception + (formatted-message + (G_ "option ~a not found for mpv-profile-configuration") key))) + (if (maybe-value-set? val) + (if ((profile-option-type-check opt) val) + (hashq-set! new key (cons val + (profile-option-serializer opt))) + (raise-exception + (formatted-message + (G_ "invalid mpv configuration for ~a: ~a~%") + key val))) + (hashq-remove! new key))) + (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) + (string<? (symbol->string (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-mpv/mpv-profile-configurations _ profiles) + #~(string-append + #$@(map (match-lambda + ((name . config) + #~(string-append + #$(format #f "[~a]~%" name) + #$(serialize-mpv-profile-configuration _ config)))) + profiles))) +(define (mpv/mpv-profile-configurations? alist) + (and (list? alist) + (every (match-lambda + (((? symbol?) . (? mpv-profile-configuration?)) #t) + (_ #f)) + alist))) + +(define (serialize-mpv/extra _ value) + (if value + #~(string-append #$value + ;; Ensure the extra content ends in a new line. + #$(if (string-suffix? "\n" value) + "" "\n")) + #~"")) +(define (mpv/extra? val) + (or (string? val) + (gexp? val))) + +(define-record-type <home-mpv-configuration> + (%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 (mpv-profile-configuration? global) + (raise-exception + (formatted-message + (G_ "global must satisfy mpv-profile-configuration?")))) + (unless (mpv/mpv-profile-configurations? profiles) + (raise-exception + (formatted-message + (G_ "profiles must be an alist of mpv-profile-configuration?")))) + (unless (or (not extra-config) (mpv/extra? extra-config)) + (raise-exception + (formatted-message + (G_ "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-mpv/mpv-profile-configurations + 'profiles + (home-mpv-configuration-profiles cfg)) + #$(serialize-mpv/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."))) diff --git a/gnu/local.mk b/gnu/local.mk index e6ece8cc48..d132e79ad2 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -113,6 +113,7 @@ GNU_SYSTEM_MODULES = \ %D%/home/services/mail.scm \ %D%/home/services/media.scm \ %D%/home/services/messaging.scm \ + %D%/home/services/mpv.scm \ %D%/home/services/music.scm \ %D%/home/services/pm.scm \ %D%/home/services/shells.scm \ -- 2.49.0
andrew@HIDDEN, gabriel@HIDDEN, hako@HIDDEN, janneke@HIDDEN, ludo@HIDDEN, maxim.cournoyer@HIDDEN, tanguy@HIDDEN, guix-patches@HIDDEN
:bug#74801
; Package guix-patches
.
Full text available.Received: (at 74801) by debbugs.gnu.org; 12 May 2025 07:11:24 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon May 12 03:11:24 2025 Received: from localhost ([127.0.0.1]:49550 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1uENJs-0006ch-6R for submit <at> debbugs.gnu.org; Mon, 12 May 2025 03:11:24 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:51622) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1uENJo-0006cQ-QV for 74801 <at> debbugs.gnu.org; Mon, 12 May 2025 03:11:21 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <ludo@HIDDEN>) id 1uENJg-0000Y0-IG; Mon, 12 May 2025 03:11:12 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-Version:Date:References:In-Reply-To:Subject:To: From; bh=TD8GEeDkIDGHFZRKfis2eUZguVzzuBKginRPw2GWDG4=; b=bYR5bisnn7JiP0XZmR+6 4cTrZEiFiNnJLYkC6FSSqRK6fKxCugf9RlZbywWQrudqFjOtPgSm+d1AK3FoN6fPz8cligT9X0AII SDh0N+KK2eqTSYSMw7ZbOWrDvdzKVW4vYk7IPzK05+La01xUARoPm+RZO84x201S/g6u2cKqu1ogC 5xfSqXT9YFzmGcVR5sDHIghdygnhC1MfZZSWipLPKFG1kRC5uXcxuXnsbDzqx5SVodCROG64jUSUL dB1InSUL5ucppaIzLIGyZIbMFzzBSyLdsJeAUKPr0Fipp76bqWxOlc6T2DRCO2dcTkqOs8mJSWgK/ F5G7KJHSuVKdVQ==; From: =?utf-8?Q?Ludovic_Court=C3=A8s?= <ludo@HIDDEN> To: Tomas Volf <~@wolfsden.cz> Subject: Re: bug#74801: [PATCH] gnu: home: services: Add home-mpv-service-type. In-Reply-To: <3f2fe502b4e02c3c9d2a0890da8ed46b37598ce9.1746786834.git.~@wolfsden.cz> (Tomas Volf's message of "Fri, 9 May 2025 12:33:54 +0200") References: <29d3cc661a49b7bef951041f8ec3c7600c9777a7.1733953822.git.~@wolfsden.cz> <3f2fe502b4e02c3c9d2a0890da8ed46b37598ce9.1746786834.git.~@wolfsden.cz> Date: Mon, 12 May 2025 09:10:58 +0200 Message-ID: <87frha5mnx.fsf_-_@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.2 (/) X-Debbugs-Envelope-To: 74801 Cc: Tanguy Le Carrour <tanguy@HIDDEN>, Maxim Cournoyer <maxim.cournoyer@HIDDEN>, Gabriel Wicki <gabriel@HIDDEN>, Andrew Tropin <andrew@HIDDEN>, Hilton Chain <hako@HIDDEN>, 74801 <at> debbugs.gnu.org, Janneke Nieuwenhuizen <janneke@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -3.3 (---) Hi, Tomas Volf <~@wolfsden.cz> writes: > This commit adds a new service type to generate configuration file for th= e mpv > media player. > > * gnu/home/services/mpv.scm: New file. > * gnu/local.mk (GNU_SYSTEM_MODULES): Register it. > * doc/guix.texi (mpv Media Player): Document it. > > Change-Id: I2deb44799a28047cb5d67da97dc6007a9df873af [...] > v3: > - Drop majority of commit message. (I am not sold on this.) > - Use ? suffix for boolean options. > - Include link to the updater script. [...] > + #:global (make-mpv-profile-configuration > + #:fullscreen #t Are we missing a question mark? > + #:profiles `((fullscreen . ,(make-mpv-profile-configuration > + #:fullscreen #t)))) Here also. Otherwise LGTM. Thanks, Ludo=E2=80=99.
guix-patches@HIDDEN
:bug#74801
; Package guix-patches
.
Full text available.Received: (at 74801) by debbugs.gnu.org; 12 May 2025 04:57:16 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Mon May 12 00:57:16 2025 Received: from localhost ([127.0.0.1]:49069 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1uELE3-0007tR-Mn for submit <at> debbugs.gnu.org; Mon, 12 May 2025 00:57:16 -0400 Received: from out-174.mta1.migadu.com ([2001:41d0:203:375::ae]:35857) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from <andrew@HIDDEN>) id 1uELE0-0007t3-Fh for 74801 <at> debbugs.gnu.org; Mon, 12 May 2025 00:57:13 -0400 X-Report-Abuse: Please report any abuse attempt to abuse@HIDDEN and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=trop.in; s=key1; t=1747025825; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=Sb9yeRzY0CbZtcLS0ytADkL+Pz3EFGBg5IhiBTOYXM8=; b=NtPs/O6uAAnkEbYE3foGGsWpf8Q2USieskZM6rohjz7Grv273B3eoFGr7aiXkuQezgxM7B LZyJ+M0o+VOCt5LLxgOGjixNDQ4EJenv2rMp5m2xZM5LDJ4kfnajQoKT7I0GQthasTQrUO +wW8U8bOwEdpOqy599nRLUTFM1wxSG7p6RtZ8S6eXD8C0sTBEqaupD7bTd7HyFbyCqB1lF I+4dK9geOTZShDDE3cQfXMwak4/XaRkBSeQysuObHOFhfdVuK4GDVgyoRJJV5bcIvuyrbI uwnUsRLeLkIJHIaip0V6AIXLjs22NwzCblB+TmB5+0aZmfxguC2AHgKPqC0CIA== From: Andrew Tropin <andrew@HIDDEN> To: Tomas Volf <~@wolfsden.cz> Subject: Re: [bug#74801] [PATCH v2] gnu: home: services: Add home-mpv-service-type. In-Reply-To: <87jz6nw6yg.fsf@HIDDEN> References: <29d3cc661a49b7bef951041f8ec3c7600c9777a7.1733953822.git.~@wolfsden.cz> <ea877c6277825b1fc87a6d15c581975ef1a81167.1746204040.git.~@wolfsden.cz> <87v7qevzt0.fsf@HIDDEN> <87tt5xxuq1.fsf@HIDDEN> <87o6w2manp.fsf@HIDDEN> <875xi7zwyg.fsf@HIDDEN> <87jz6nw6yg.fsf@HIDDEN> Date: Mon, 12 May 2025 11:56:55 +0700 Message-ID: <87wmam2zqg.fsf@HIDDEN> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Migadu-Flow: FLOW_OUT X-Spam-Score: -0.0 (/) X-Debbugs-Envelope-To: 74801 Cc: Ludovic =?utf-8?Q?Court=C3=A8s?= <ludo@HIDDEN>, 74801 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -1.0 (-) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable On 2025-05-11 16:35, Tomas Volf wrote: > Hi Andrew, > > Andrew Tropin <andrew@HIDDEN> writes: > >> I would also suggest to keep auto-generated schemas and docs in separate >> files, so they can be easily re-generated without copy-pasting or other >> manual interventions. > > Do not worry, I am a lazy creature, so the updater script takes care of > that for you: =F0=9F=98=84=F0=9F=91=8D > > --8<---------------cut here---------------start------------->8--- > $ ./generate-mpv-configuration 0.39 src/guix/gnu/home/services/mpv.scm > * Will update to version 0.39 > * Will update file src/guix/gnu/home/services/mpv.scm > Indenting region... > Indenting region...done > Mark set > * Done. > --8<---------------cut here---------------end--------------->8--- > > This takes care of updating both the mpv.scm file and the list of the > options in the manual. No copy&pasting or manual interventions > required. All you need to do is commit the result and send the patch. =2D-=20 Best regards, Andrew Tropin --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEKEGaxlA4dEDH6S/6IgjSCVjB3rAFAmghf5cACgkQIgjSCVjB 3rBysg/+IlQ/KW9pVjeZujZZeruYlldyy4blU4E6zrrypz262TsiLokn6nWP/O2Q tzfBMfbdBhMHFPbQP1svcbIB+Bzzb9De0y31DBttKLVYeUX/F65Hg1di7rz7ynPT AfTBtwCEEOAZS8iOzOB2JCeABd/nbJywzP34OisomcJXxlz1nxLapNwcjPjeRlOF moIa2GPpmeVtLrOkgFU+Qa2Japxewq9Q9aO6JltyMltlKJxpdbEIL869uw+wwZ2F QUQaiAqD7aJdd9sN+bH8lKiAHvVImEzccSVYsDqL1jHbE74P0fL2W/Lm37IDYint GDqjeVHutiBPLFmiFlLeQqSFIUDT6dkzVzoMQuL/pStIitUFjQxD11Vw3VWfp/4y Pl/E07HrXOw1DPD1Y6zMyJYzqaW8jBE2NYfOWicGGpT70fHhA5vkXf6i+FJVyr2F /SvIH0SNBw2suRIpFhj16FPbcS+kGzPj+aMbiX6Lp0flBn8gmcJr0AkLQSN4DYnB +9YQexGlP3Vs5IVu0+O6nOyeZ6hzND7Amf3+zuZ8LiwMCjPNOJ/0YM8X2imqNIw0 WEfvhteAP+3nG4klPaJQu9AAGYkdI9pLkPcS+EmsVRhcyr7iOvhZquKEJwM4KX4A 9CQGcUqt0H4rpv2qvvREkwMqwZeuv6EhvlP/g+oituWDSNEcQg8= =ZmSR -----END PGP SIGNATURE----- --=-=-=--
guix-patches@HIDDEN
:bug#74801
; Package guix-patches
.
Full text available.Received: (at 74801) by debbugs.gnu.org; 11 May 2025 14:35:57 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sun May 11 10:35:57 2025 Received: from localhost ([127.0.0.1]:36462 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1uE7mW-0001d4-RF for submit <at> debbugs.gnu.org; Sun, 11 May 2025 10:35:57 -0400 Received: from wolfsden.cz ([37.205.8.62]:34622) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from <~@wolfsden.cz>) id 1uE7mU-0001cP-0Z for 74801 <at> debbugs.gnu.org; Sun, 11 May 2025 10:35:55 -0400 Received: by wolfsden.cz (Postfix, from userid 104) id 2C167385C42; Sun, 11 May 2025 14:35:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail; t=1746974152; bh=4Paj/4U2rB7vOL1B/a1tqXBToo0DhaapsOxPXvGlTbM=; h=From:To:Cc:Subject:In-Reply-To:References:Date; b=fB8TtiuuoOMiv1191/35bFAygaOMl0qEvg+de9/DrrQFRIiXq+0n+guaCjFV0Q5+U lnEKBF4ZpM7FbqwCdTaW4EM+Rqk8CiI2xLKY7mTclHfqDiY4YkI+lbe9cS0tTq4RW2 QZjqhap4OSNlMWetSJt1AYdiTWINIYUmWvvRWEA+eaFQGshfB5pGcQ/nkrDjFsD4/O Keb1Li6OYx0byDiv6eqnbjG1FRqSYsBSJTBPAji25tqfvNidlR45jnlVyRlVYy9nuj 3a9WAQHinJ2SKyeFaEYaFcUz2+yRMG4oNDcIAdcbOuXRhfCF6fuTeTI3vP6w6C0sPq yFYbRuB14V8v85LL4W90sn02J9Dx6vUNmWweQM9bmUnSCjbsL9GXxg5emgDZaVngdm diXdGPG0V2EhT2eXTCsK1UouD/TjnC/yo1+JklXxVz3ZmBLbe9M53a7P9o6Y+XgbJS B4nELchMf78dc1kOj6Dqyx+kB/UHNIWw2RBE7tgu6e1JPqLpLWG/MLqakzY9upI0Kz 7i54dBDHimVSOZd7EtUGMYfX0TJBxh0Tg+AI71G6/mbMxNvIntVcZAoMHfi9t7xcWb BHE8zPhrX9vo5K+YE8lbhFWnZh8i7T1Q5XkEXLUGjRcP51smWqE6h1z5HbfI+GLFX+ yUqDvG3HLpXHDfD7UWUbVR2Y= X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on wolfsden X-Spam-Level: X-Spam-Status: No, score=-3.1 required=5.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 Received: from localhost (37-48-42-83.nat.epc.tmcz.cz [37.48.42.83]) by wolfsden.cz (Postfix) with ESMTPSA id 2D6EC385156; Sun, 11 May 2025 14:35:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail; t=1746974151; bh=4Paj/4U2rB7vOL1B/a1tqXBToo0DhaapsOxPXvGlTbM=; h=From:To:Cc:Subject:In-Reply-To:References:Date; b=nJ34nf2Qc8e22wYjAhvUdQoiBBHItzUw1WHmXvWr+UX3DiwxTGwfyxm0venxcudJw F0xgUFsTR3Sg0UweuFqRQArd6dpHtOMh5s1hGwzUSdA8QJEBbKMTmislD4kZCvenXB 0wQo68B3K/qr0q5f9i5U9YREJ5wjjTRzx+phtmwTUS4W/IiI2TrgHAOdytMzw8ale8 qdsruUwIK3FAFdaZdDeYaU8sWkt/Fhh9ggE0GFTWewvqoXzZjGax62habJNCfSXA3n LyJyLdQe+hHAnsg5OwVqFyBxInFCILF68zKCxjdVveRVVtEqNYdYOmkLPqc4r1JvAa Wb0aVde8iZVZ/7wA5w8CC4fRXYjexUkN2iwAmFnL8jT7/eaVKWFuJga7L5nAk+EEce NQ1anM4SMXxROhSAWVD4QfHyept09NTWwhkrIiWExER2mRxz09FNCGk7mlNpXSQvMp 7UEpDO4HtBQ4qZQGfA5b4oeUZoEsj5M1MHLG6IDB5ZUML4e9D6INCy8rj3erbIRnuL nNel8tac+rb1v0SrL46PrhCA7ogXcEHqNdQbFgrTubfKMHQGwbPYjSx/lzof7DERH5 vtn5D3pIrIvcWW06bZ7/jDUN3ZhAByoQOtsXcLUTsG9+N+iKXDk1Y0FuQ8u2rBK40B mM0WSf+BqybXE4fZ7CP6IswM= From: Tomas Volf <~@wolfsden.cz> To: Andrew Tropin <andrew@HIDDEN> Subject: Re: [bug#74801] [PATCH v2] gnu: home: services: Add home-mpv-service-type. In-Reply-To: <875xi7zwyg.fsf@HIDDEN> (Andrew Tropin's message of "Sun, 11 May 2025 09:45:59 +0700") References: <29d3cc661a49b7bef951041f8ec3c7600c9777a7.1733953822.git.~@wolfsden.cz> <ea877c6277825b1fc87a6d15c581975ef1a81167.1746204040.git.~@wolfsden.cz> <87v7qevzt0.fsf@HIDDEN> <87tt5xxuq1.fsf@HIDDEN> <87o6w2manp.fsf@HIDDEN> <875xi7zwyg.fsf@HIDDEN> Date: Sun, 11 May 2025 16:35:51 +0200 Message-ID: <87jz6nw6yg.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 74801 Cc: Ludovic =?utf-8?Q?Court=C3=A8s?= <ludo@HIDDEN>, 74801 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -1.0 (-) Hi Andrew, Andrew Tropin <andrew@HIDDEN> writes: > I would also suggest to keep auto-generated schemas and docs in separate > files, so they can be easily re-generated without copy-pasting or other > manual interventions. Do not worry, I am a lazy creature, so the updater script takes care of that for you: --8<---------------cut here---------------start------------->8--- $ ./generate-mpv-configuration 0.39 src/guix/gnu/home/services/mpv.scm * Will update to version 0.39 * Will update file src/guix/gnu/home/services/mpv.scm Indenting region... Indenting region...done Mark set * Done. --8<---------------cut here---------------end--------------->8--- This takes care of updating both the mpv.scm file and the list of the options in the manual. No copy&pasting or manual interventions required. All you need to do is commit the result and send the patch. Tomas -- There are only two hard things in Computer Science: cache invalidation, naming things and off-by-one errors.
guix-patches@HIDDEN
:bug#74801
; Package guix-patches
.
Full text available.Received: (at 74801) by debbugs.gnu.org; 11 May 2025 02:46:16 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Sat May 10 22:46:16 2025 Received: from localhost ([127.0.0.1]:54757 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1uDwhk-0000RV-AV for submit <at> debbugs.gnu.org; Sat, 10 May 2025 22:46:16 -0400 Received: from out-189.mta0.migadu.com ([91.218.175.189]:43170) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from <andrew@HIDDEN>) id 1uDwhg-0000RH-UL for 74801 <at> debbugs.gnu.org; Sat, 10 May 2025 22:46:13 -0400 X-Report-Abuse: Please report any abuse attempt to abuse@HIDDEN and include these headers. DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=trop.in; s=key1; t=1746931565; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=EtD0SLtwIwipl1ADC35aTVgZnJW6evA5c3+NkYSwIqo=; b=eYfB8xrv80ivnjYHfAZU+9GccatgkNHhtohM5NEEGqSXIHmpQUJm1UneWdPohfmkZJgXOw bYgdVCrqlPs+FY1+GSeQIfhBQNnaRZaRSqOzrb6sq9F0YctWsLt3eTFyNeZ2UvXnkvPakl AHAgvNp29RUY7YS4vZHycK5wtfqL2Zlxk7n2Aivz55kEQ+tLwUCAUI6eRYRivyZ1iRukPi /4R0CaT+s1QOvVA9eu51Xd6poJOKbthQ5ULGPgQ8gOK70mrn1si6XEy4EQRUtKnONoxBgj 1xmaY4cv/a2kwFV6e8l7zfJaRdPfPQNXax5QNFuB52bcAH/c9fgqreNjLsIB1Q== From: Andrew Tropin <andrew@HIDDEN> To: Ludovic =?utf-8?Q?Court=C3=A8s?= <ludo@HIDDEN>, Tomas Volf <~@wolfsden.cz> Subject: Re: [bug#74801] [PATCH v2] gnu: home: services: Add home-mpv-service-type. In-Reply-To: <87o6w2manp.fsf@HIDDEN> References: <29d3cc661a49b7bef951041f8ec3c7600c9777a7.1733953822.git.~@wolfsden.cz> <ea877c6277825b1fc87a6d15c581975ef1a81167.1746204040.git.~@wolfsden.cz> <87v7qevzt0.fsf@HIDDEN> <87tt5xxuq1.fsf@HIDDEN> <87o6w2manp.fsf@HIDDEN> Date: Sun, 11 May 2025 09:45:59 +0700 Message-ID: <875xi7zwyg.fsf@HIDDEN> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="=-=-="; micalg=pgp-sha512; protocol="application/pgp-signature" X-Migadu-Flow: FLOW_OUT X-Spam-Score: -0.7 (/) X-Debbugs-Envelope-To: 74801 Cc: Tanguy Le Carrour <tanguy@HIDDEN>, Maxim Cournoyer <maxim.cournoyer@HIDDEN>, Gabriel Wicki <gabriel@HIDDEN>, Hilton Chain <hako@HIDDEN>, 74801 <at> debbugs.gnu.org, Janneke Nieuwenhuizen <janneke@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -1.7 (-) --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable On 2025-05-09 10:49, Ludovic Court=C3=A8s wrote: > Hello, > > Tomas Volf <~@wolfsden.cz> writes: > >> Ludovic Court=C3=A8s <ludo@HIDDEN> writes: > > [...] > >>> Could you include the code you used to generate the options? >> >> I definitely *could* do that. While the code is maybe a bit ugly, it is >> not intended to be kept secret. Couple of questions though. >> >> 1. Where should I put it? Somewhere in etc directory? Or next to the >> service, so e.g. gnu/home/services/mpv-refresh.sh? >> >> 2. It has external dependencies, some of which are packaged in Guix >> (emacs, emacs-paredit) and some of them are not (guile-wolfsden). Is >> that a problem? Do I need to rewrite it to use just packaged >> libraries and programs? > > Well, in that case, maybe just include the URL in the script in the > comment (=E2=80=9CGenerated by =E2=80=A6=E2=80=9D). > > Had it been pure Scheme (possibly based on (guix read-print) rather than > Emacs), we could have included it straight in the code, as is done for > Dovecot IIRC. Someone updating it could use the relevant procedures at > the REPL to re-generate the option definitions. I would also suggest to keep auto-generated schemas and docs in separate files, so they can be easily re-generated without copy-pasting or other manual interventions. =2D-=20 Best regards, Andrew Tropin --=-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQIzBAEBCgAdFiEEKEGaxlA4dEDH6S/6IgjSCVjB3rAFAmggD2cACgkQIgjSCVjB 3rDrzA//fp5tEwT66+1tFt751r4T2dTGCmumeMcsS4GEqgDy1PCD2qOGXBfzRUxW BygGgto9OcuvkyVLjGJ+3o1AE9t2tvksL1eOYYkmf05JMNn3gbhvsGhUH68yJNpP LUx1h1bToJYZLei0cdzZU2CprDgQ5A+VDeVyHoQAnLT6UjG6e/+7HJW34N7O6tT5 ZpimJx7oSd8v471ateTG+3sUuSpQh0ii6yeDnyiFcYQ9JNuXy2yBdqLB2yRek4Bq OgJjb3Jp7bZah8xV/SKLx4Q5Xcl4qMyCbG4oFM8ED7PFXBICDtCDiYKjGw4yq2s+ Z2Dd1YfkDMaO5h5oVuXh8oAZfD3o2vtoS9hugy7CrRWZDIU1CjogPLKyLkTPs12T JmLDPfE3bM4PZIgOCwt52hFsmZvQ9uOGN277VJVZwgb63SUhWCGWgjnd89E0gxrx h4n9MpA7xC9CSge0xql1Ya6cYe9H+1xmOi3LGn7AVivz1UpJz3ebMTo+VU0JkYTw 4er0+3bpZ285KKM/tYS3bMQ06ewvGD5pv0rn04rpYXoSL8g0EL8uFuzg6f//13wa L4QKpcfaT1oVzPBqWUd7S8NilCCM+i+XaB/L+XS4jVnxa+XlCSyS8BulsQfTFX/y vpRf2txWhiAjl5uL4VJF4+kSbyFwmV60ndgXvHz1ejj96Dl8j84= =054J -----END PGP SIGNATURE----- --=-=-=--
guix-patches@HIDDEN
:bug#74801
; Package guix-patches
.
Full text available.Received: (at 74801) by debbugs.gnu.org; 9 May 2025 10:39:34 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 09 06:39:34 2025 Received: from localhost ([127.0.0.1]:35903 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1uDL8f-0004C3-Qf for submit <at> debbugs.gnu.org; Fri, 09 May 2025 06:39:34 -0400 Received: from wolfsden.cz ([37.205.8.62]:36756) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from <~@wolfsden.cz>) id 1uDL8b-0004Bn-OE for 74801 <at> debbugs.gnu.org; Fri, 09 May 2025 06:39:30 -0400 Received: by wolfsden.cz (Postfix, from userid 104) id C6DBC37ACC5; Fri, 9 May 2025 10:39:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail; t=1746787168; bh=1oZwlvMYDWB2ReGFNLkc8c/Erh7bDUyfiYSKnkWJcYo=; h=From:To:Cc:Subject:In-Reply-To:References:Date; b=KaQg0IYaMGYdMLCqkEUJGe7jvyw5dtLAqloeTaK9/d2gIoLnlyVsaxyhw37hj6kD3 ixfKmE6m+Nz3O2Kc3Zd0ijZH7cAIYEJkmQOZKns5EZq+cU/Vk+0EH3wi50/ObRXNNC BISk7GXB/sJ/kLamxXo+sQrsR2+wYji0+mdrS7GHoSF6DIAkiy3+DlbPaZ02slznzj PlJfdr4c6lj0Oy1qPT7RJOP/b898T4w6dUU/n0A+H35aiHr6uz5OqIrsC5UZCvgoe4 SIru2TxrC8RlaaaQinYvPTn6t59AkAgJ9KONIayksBwFm8rgsf/NIVHPEiFL17Drv6 HQV7W5NgXv/9H8/13FTnlvrTxDAMwue3l9wNUtYYl4EMUxWTmvri0q/LZdBu2mce4e OwBlFH57GGVKPZQXtgzTvqBXXKdu4V8sAHrfY2YC1WQwBbKfa5hK2me5pJFHNePBLl w/tnziXD+wWzoh30y2aMnX0jTnWvS6uaKQGO8rSLjoRnZajET5CCY+D4w6ElZU6r2a T4nIZphZ/2VY/Tbg+Q/lAeBqEVMGo4HvW1pk9058by5amusBTgwbTdxvgFgQS1MV1t epFakZ+HqJqNmdjK/p68G/rGPQDh33cSUhGdqzZZWCY8aoWQiJl16Qraiw0kKiE17l IrGHGe7hGgzrkleLrZsLLpxY= X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on wolfsden X-Spam-Level: X-Spam-Status: No, score=-3.1 required=5.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 Received: from localhost (unknown [128.0.188.242]) by wolfsden.cz (Postfix) with ESMTPSA id 7894F379DFC; Fri, 9 May 2025 10:39:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail; t=1746787168; bh=1oZwlvMYDWB2ReGFNLkc8c/Erh7bDUyfiYSKnkWJcYo=; h=From:To:Cc:Subject:In-Reply-To:References:Date; b=KaQg0IYaMGYdMLCqkEUJGe7jvyw5dtLAqloeTaK9/d2gIoLnlyVsaxyhw37hj6kD3 ixfKmE6m+Nz3O2Kc3Zd0ijZH7cAIYEJkmQOZKns5EZq+cU/Vk+0EH3wi50/ObRXNNC BISk7GXB/sJ/kLamxXo+sQrsR2+wYji0+mdrS7GHoSF6DIAkiy3+DlbPaZ02slznzj PlJfdr4c6lj0Oy1qPT7RJOP/b898T4w6dUU/n0A+H35aiHr6uz5OqIrsC5UZCvgoe4 SIru2TxrC8RlaaaQinYvPTn6t59AkAgJ9KONIayksBwFm8rgsf/NIVHPEiFL17Drv6 HQV7W5NgXv/9H8/13FTnlvrTxDAMwue3l9wNUtYYl4EMUxWTmvri0q/LZdBu2mce4e OwBlFH57GGVKPZQXtgzTvqBXXKdu4V8sAHrfY2YC1WQwBbKfa5hK2me5pJFHNePBLl w/tnziXD+wWzoh30y2aMnX0jTnWvS6uaKQGO8rSLjoRnZajET5CCY+D4w6ElZU6r2a T4nIZphZ/2VY/Tbg+Q/lAeBqEVMGo4HvW1pk9058by5amusBTgwbTdxvgFgQS1MV1t epFakZ+HqJqNmdjK/p68G/rGPQDh33cSUhGdqzZZWCY8aoWQiJl16Qraiw0kKiE17l IrGHGe7hGgzrkleLrZsLLpxY= From: Tomas Volf <~@wolfsden.cz> To: Ludovic =?utf-8?Q?Court=C3=A8s?= <ludo@HIDDEN> Subject: Re: [bug#74801] [PATCH v2] gnu: home: services: Add home-mpv-service-type. In-Reply-To: <87o6w2manp.fsf@HIDDEN> ("Ludovic =?utf-8?Q?Court=C3=A8s=22'?= =?utf-8?Q?s?= message of "Fri, 09 May 2025 10:49:14 +0200") References: <29d3cc661a49b7bef951041f8ec3c7600c9777a7.1733953822.git.~@wolfsden.cz> <ea877c6277825b1fc87a6d15c581975ef1a81167.1746204040.git.~@wolfsden.cz> <87v7qevzt0.fsf@HIDDEN> <87tt5xxuq1.fsf@HIDDEN> <87o6w2manp.fsf@HIDDEN> Date: Fri, 09 May 2025 12:39:28 +0200 Message-ID: <87ecwyxe3j.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 74801 Cc: 74801 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -1.0 (-) Ludovic Court=C3=A8s <ludo@HIDDEN> writes: > [..] > > Well, in that case, maybe just include the URL in the script in the > comment (=E2=80=9CGenerated by =E2=80=A6=E2=80=9D). Link included and v3 sent. :) Tomas --=20 There are only two hard things in Computer Science: cache invalidation, naming things and off-by-one errors.
guix-patches@HIDDEN
:bug#74801
; Package guix-patches
.
Full text available.Received: (at 74801) by debbugs.gnu.org; 9 May 2025 10:39:04 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 09 06:39:04 2025 Received: from localhost ([127.0.0.1]:35889 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1uDL87-00049q-6f for submit <at> debbugs.gnu.org; Fri, 09 May 2025 06:39:04 -0400 Received: from wolfsden.cz ([37.205.8.62]:48600) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from <~@wolfsden.cz>) id 1uDL7z-00049O-4k for 74801 <at> debbugs.gnu.org; Fri, 09 May 2025 06:38:56 -0400 Received: by wolfsden.cz (Postfix, from userid 104) id 4E55A37A457; Fri, 9 May 2025 10:38:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail; t=1746787129; bh=jEY+/kHFOapTKKG6bget3EcClUO0n9+J1stJ7QZB4mY=; h=From:To:Cc:Subject:Date; b=Fm5/kW02zUcXdgopZhGP+QubHZOwnjr7lF7MwoLUOI9sPHIlazM+pOIDCRZN1ALa8 odhQq0Ah+XG4vmD3ijXsFhR+hNwhL2rHytNM3z2STJjI+LZmxZAf0oopHxTtX78BI3 /iX/dDWiHS/Mw6ttDmvgWZBOWKwW6QqmJdo5OsDzP+5FZbFvixJkc5e0rOQLTInMiY vySqRdkLLaJ01nBebUX48jemgJAe1QJg5TcmIUW/BmFAUhSZU+bRUsiMfB6I4+HcPO 5zIeLanGJYiruCxlsja2F5ZuCS9DIQMuV+CAZDAm6j580cViDLrodaN+ocGhrXurNJ uiFAqy1+k4UZ0r3T1o/AxCMmS/5U0Id12tNkl+0z57nngjbvSeXclST4GPq8fsC8hY nAbZV4rSzu8o9s1h0q4U1f2EJ8kgtwYHRWsPSR9q8GaQ+2FLoSTa2/jFPEiossM9b5 yyxrKBIZ3kienJGJhI40Sb2rwM5bRBZGuYdO2VvECJbkxd7pVQNbywNg0qBzGX4MAd FLfgzxuRn0vHUYVKyoEWCKmDe5Z/pdOLIpGYI3r6zBJteJlpOfiHyvk/dh2/Y/9dhZ bVSLbjPkbbW4fsGM/dBoGT3MQ9GA1FsrTp8RW/qHvBVIcKPky3zu2+6Oan4Xu25aMB X3ELT9VLrjWo7vFp/4yTFuVs= X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on wolfsden X-Spam-Level: X-Spam-Status: No, score=-3.1 required=5.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.6 Received: from localhost (unknown [128.0.188.242]) by wolfsden.cz (Postfix) with ESMTPSA id EA1B537A456; Fri, 9 May 2025 10:38:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail; t=1746787125; bh=jEY+/kHFOapTKKG6bget3EcClUO0n9+J1stJ7QZB4mY=; h=From:To:Cc:Subject:Date; b=jYrFkPylB5XUVjNz18RC+EfOCYPr58sauzkkzD31Ax4NyfDxvIgwlDX1Q38CJpblX JNzipDYiAD/N0UAd7oxJTvD3LuGzm3YdE6MENi4HUfs3XtNI+OfpabnHL/arfckQoS 6vPYHU3Czarjkj4XrN3uDom125FgJz2iNi+XcGQ395kXlWz1TwS+rmNCJT8N30Il8X D/WtbokYnhkJGr6iJejCkTFcDBBgL6+fQekehoXl3WKWShEHNzKleamED3Wz2qLnq0 zToscjyTGX7A40j2skPdvjJkd98eW/nVLLC7yAVc+HakYBbFFWG8pYLC/lVdT4Joan N36nLDCDPjFh1fUjgjZfPEKj5L1Gbv3WZeiF6slabZsU9abDSHLvkDyaB6lLOFtjZX coqZUJzeGaL2vnCT7Yd5LmqFmwIneTRDuNkISjcTZUOhtCJk72H/0V3Q/Hmo+dUrN3 lGDiyQzpf5cH9uQr04qDhNkX+I6GbyJNIq+WItSa7sqyzA4ewgroDtDKRT/zm2soA6 4O2x9q+QDF212427WSpO7jRtsGln/UxRck9cZEe0uMyN84XmnV6RkJFQp++Q2THj2O hqNMW88YdgFy5BeNIx4xJXdmC/+xHX0TgH2ALsfVUKXHtHCY3FpfPq+9m8kyZMJ1xE RY+fEf+ipJX+UO6qoxfeTQQ8= From: Tomas Volf <~@wolfsden.cz> To: 74801 <at> debbugs.gnu.org Subject: [PATCH v3] gnu: home: services: Add home-mpv-service-type. Date: Fri, 9 May 2025 12:33:54 +0200 Message-ID: <3f2fe502b4e02c3c9d2a0890da8ed46b37598ce9.1746786834.git.~@wolfsden.cz> X-Mailer: git-send-email 2.49.0 MIME-Version: 1.0 X-Debbugs-Cc: Andrew Tropin <andrew@HIDDEN>, Gabriel Wicki <gabriel@HIDDEN>, Hilton Chain <hako@HIDDEN>, Janneke Nieuwenhuizen <janneke@HIDDEN>, Ludovic Courtès <ludo@HIDDEN>, Maxim Cournoyer <maxim.cournoyer@HIDDEN>, Tanguy Le Carrour <tanguy@HIDDEN> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 74801 Cc: Tomas Volf <~@wolfsden.cz> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -1.0 (-) This commit adds a new service type to generate configuration file for the mpv media player. * gnu/home/services/mpv.scm: New file. * gnu/local.mk (GNU_SYSTEM_MODULES): Register it. * doc/guix.texi (mpv Media Player): Document it. Change-Id: I2deb44799a28047cb5d67da97dc6007a9df873af --- Originally I attempted to use Guix Records (via define-configuration) for this, but ran into the bug #74748, so I had to switch to procedures instead. The usage is (hopefully) sufficiently described in the documentation. When the bug is resolved, I will update it to use define-configuration instead. The full list of supported options is documented, however I decided to *not* document types and purpose for each individual fields. While I had mostly working prototype to extract the documentation from mpv, once I realized it would be few 10k of lines added, I decided it is not worth it. It would bloat the .texi file (by more than 50%), be hard to maintain and, in my opinion, would not provide enough value to justify that. The current version seems like sane middle ground. Option to configure inputs (for mpv) will come later in a separate patch. v3: - Drop majority of commit message. (I am not sold on this.) - Use ? suffix for boolean options. - Include link to the updater script. doc/guix.texi | 429 ++++++ gnu/home/services/mpv.scm | 2751 +++++++++++++++++++++++++++++++++++++ gnu/local.mk | 1 + 3 files changed, 3181 insertions(+) create mode 100644 gnu/home/services/mpv.scm diff --git a/doc/guix.texi b/doc/guix.texi index 889eab2ab3..f8cb759948 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -50747,6 +50747,435 @@ Media Home Services @end table @end deftp +@c This is ugly, but upstream does *not* capitalize the ``m'' even when +@c at the beginning of a sentence. So let us follow the branding. +@node mpv Media Player +@subsection mpv Media Player + +@cindex mpv, Home Service +@cindex mpv, configuration +Configuring the @uref{https://mpv.io/, mpv media player} can be somewhat +daunting task, due to the sheer amount of options available, especially +if one wants to be able to inherit the configuration in their code. The +@code{home-mpv-service-type} is provided to help with that problem. +When the service is added to your home environment, file based on the +passed configuration is generated and placed into the correct location. + +Due to the bug #74748, it does not use Guix Records to represent the +configuration, but uses keyword arguments to achieve similar result. +Example follows: + +@lisp +(service home-mpv-service-type + (make-home-mpv-configuration + #:global (make-mpv-profile-configuration + #:fullscreen #t + #:alang '("jpn" "eng")))) +@end lisp + +@defvar home-mpv-service-type +This is the type of the mpv home service, whose value is a +@code{home-mpv-configuration} object. +@end defvar + +@deffn {Procedure} make-home-mpv-configuration +Return a new instance of @code{home-mpv-configuration}. Available +keyword arguments are: + +@table @asis +@item @code{inherit} (default: @code{#t}) +Inherit fields from an another instance. + +@item @code{global} (default: @code{(make-mpv-profile-configuration)}) +The global configuration preceding all profiles. + +@item @code{profiles} (default: @code{()}) +An alist containing configuration for any additional profiles to include +in the configuration file. + +@lisp +(make-home-mpv-configuration + #:profiles `((fullscreen . ,(make-mpv-profile-configuration + #:fullscreen #t)))) +@end lisp + +@item @code{extra-config} (default: @code{#f}) +Additional content to include in the configuration file. It is placed +at the end of the file. + +@end table +@end deffn + +@deffn {Procedure} make-mpv-profile-configuration +Return a new instance of @code{mpv-profile-configuration}. As above, it +also supports the @code{#:inherit} argument. Additionally it supports +keyword arguments named after the options of @command{mpv}. Hence +@option{--fullscreen} (or @code{fullscreen} in the configuration file) +becomes @code{#:fullscreen}. + +Few options are using their aliases instead. @option{audio} instead of +@option{aid}, @option{video} instead of @option{vid}, @option{sub} +instead of @option{sid}, @option{screenshot-directory} instead of +@option{screenshot-dir} and @option{watch-later-directory} instead of +@option{watch-later-dir}. + +Valid values for the fields depend on their type. + +@table @asis +@item Flags +The value should be @code{#f} or @code{#t}. + +@item Numerical fields +Integer and integer64 fields are validated by @code{integer?}, float and +double fields by @code{real?}. Ranges are checked when applicable. + +@item Aspect +Same as integer. + +@item ByteSize +Same as integer64. + +@item Choice +The value should be a symbol representing member of the enumeration. If +the choice has @samp{or ...} part, it can also be value of that +alternative type. + +@item @var{type} list +The value should be a list of the @var{type}. + +@end table + +Other types accept strings, with validation of the values where possible +(e.g. type @samp{Color} is validated, but type @samp{Audio channels or +channel map} is not). + +The full list of currently supported keyword arguments is below. For +the types, allowed values and full description please refer to the +@command{mpv --list-options} and +@uref{https://mpv.io/manual/stable/#options, mpv manual}. + +Only set fields are outputted to the configuration file. Accessors are +provided for every field, returning either their value or a sentinel +object @code{%unset-value} (from @code{(gnu services configuration)}). + +@code{ab-loop-a}, @code{ab-loop-b}, @code{ab-loop-count}, +@code{access-references?}, @code{ad}, @code{ad-lavc-ac3drc}, +@code{ad-lavc-downmix?}, @code{ad-lavc-o}, @code{ad-lavc-threads}, +@code{ad-queue-enable?}, @code{ad-queue-max-bytes}, +@code{ad-queue-max-samples}, @code{ad-queue-max-secs}, @code{af}, +@code{audio}, @code{alang}, @code{allow-delayed-peak-detect?}, +@code{alsa-buffer-time}, @code{alsa-ignore-chmap?}, +@code{alsa-mixer-device}, @code{alsa-mixer-index}, +@code{alsa-mixer-name}, @code{alsa-non-interleaved?}, +@code{alsa-periods}, @code{alsa-resample?}, @code{ao}, +@code{ao-null-broken-delay?}, @code{ao-null-broken-eof?}, +@code{ao-null-buffer}, @code{ao-null-channel-layouts}, +@code{ao-null-format}, @code{ao-null-latency}, @code{ao-null-outburst}, +@code{ao-null-speed}, @code{ao-null-untimed?}, @code{ao-pcm-append?}, +@code{ao-pcm-file}, @code{ao-pcm-waveheader?}, +@code{audio-backward-batch}, @code{audio-backward-overlap}, +@code{audio-buffer}, @code{audio-channels}, @code{audio-client-name}, +@code{audio-delay}, @code{audio-demuxer}, @code{audio-device}, +@code{audio-display}, @code{audio-exclusive?}, @code{audio-exts}, +@code{audio-fallback-to-null?}, @code{audio-file-auto}, +@code{audio-file-paths}, @code{audio-files}, @code{audio-format}, +@code{audio-normalize-downmix?}, @code{audio-pitch-correction?}, +@code{audio-resample-cutoff}, @code{audio-resample-filter-size}, +@code{audio-resample-linear?}, @code{audio-resample-max-output-size}, +@code{audio-resample-phase-shift}, @code{audio-reversal-buffer}, +@code{audio-samplerate}, @code{audio-spdif}, +@code{audio-stream-silence?}, @code{audio-swresample-o}, +@code{audio-wait-open}, @code{auto-window-resize?}, +@code{autocreate-playlist}, @code{autofit}, @code{autofit-larger}, +@code{autofit-smaller}, @code{autoload-files?}, @code{autosync}, +@code{background}, @code{background-color}, @code{blend-subtitles}, +@code{bluray-device}, @code{border?}, @code{border-background}, +@code{brightness}, @code{cache}, @code{cache-on-disk?}, +@code{cache-pause?}, @code{cache-pause-initial?}, +@code{cache-pause-wait}, @code{cache-secs}, @code{cdda-cdtext?}, +@code{cdda-device}, @code{cdda-overlap}, @code{cdda-paranoia}, +@code{cdda-sector-size}, @code{cdda-skip?}, @code{cdda-span-a}, +@code{cdda-span-b}, @code{cdda-speed}, @code{cdda-toc-offset}, +@code{chapter-merge-threshold}, @code{chapter-seek-threshold}, +@code{chapters-file}, @code{config?}, @code{container-fps-override}, +@code{contrast}, @code{cookies?}, @code{cookies-file}, +@code{corner-rounding}, @code{correct-downscaling?}, +@code{correct-pts?}, @code{cover-art-auto}, @code{cover-art-files}, +@code{cover-art-whitelist}, @code{cscale}, @code{cscale-antiring}, +@code{cscale-blur}, @code{cscale-clamp}, @code{cscale-param1}, +@code{cscale-param2}, @code{cscale-radius}, @code{cscale-taper}, +@code{cscale-window}, @code{cscale-wparam}, @code{cscale-wtaper}, +@code{cursor-autohide}, @code{cursor-autohide-fs-only?}, @code{deband?}, +@code{deband-grain}, @code{deband-iterations}, @code{deband-range}, +@code{deband-threshold}, @code{deinterlace}, +@code{deinterlace-field-parity}, @code{demuxer}, +@code{demuxer-backward-playback-step}, @code{demuxer-cache-dir}, +@code{demuxer-cache-unlink-files}, @code{demuxer-cache-wait?}, +@code{demuxer-donate-buffer?}, @code{demuxer-hysteresis-secs}, +@code{demuxer-lavf-allow-mimetype?}, +@code{demuxer-lavf-analyzeduration}, @code{demuxer-lavf-buffersize}, +@code{demuxer-lavf-format}, @code{demuxer-lavf-hacks?}, +@code{demuxer-lavf-linearize-timestamps}, @code{demuxer-lavf-o}, +@code{demuxer-lavf-probe-info}, @code{demuxer-lavf-probescore}, +@code{demuxer-lavf-probesize}, @code{demuxer-lavf-propagate-opts?}, +@code{demuxer-max-back-bytes}, @code{demuxer-max-bytes}, +@code{demuxer-mkv-probe-start-time?}, +@code{demuxer-mkv-probe-video-duration}, +@code{demuxer-mkv-subtitle-preroll}, +@code{demuxer-mkv-subtitle-preroll-secs}, +@code{demuxer-mkv-subtitle-preroll-secs-index}, +@code{demuxer-rawaudio-channels}, @code{demuxer-rawaudio-format}, +@code{demuxer-rawaudio-rate}, @code{demuxer-rawvideo-codec}, +@code{demuxer-rawvideo-format}, @code{demuxer-rawvideo-fps}, +@code{demuxer-rawvideo-h}, @code{demuxer-rawvideo-mp-format}, +@code{demuxer-rawvideo-size}, @code{demuxer-rawvideo-w}, +@code{demuxer-readahead-secs}, @code{demuxer-seekable-cache}, +@code{demuxer-termination-timeout}, @code{demuxer-thread?}, +@code{directory-filter-types}, @code{directory-mode}, +@code{display-fps-override}, @code{display-tags}, @code{dither}, +@code{dither-depth}, @code{dither-size-fruit}, @code{drag-and-drop}, +@code{drm-connector}, @code{drm-device}, @code{drm-draw-plane}, +@code{drm-draw-surface-size}, @code{drm-drmprime-video-plane}, +@code{drm-format}, @code{drm-mode}, @code{drm-vrr-enabled}, +@code{dscale}, @code{dscale-antiring}, @code{dscale-blur}, +@code{dscale-clamp}, @code{dscale-param1}, @code{dscale-param2}, +@code{dscale-radius}, @code{dscale-taper}, @code{dscale-window}, +@code{dscale-wparam}, @code{dscale-wtaper}, @code{dump-stats}, +@code{dvbin-card}, @code{dvbin-channel-switch-offset}, +@code{dvbin-file}, @code{dvbin-full-transponder?}, @code{dvbin-prog}, +@code{dvbin-timeout}, @code{dvd-angle}, @code{dvd-device}, +@code{dvd-speed}, @code{edition}, @code{egl-config-id}, +@code{egl-output-format}, @code{embeddedfonts?}, @code{end}, +@code{error-diffusion}, @code{external-files}, @code{fbo-format}, +@code{focus-on}, @code{force-media-title}, @code{force-render?}, +@code{force-rgba-osd-rendering?}, @code{force-seekable?}, +@code{force-window}, @code{force-window-position?}, @code{framedrop}, +@code{frames}, @code{fs-screen}, @code{fs-screen-name}, +@code{fullscreen?}, @code{gamma}, @code{gamma-auto?}, +@code{gamma-factor}, @code{gamut-mapping-mode}, @code{gapless-audio}, +@code{geometry}, @code{glsl-shader-opts}, @code{glsl-shaders}, +@code{gpu-api}, @code{gpu-context}, @code{gpu-debug?}, +@code{gpu-dumb-mode}, @code{gpu-hwdec-interop}, +@code{gpu-shader-cache?}, @code{gpu-shader-cache-dir}, @code{gpu-sw?}, +@code{gpu-tex-pad-x}, @code{gpu-tex-pad-y}, @code{hdr-compute-peak}, +@code{hdr-contrast-recovery}, @code{hdr-contrast-smoothness}, +@code{hdr-peak-decay-rate}, @code{hdr-peak-percentile}, +@code{hdr-scene-threshold-high}, @code{hdr-scene-threshold-low}, +@code{hidpi-window-scale?}, @code{hls-bitrate}, @code{hr-seek}, +@code{hr-seek-demuxer-offset}, @code{hr-seek-framedrop?}, +@code{http-header-fields}, @code{http-proxy}, @code{hue}, @code{hwdec}, +@code{hwdec-codecs}, @code{hwdec-extra-frames}, +@code{hwdec-image-format}, @code{icc-3dlut-size}, @code{icc-cache?}, +@code{icc-cache-dir}, @code{icc-force-contrast}, @code{icc-intent}, +@code{icc-profile}, @code{icc-profile-auto?}, @code{icc-use-luma?}, +@code{idle}, @code{ignore-path-in-watch-later-config?}, +@code{image-display-duration}, @code{image-exts}, @code{image-lut}, +@code{image-lut-type}, @code{image-subs-video-resolution?}, +@code{include}, @code{index}, @code{initial-audio-sync?}, +@code{input-ar-delay}, @code{input-ar-rate}, +@code{input-builtin-bindings?}, @code{input-builtin-dragging?}, +@code{input-commands}, @code{input-conf}, @code{input-cursor?}, +@code{input-cursor-passthrough?}, @code{input-default-bindings?}, +@code{input-doubleclick-time}, @code{input-dragging-deadzone}, +@code{input-ipc-client}, @code{input-ipc-server}, +@code{input-key-fifo-size}, @code{input-media-keys?}, +@code{input-preprocess-wheel?}, @code{input-right-alt-gr?}, +@code{input-terminal?}, @code{input-test?}, +@code{input-touch-emulate-mouse?}, @code{input-vo-keyboard?}, +@code{interpolation?}, @code{interpolation-preserve?}, +@code{interpolation-threshold}, @code{inverse-tone-mapping?}, +@code{jack-autostart?}, @code{jack-connect?}, @code{jack-name}, +@code{jack-port}, @code{jack-std-channel-layout}, @code{keep-open}, +@code{keep-open-pause?}, @code{keepaspect?}, @code{keepaspect-window?}, +@code{lavfi-complex}, @code{length}, @code{libplacebo-opts}, +@code{linear-downscaling?}, @code{linear-upscaling?}, +@code{load-auto-profiles}, @code{load-osd-console?}, +@code{load-scripts?}, @code{load-select?}, @code{load-stats-overlay?}, +@code{load-unsafe-playlists?}, @code{log-file}, @code{loop-file}, +@code{loop-playlist}, @code{lut}, @code{lut-type}, @code{mc}, +@code{media-controls}, @code{merge-files?}, @code{metadata-codepage}, +@code{mf-fps}, @code{mf-type}, @code{monitoraspect}, +@code{monitorpixelaspect}, @code{msg-color?}, @code{msg-level}, +@code{msg-module?}, @code{msg-time?}, @code{mute?}, @code{native-fs?}, +@code{native-keyrepeat?}, @code{native-touch?}, @code{network-timeout}, +@code{oac}, @code{oacopts}, @code{ocopy-metadata?}, @code{of}, +@code{ofopts}, @code{on-all-workspaces?}, @code{ontop?}, +@code{ontop-level}, @code{opengl-check-pattern-a}, +@code{opengl-check-pattern-b}, @code{opengl-early-flush}, +@code{opengl-es}, @code{opengl-glfinish?}, @code{opengl-pbo?}, +@code{opengl-rectangle-textures?}, @code{opengl-swapinterval}, +@code{opengl-waitvsync?}, @code{orawts?}, @code{ordered-chapters?}, +@code{ordered-chapters-files}, @code{oremove-metadata}, @code{osc?}, +@code{osd-align-x}, @code{osd-align-y}, @code{osd-back-color}, +@code{osd-bar?}, @code{osd-bar-align-x}, @code{osd-bar-align-y}, +@code{osd-bar-h}, @code{osd-bar-outline-size}, @code{osd-bar-w}, +@code{osd-blur}, @code{osd-bold?}, @code{osd-border-style}, +@code{osd-color}, @code{osd-duration}, @code{osd-font}, +@code{osd-font-provider}, @code{osd-font-size}, @code{osd-fonts-dir}, +@code{osd-fractions?}, @code{osd-italic?}, @code{osd-justify}, +@code{osd-level}, @code{osd-margin-x}, @code{osd-margin-y}, +@code{osd-msg1}, @code{osd-msg2}, @code{osd-msg3}, @code{osd-on-seek}, +@code{osd-outline-color}, @code{osd-outline-size}, +@code{osd-playing-msg}, @code{osd-playing-msg-duration}, +@code{osd-playlist-entry}, @code{osd-scale}, +@code{osd-scale-by-window?}, @code{osd-shadow-offset}, +@code{osd-spacing}, @code{osd-status-msg}, @code{oset-metadata}, +@code{ovc}, @code{ovcopts}, @code{panscan}, @code{pause?}, +@code{pipewire-buffer}, @code{pipewire-remote}, +@code{pipewire-volume-mode}, @code{pitch}, @code{play-direction}, +@code{player-operation-mode}, @code{playlist-start}, +@code{prefetch-playlist?}, @code{profile}, +@code{pulse-allow-suspended?}, @code{pulse-buffer}, @code{pulse-host}, +@code{pulse-latency-hacks?}, @code{quiet?}, @code{really-quiet?}, +@code{rebase-start-time?}, @code{referrer}, @code{replaygain}, +@code{replaygain-clip?}, @code{replaygain-fallback}, +@code{replaygain-preamp}, @code{reset-on-next-file}, +@code{resume-playback?}, @code{resume-playback-check-mtime?}, +@code{rtsp-transport}, @code{saturation}, @code{save-position-on-quit?}, +@code{scale}, @code{scale-antiring}, @code{scale-blur}, +@code{scale-clamp}, @code{scale-param1}, @code{scale-param2}, +@code{scale-radius}, @code{scale-taper}, @code{scale-window}, +@code{scale-wparam}, @code{scale-wtaper}, @code{scaler-resizes-only?}, +@code{screen}, @code{screen-name}, @code{screenshot-avif-encoder}, +@code{screenshot-avif-opts}, @code{screenshot-avif-pixfmt}, +@code{screenshot-directory}, @code{screenshot-format}, +@code{screenshot-high-bit-depth?}, @code{screenshot-jpeg-quality}, +@code{screenshot-jpeg-source-chroma?}, @code{screenshot-jxl-distance}, +@code{screenshot-jxl-effort}, @code{screenshot-png-compression}, +@code{screenshot-png-filter}, @code{screenshot-sw?}, +@code{screenshot-tag-colorspace?}, @code{screenshot-template}, +@code{screenshot-webp-compression}, @code{screenshot-webp-lossless?}, +@code{screenshot-webp-quality}, @code{script-opts}, @code{scripts}, +@code{secondary-sid}, @code{secondary-sub-ass-override}, +@code{secondary-sub-delay}, @code{secondary-sub-pos}, +@code{secondary-sub-visibility?}, @code{sharpen}, +@code{show-in-taskbar?}, @code{shuffle?}, @code{sub}, +@code{sigmoid-center}, @code{sigmoid-slope}, @code{sigmoid-upscaling?}, +@code{slang}, @code{snap-window?}, @code{speed}, @code{spirv-compiler}, +@code{sstep}, @code{start}, @code{stop-playback-on-init-failure?}, +@code{stop-screensaver}, @code{stream-buffer-size}, @code{stream-dump}, +@code{stream-lavf-o}, @code{stream-record}, @code{stretch-dvd-subs?}, +@code{stretch-image-subs-to-screen?}, @code{sub-align-x}, +@code{sub-align-y}, @code{sub-ass?}, @code{sub-ass-force-margins?}, +@code{sub-ass-hinting}, @code{sub-ass-justify?}, +@code{sub-ass-line-spacing}, @code{sub-ass-override}, +@code{sub-ass-scale-with-window?}, @code{sub-ass-shaper}, +@code{sub-ass-style-overrides}, @code{sub-ass-styles}, +@code{sub-ass-use-video-data}, @code{sub-ass-video-aspect-override}, +@code{sub-ass-vsfilter-color-compat}, @code{sub-auto}, +@code{sub-auto-exts}, @code{sub-back-color}, @code{sub-blur}, +@code{sub-bold?}, @code{sub-border-style}, @code{sub-clear-on-seek?}, +@code{sub-codepage}, @code{sub-color}, @code{sub-create-cc-track?}, +@code{sub-delay}, @code{sub-demuxer}, @code{sub-file-paths}, +@code{sub-files}, @code{sub-filter-jsre}, @code{sub-filter-regex}, +@code{sub-filter-regex-enable?}, @code{sub-filter-regex-plain?}, +@code{sub-filter-regex-warn?}, @code{sub-filter-sdh?}, +@code{sub-filter-sdh-enclosures}, @code{sub-filter-sdh-harder?}, +@code{sub-fix-timing?}, @code{sub-font}, @code{sub-font-provider}, +@code{sub-font-size}, @code{sub-fonts-dir}, +@code{sub-forced-events-only?}, @code{sub-fps}, @code{sub-gauss}, +@code{sub-gray?}, @code{sub-italic?}, @code{sub-justify}, +@code{sub-lavc-o}, @code{sub-margin-x}, @code{sub-margin-y}, +@code{sub-outline-color}, @code{sub-outline-size}, +@code{sub-past-video-end?}, @code{sub-pos}, @code{sub-scale}, +@code{sub-scale-by-window?}, @code{sub-scale-with-window?}, +@code{sub-shadow-offset}, @code{sub-spacing}, @code{sub-speed}, +@code{sub-stretch-durations?}, @code{sub-use-margins?}, +@code{sub-visibility?}, @code{sub-vsfilter-bidi-compat?}, +@code{subs-fallback}, @code{subs-fallback-forced}, +@code{subs-match-os-language?}, @code{subs-with-matching-audio}, +@code{swapchain-depth}, @code{sws-allow-zimg?}, @code{sws-bitexact?}, +@code{sws-cgb}, @code{sws-chs}, @code{sws-cs}, @code{sws-cvs}, +@code{sws-fast?}, @code{sws-lgb}, @code{sws-ls}, @code{sws-scaler}, +@code{target-colorspace-hint?}, @code{target-contrast}, +@code{target-gamut}, @code{target-lut}, @code{target-peak}, +@code{target-prim}, @code{target-trc}, @code{taskbar-progress?}, +@code{teletext-page}, @code{temporal-dither?}, +@code{temporal-dither-period}, @code{term-osd}, @code{term-osd-bar?}, +@code{term-osd-bar-chars}, @code{term-playing-msg}, +@code{term-status-msg}, @code{term-title}, @code{terminal?}, +@code{title}, @code{title-bar?}, @code{tls-ca-file}, +@code{tls-cert-file}, @code{tls-key-file}, @code{tls-verify?}, +@code{tone-mapping}, @code{tone-mapping-max-boost}, +@code{tone-mapping-param}, @code{tone-mapping-visualize?}, +@code{track-auto-selection?}, @code{tscale}, @code{tscale-antiring}, +@code{tscale-blur}, @code{tscale-clamp}, @code{tscale-param1}, +@code{tscale-param2}, @code{tscale-radius}, @code{tscale-taper}, +@code{tscale-window}, @code{tscale-wparam}, @code{tscale-wtaper}, +@code{untimed?}, @code{use-embedded-icc-profile?}, +@code{use-filedir-conf?}, @code{user-agent}, @code{vaapi-device}, +@code{vd}, @code{vd-apply-cropping?}, @code{vd-lavc-assume-old-x264?}, +@code{vd-lavc-bitexact?}, @code{vd-lavc-check-hw-profile?}, +@code{vd-lavc-dr}, @code{vd-lavc-fast?}, @code{vd-lavc-film-grain}, +@code{vd-lavc-framedrop}, @code{vd-lavc-o}, @code{vd-lavc-show-all?}, +@code{vd-lavc-skipframe}, @code{vd-lavc-skipidct}, +@code{vd-lavc-skiploopfilter}, @code{vd-lavc-software-fallback}, +@code{vd-lavc-threads}, @code{vd-queue-enable?}, +@code{vd-queue-max-bytes}, @code{vd-queue-max-samples}, +@code{vd-queue-max-secs}, @code{vf}, @code{video}, @code{video-align-x}, +@code{video-align-y}, @code{video-aspect-method}, +@code{video-aspect-override}, @code{video-backward-batch}, +@code{video-backward-overlap}, @code{video-crop}, @code{video-exts}, +@code{video-latency-hacks?}, @code{video-margin-ratio-bottom}, +@code{video-margin-ratio-left}, @code{video-margin-ratio-right}, +@code{video-margin-ratio-top}, @code{video-osd?}, +@code{video-output-levels}, @code{video-pan-x}, @code{video-pan-y}, +@code{video-reversal-buffer}, @code{video-rotate}, @code{video-scale-x}, +@code{video-scale-y}, @code{video-sync}, +@code{video-sync-max-audio-change}, @code{video-sync-max-factor}, +@code{video-sync-max-video-change}, @code{video-timing-offset}, +@code{video-unscaled}, @code{video-zoom}, @code{vlang}, @code{vo}, +@code{vo-image-avif-encoder}, @code{vo-image-avif-opts}, +@code{vo-image-avif-pixfmt}, @code{vo-image-format}, +@code{vo-image-high-bit-depth?}, @code{vo-image-jpeg-quality}, +@code{vo-image-jpeg-source-chroma?}, @code{vo-image-jxl-distance}, +@code{vo-image-jxl-effort}, @code{vo-image-outdir}, +@code{vo-image-png-compression}, @code{vo-image-png-filter}, +@code{vo-image-tag-colorspace?}, @code{vo-image-webp-compression}, +@code{vo-image-webp-lossless?}, @code{vo-image-webp-quality}, +@code{vo-kitty-alt-screen?}, @code{vo-kitty-cols}, +@code{vo-kitty-config-clear?}, @code{vo-kitty-height}, +@code{vo-kitty-left}, @code{vo-kitty-rows}, @code{vo-kitty-top}, +@code{vo-kitty-use-shm?}, @code{vo-kitty-width}, @code{vo-null-fps}, +@code{vo-sixel-alt-screen?}, @code{vo-sixel-buffered?}, +@code{vo-sixel-cols}, @code{vo-sixel-config-clear?}, +@code{vo-sixel-dither}, @code{vo-sixel-fixedpalette?}, +@code{vo-sixel-height}, @code{vo-sixel-left}, @code{vo-sixel-pad-x}, +@code{vo-sixel-pad-y}, @code{vo-sixel-reqcolors}, @code{vo-sixel-rows}, +@code{vo-sixel-threshold}, @code{vo-sixel-top}, @code{vo-sixel-width}, +@code{vo-tct-256?}, @code{vo-tct-algo}, @code{vo-tct-buffering}, +@code{vo-tct-height}, @code{vo-tct-width}, @code{vo-vaapi-scaled-osd?}, +@code{vo-vaapi-scaling}, @code{vo-vdpau-chroma-deint?}, +@code{vo-vdpau-colorkey}, @code{vo-vdpau-composite-detect?}, +@code{vo-vdpau-denoise}, @code{vo-vdpau-force-yuv?}, +@code{vo-vdpau-fps}, @code{vo-vdpau-hqscaling}, +@code{vo-vdpau-output-surfaces}, @code{vo-vdpau-pullup?}, +@code{vo-vdpau-queuetime-fs}, @code{vo-vdpau-queuetime-windowed}, +@code{vo-vdpau-sharpen}, @code{volume}, @code{volume-gain}, +@code{volume-gain-max}, @code{volume-gain-min}, @code{volume-max}, +@code{vulkan-async-compute?}, @code{vulkan-async-transfer?}, +@code{vulkan-device}, @code{vulkan-display-display}, +@code{vulkan-display-mode}, @code{vulkan-display-plane}, +@code{vulkan-queue-count}, @code{vulkan-swap-mode}, +@code{watch-later-directory}, @code{watch-later-options}, +@code{wayland-app-id}, @code{wayland-configure-bounds}, +@code{wayland-content-type}, @code{wayland-disable-vsync?}, +@code{wayland-edge-pixels-pointer}, @code{wayland-edge-pixels-touch}, +@code{wayland-present?}, @code{wid}, @code{window-dragging?}, +@code{window-maximized?}, @code{window-minimized?}, @code{window-scale}, +@code{write-filename-in-watch-later-config?}, +@code{x11-bypass-compositor}, @code{x11-name}, @code{x11-netwm}, +@code{x11-present}, @code{x11-wid-title?}, @code{xv-adaptor}, +@code{xv-buffers}, @code{xv-ck}, @code{xv-ck-method}, +@code{xv-colorkey}, @code{xv-port}, @code{ytdl?}, @code{ytdl-format}, +@code{ytdl-raw-options}, @code{zimg-dither}, @code{zimg-fast?}, +@code{zimg-scaler}, @code{zimg-scaler-chroma}, +@code{zimg-scaler-chroma-param-a}, @code{zimg-scaler-chroma-param-b}, +@code{zimg-scaler-param-a}, @code{zimg-scaler-param-b}, and +@code{zimg-threads}. + +@end deffn + @node Sway window manager @subsection Sway window manager diff --git a/gnu/home/services/mpv.scm b/gnu/home/services/mpv.scm new file mode 100644 index 0000000000..8d11fa03a3 --- /dev/null +++ b/gnu/home/services/mpv.scm @@ -0,0 +1,2751 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2024, 2025 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 <http://www.gnu.org/licenses/>. + +(define-module (gnu home services mpv) + #:use-module ((gnu services configuration) #:select (%unset-value + maybe-value-set?)) + #:use-module (gnu home services) + #:autoload (guix diagnostics) (formatted-message) + #:autoload (guix i18n) (G_) + #: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 + + 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)) + + +;;; +;;; Basic types. +;;; +(define (serialize-mpv/boolean field-name value) + #~(string-append (string-trim-right #$(symbol->string field-name) #\?) + "=" + #$(if value "yes" "no") + "\n")) +(define mpv/boolean? boolean?) + +(define (serialize-mpv/integer field-name value) + #~(string-append #$(symbol->string field-name) + "=" + #$(number->string value) + "\n")) +(define (mpv/integer? n) + ;; We assume integer is a signed 32bit number. + (and-let* (((integer? n)) + ((>= n (* -1 (expt 2 (1- 32))))) + ((<= n (1- (expt 2 (1- 32)))))))) + +(define (serialize-mpv/integer64 field-name value) + #~(string-append #$(symbol->string field-name) + "=" + #$(number->string value) + "\n")) +(define (mpv/integer64? n) + ;; We assume integer is a signed 64bit number. + (and-let* (((integer? n)) + ((>= n (* -1 (expt 2 (1- 64))))) + ((<= n (1- (expt 2 (1- 64)))))))) + +(define (serialize-mpv/string field-name value) + #~(string-append #$(symbol->string field-name) + "=" + #$value + "\n")) +(define mpv/string? + string?) + +(define (serialize-mpv/float field-name value) + #~(string-append #$(symbol->string field-name) + "=" + #$(number->string (exact->inexact value)) + "\n")) +(define mpv/float? + ;; I am not sure how to validate floats. + real?) + +(define (serialize-mpv/double field-name value) + #~(string-append #$(symbol->string field-name) + "=" + #$(number->string (exact->inexact value)) + "\n")) +(define mpv/double? + ;; 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-mpv/aspect serialize-mpv/integer) +(define mpv/aspect? mpv/integer?) + +;;; `Audio channels or channel map' seems to be basically a free form string +;;; with no way to validate. +(define serialize-mpv/audio-channels-or-channel-map serialize-mpv/string) +(define mpv/audio-channels-or-channel-map? mpv/string?) + +;;; Does not seem possible to validate. +(define serialize-mpv/audio-format serialize-mpv/string) +(define mpv/audio-format? mpv/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-mpv/byte-size serialize-mpv/integer64) +(define mpv/byte-size? mpv/integer64?) + +(define (serialize-mpv/color field-name value) + #~(string-append #$(symbol->string field-name) + "=" + #$(if (list? value) + (string-join (map number->string value) "/") + value) + "\n")) +(define (mpv/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-mpv/fourcc serialize-mpv/string) +(define mpv/fourcc? mpv/string?) + +;;; No way to validate. +(define serialize-mpv/image-format serialize-mpv/string) +(define mpv/image-format? mpv/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-mpv/relative-time-or-percent-position serialize-mpv/string) +(define mpv/relative-time-or-percent-position? mpv/string?) + +(define serialize-mpv/time serialize-mpv/string) +(define mpv/time? mpv/string?) + +(define serialize-mpv/video-rectangle serialize-mpv/string) +(define (mpv/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-mpv/window-geometry serialize-mpv/string) +(define (mpv/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-mpv/window-size serialize-mpv/string) +(define (mpv/window-size? value) + (string-match "^([0-9]+%?(x[0-9]+%?)?)?$" value)) + +(define (serialize-mpv/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 (mpv/enumeration? value) + ;; There is no general way to check enumerations. The field always has to + ;; define custom sanitizer. + #t) + + + + +;;; +;;; List types. +;;; +(define (serialize-mpv/list-of-string field-name lst) + #~(string-append #$(symbol->string field-name) + "=" + #$(string-join lst ",") + "\n")) +(define (mpv/list-of-string? lst) + (every mpv/string? lst)) + +(define (serialize-mpv/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 (mpv/list-of-key-value? lst) + (every (match-lambda + (((? string?) . (? string?)) #t) + (_ #f)) + lst)) + +(define serialize-mpv/list-of-object-setting serialize-mpv/list-of-string) +(define mpv/list-of-object-setting? mpv/list-of-string?) + +(define serialize-mpv/list-of-output-verbosity serialize-mpv/list-of-key-value) +(define mpv/list-of-output-verbosity? mpv/list-of-key-value?) + + + + +;;; +;;; Actual configuration record. Contains a lot of generated code. +;;; + +(define-record-type <profile-option> + (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 "mpv/~a?" d/t))) + (d/serializer (string->symbol + (format #f "serialize-mpv/~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-value))) + (if (eq? x %unset-value) + %unset-value + (car x))))))))))) + +;;; Generated by: https://git.wolfsden.cz/guix/tree/etc/update-mpv-configuration +;;; 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 + pipewire-buffer + enumeration + (or (memq val '(native)) + (and (integer? val) (>= val 1) (<= val 2000)))) +(define-opt pipewire-remote string) +(define-opt + pipewire-volume-mode + enumeration + (memq val '(channel global))) +(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 <mpv-profile-configuration> + (%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 + (raise-exception + (formatted-message + (G_ "option ~a not found for mpv-profile-configuration") key))) + (if (maybe-value-set? val) + (if ((profile-option-type-check opt) val) + (hashq-set! new key (cons val + (profile-option-serializer opt))) + (raise-exception + (formatted-message + (G_ "invalid mpv configuration for ~a: ~a~%") + key val))) + (hashq-remove! new key))) + (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) + (string<? (symbol->string (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-mpv/mpv-profile-configurations _ profiles) + #~(string-append + #$@(map (match-lambda + ((name . config) + #~(string-append + #$(format #f "[~a]~%" name) + #$(serialize-mpv-profile-configuration _ config)))) + profiles))) +(define (mpv/mpv-profile-configurations? alist) + (and (list? alist) + (every (match-lambda + (((? symbol?) . (? mpv-profile-configuration?)) #t) + (_ #f)) + alist))) + +(define (serialize-mpv/extra _ value) + (if value + #~(string-append #$value + ;; Ensure the extra content ends in a new line. + #$(if (string-suffix? "\n" value) + "" "\n")) + #~"")) +(define (mpv/extra? val) + (or (string? val) + (gexp? val))) + +(define-record-type <home-mpv-configuration> + (%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 (mpv-profile-configuration? global) + (raise-exception + (formatted-message + (G_ "global must satisfy mpv-profile-configuration?")))) + (unless (mpv/mpv-profile-configurations? profiles) + (raise-exception + (formatted-message + (G_ "profiles must be an alist of mpv-profile-configuration?")))) + (unless (or (not extra-config) (mpv/extra? extra-config)) + (raise-exception + (formatted-message + (G_ "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-mpv/mpv-profile-configurations + 'profiles + (home-mpv-configuration-profiles cfg)) + #$(serialize-mpv/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."))) diff --git a/gnu/local.mk b/gnu/local.mk index e6ece8cc48..d132e79ad2 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -113,6 +113,7 @@ GNU_SYSTEM_MODULES = \ %D%/home/services/mail.scm \ %D%/home/services/media.scm \ %D%/home/services/messaging.scm \ + %D%/home/services/mpv.scm \ %D%/home/services/music.scm \ %D%/home/services/pm.scm \ %D%/home/services/shells.scm \ -- 2.49.0
andrew@HIDDEN, gabriel@HIDDEN, hako@HIDDEN, janneke@HIDDEN, ludo@HIDDEN, maxim.cournoyer@HIDDEN, tanguy@HIDDEN, guix-patches@HIDDEN
:bug#74801
; Package guix-patches
.
Full text available.Received: (at 74801) by debbugs.gnu.org; 9 May 2025 08:52:24 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 09 04:52:24 2025 Received: from localhost ([127.0.0.1]:35384 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1uDJSy-0006Hu-5O for submit <at> debbugs.gnu.org; Fri, 09 May 2025 04:52:24 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:49852) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1uDJSw-0006HV-61 for 74801 <at> debbugs.gnu.org; Fri, 09 May 2025 04:52:22 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <ludo@HIDDEN>) id 1uDJSn-0006wm-Ku; Fri, 09 May 2025 04:52:13 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-Version:Date:References:In-Reply-To:Subject:To: From; bh=WNiWh/w2Sjr7RzISZaWhtTijsJxsbKzzXOj3m2bpS94=; b=CxLwMex13Cfecqodg5xb Rw7oTpG6lsu5x2bXXyFwqpCAIbKqsaYk0fo+40RvGpMHjbU9UfpCOnag8RxJg9F+KiHpd6wbzJ2yE Tr4pvbd7PmUnZzXpzXvsDS+0hjLm+6k4n+m55/QsNtKkQlJ9npaF4crT6wL2ACp6LeP/2UdNlBPRh dkriZKWsricoSGGbtgqnnuleqELfVXeSBJM/YAIO4/u25pHhmA/lQFB98jmY6p4pZdAbQkqmnaNHp VRZpbFCEapFhrM1VGAxY2v5on4A+K1tvQU9voQvBjfDUNu9rc7/5FtpT5+eaeG3mZyBABeQPLiDRE OjC5Z3VgW1oL4A==; From: =?utf-8?Q?Ludovic_Court=C3=A8s?= <ludo@HIDDEN> To: Tomas Volf <~@wolfsden.cz> Subject: Re: [bug#74801] [PATCH v2] gnu: home: services: Add home-mpv-service-type. In-Reply-To: <87tt5xxuq1.fsf@HIDDEN> (Tomas Volf's message of "Wed, 07 May 2025 00:03:34 +0200") References: <29d3cc661a49b7bef951041f8ec3c7600c9777a7.1733953822.git.~@wolfsden.cz> <ea877c6277825b1fc87a6d15c581975ef1a81167.1746204040.git.~@wolfsden.cz> <87v7qevzt0.fsf@HIDDEN> <87tt5xxuq1.fsf@HIDDEN> User-Agent: mu4e 1.12.9; emacs 29.4 X-URL: https://people.bordeaux.inria.fr/lcourtes/ X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu X-Revolutionary-Date: =?utf-8?Q?D=C3=A9cadi?= 20 =?utf-8?Q?Flor=C3=A9al?= an 233 de la =?utf-8?Q?R=C3=A9volution=2C?= jour du Sarcloir Date: Fri, 09 May 2025 10:49:14 +0200 Message-ID: <87o6w2manp.fsf@HIDDEN> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.2 (/) X-Debbugs-Envelope-To: 74801 Cc: Tanguy Le Carrour <tanguy@HIDDEN>, Maxim Cournoyer <maxim.cournoyer@HIDDEN>, Gabriel Wicki <gabriel@HIDDEN>, Andrew Tropin <andrew@HIDDEN>, Hilton Chain <hako@HIDDEN>, 74801 <at> debbugs.gnu.org, Janneke Nieuwenhuizen <janneke@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -3.3 (---) Hello, Tomas Volf <~@wolfsden.cz> writes: > Ludovic Court=C3=A8s <ludo@HIDDEN> writes: [...] >> Could you include the code you used to generate the options? > > I definitely *could* do that. While the code is maybe a bit ugly, it is > not intended to be kept secret. Couple of questions though. > > 1. Where should I put it? Somewhere in etc directory? Or next to the > service, so e.g. gnu/home/services/mpv-refresh.sh? > > 2. It has external dependencies, some of which are packaged in Guix > (emacs, emacs-paredit) and some of them are not (guile-wolfsden). Is > that a problem? Do I need to rewrite it to use just packaged > libraries and programs? Well, in that case, maybe just include the URL in the script in the comment (=E2=80=9CGenerated by =E2=80=A6=E2=80=9D). Had it been pure Scheme (possibly based on (guix read-print) rather than Emacs), we could have included it straight in the code, as is done for Dovecot IIRC. Someone updating it could use the relevant procedures at the REPL to re-generate the option definitions. Thanks, Ludo=E2=80=99.
guix-patches@HIDDEN
:bug#74801
; Package guix-patches
.
Full text available.Received: (at 74801) by debbugs.gnu.org; 6 May 2025 22:03:44 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue May 06 18:03:43 2025 Received: from localhost ([127.0.0.1]:34819 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1uCQO6-0000SU-Mf for submit <at> debbugs.gnu.org; Tue, 06 May 2025 18:03:43 -0400 Received: from wolfsden.cz ([37.205.8.62]:47222) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from <~@wolfsden.cz>) id 1uCQO2-0000SE-KG for 74801 <at> debbugs.gnu.org; Tue, 06 May 2025 18:03:40 -0400 Received: by wolfsden.cz (Postfix, from userid 104) id 7FD622998B4; Tue, 6 May 2025 22:03:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail; t=1746569016; bh=f2zrszDZ9OroLvduAH++OB0ekicJW5eko6M4C+GKEik=; h=From:To:Cc:Subject:In-Reply-To:References:Date; b=wblKC6B8/i5wje7XVs/1zAggAEKSb0CYs+416CU0yLLgfyPDPuyU6Pct1W7KL6zkT ebVy9Rn92kVVpKpeHCZK6LTR0dOoSpgKGDar7AoAfl6AMtKUX01oW5S/VqzWVwozFK M5HwF+X7AuYgJLg4KYENywqnrQLiKIjK9dyWdwoiztl8xIlcApHjKsG2gJ4rHJhX6S 74hdTM2MkkqIFBTKQ5xIXerCLgFJOiwt786w2s9mGt+SCAOoU9bY0JXRHJ5/11Qyf1 OS6OaaI8Drv9+s7QlGjYYSa3OpP4pGp0e13+i5p5htZZss3Klw4jhiY0qnpuk8DCHU UxPe9t2RPaboNSNhMmFtWdGiqvIIpwV30y9NTMF/A8YKt8dfhvSdIrZyDPciu3/TFL 9Oee2zvpJg6W4hQotWx0296X1Rj5xgXE/GmUiDLCuxSH0Hyo4DPpaoaEYSHS1ockLn 9REpDDdCT06botGXhp1KoewqHvdj+GMe8zGXd7qmJPikDMoKviXm58GGBHgdtgEQXA ePkndZchZhXvQt8HwRJ9mcPrDuJhb/dROh4SG4lCzGNfCFNWTbb+CpbFzPiIqt1Mxh lQPHlaTvuakMw1Iig+JivDHY5ExAgsrxRWd/ALr/SnMuUZ+8M1lzgdsLu4WZDBUOIa HSMjR4SRyA3F48vRsQYDDTPw= X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on wolfsden X-Spam-Level: X-Spam-Status: No, score=-3.1 required=5.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.6 Received: from localhost (unknown [128.0.188.242]) by wolfsden.cz (Postfix) with ESMTPSA id 67A402998B3; Tue, 6 May 2025 22:03:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail; t=1746569015; bh=f2zrszDZ9OroLvduAH++OB0ekicJW5eko6M4C+GKEik=; h=From:To:Cc:Subject:In-Reply-To:References:Date; b=xkeBvnzv7t0GRJNvKRpGpS0t/k58AU/Z6Top29nts2pRftVfQYfQg+Ql0sjkEcSj6 sskYgp04j9CKrQOMOhOZhIQFZ11D07vOtzwQGKbufghIdM7eln3bOSjF0jAt4gNiN0 4RLlc51tB7tveTfppy3x+e+VEKv/YBXrxbyLrwHoGB7YzZN/8XWQUZhusFTO4TXkfY vCysGvcjhJPGc2uhK7YfJPSYcjI9wNuAle7mruC1gfiRR62Lo338xPUlcOF56ZcEDT 2q3zoyOEeB1L3L3o54/nWW0isLr/SCpYJ/+7Pm3bqFQQENXWDjmk07+e/6e4hWh9Rl Riw4Qv9MlgSf7CHOZ/eOOqc+1Q+JLxeAUb8bqvixfqGgIUUx7hZFE+cz6SnY3UQcby rPuXDHByvTl/OJnwjMvd4RXp0Zp9duN3ZLlPmyH73NNGHLly2HCjrLDU1RYRn4EQNK b4+F+KVUz39tjbNA88CPEH1C0QTxFzQuAa+nC9q/5KaPiTLwASJ3dWimNnidexj+E6 qCAWVfdkxLgAr0n996rShnwNaA6XwjjKB04d0HbIDjMKgZUGFwwmn6n/3zUKIhGj2a 0p8vQW2DuZMgwk+l4axEr4pDaKvZBc5U0eLwqQN7qXQYNp2Em9qVGH7Xy3qlk4XCSS YUE6xqmIWW4sAQMcog7YKoY8= From: Tomas Volf <~@wolfsden.cz> To: Ludovic =?utf-8?Q?Court=C3=A8s?= <ludo@HIDDEN> Subject: Re: [bug#74801] [PATCH v2] gnu: home: services: Add home-mpv-service-type. In-Reply-To: <87v7qevzt0.fsf@HIDDEN> ("Ludovic =?utf-8?Q?Court=C3=A8s=22'?= =?utf-8?Q?s?= message of "Tue, 06 May 2025 11:44:27 +0200") References: <29d3cc661a49b7bef951041f8ec3c7600c9777a7.1733953822.git.~@wolfsden.cz> <ea877c6277825b1fc87a6d15c581975ef1a81167.1746204040.git.~@wolfsden.cz> <87v7qevzt0.fsf@HIDDEN> Date: Wed, 07 May 2025 00:03:34 +0200 Message-ID: <87tt5xxuq1.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 74801 Cc: Tanguy Le Carrour <tanguy@HIDDEN>, Maxim Cournoyer <maxim.cournoyer@HIDDEN>, Gabriel Wicki <gabriel@HIDDEN>, Andrew Tropin <andrew@HIDDEN>, Hilton Chain <hako@HIDDEN>, 74801 <at> debbugs.gnu.org, Janneke Nieuwenhuizen <janneke@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -1.0 (-) Ludovic Court=C3=A8s <ludo@HIDDEN> writes: > Hi, > > Tomas Volf <~@wolfsden.cz> writes: > >> This commit adds a new service type to generate configuration file for t= he mpv >> media player. >> >> Originally I attempted to use Guix Records (via define-configuration) for >> this, but ran into the bug #74748, so I had to switch to procedures inst= ead. >> The usage is (hopefully) sufficiently described in the documentation. W= hen >> the bug is resolved, I will update it to use define-configuration instea= d. > > Is #74748 still a significant issue after > 5b158ddca9425d79ea4ceb374003fe0f7e6bd336? > > (This v2 already takes quite a few seconds to build, so it might be a > good starting point for profiling=E2=80=A6) I believe the workaround is still justified due to REPL part. In #74748 you write: > At the REPL you could type: > > ,o optimization-level 1 > > You could use =E2=80=98repl-option-set!=E2=80=99 from ~/.guile somehow I = guess. But that means that every user experimenting with the configuration in their REPL needs to do the same. What is more, they first need to find out that they should do that. That seems not great. >> The full list of supported options is documented, however I decided to *= not* >> document types and purpose for each individual fields. While I had most= ly >> working prototype to extract the documentation from mpv, once I realized= it >> would be few 10k of lines added, I decided it is not worth it. It would= bloat >> the .texi file (by more than 50%), be hard to maintain and, in my opinio= n, >> would not provide enough value to justify that. The current version see= ms >> like sane middle ground. > > Sounds reasonable. > >> Option to configure inputs (for mpv) will come later in a separate patch. > > OK. > > (I think this text is not meant for the commit log itself; you can > instead write it after the --- line.) Will remove. I sometimes struggle with this a bit (since commit message I can write right away, the text for "after ---" I need to keep... somewhere, until the patch is ready). > >> +@deffn {Procedure} make-home-mpv-configuration >> +Return a new instance of @code{home-mpv-configuration}. Available >> +keyword arguments are: >> + >> +@table @asis >> +@item @code{inherit} (default: @code{#t}) >> +Inherit fields from an another instance. >> + >> +@item @code{global} (default: @code{(make-mpv-profile-configuration)}) >> +The global configuration preceding all profiles. >> + >> +@item @code{profiles} (default: @code{()}) >> +An alist containing configuration for any additional profiles to include >> +in the configuration file. >> + >> +@lisp >> +(make-home-mpv-configuration >> + #:profiles `((fullscreen . ,(make-mpv-profile-configuration >> + #:fullscreen #t)))) >> +@end lisp >> + >> +@item @code{extra-config} (default: @code{#f}) >> +Additional content to include in the configuration file. It is placed >> +at the end of the file. > > Two minor stylistic issues: > > 1. We almost always drop the =E2=80=98make-=E2=80=99 bit from construct= ors, so I > wonder whether we should do the same here (OTOH these procedures > are different from the usual record constructors, so=E2=80=A6). Yeah, I did it like this on purpose to have a backwards compatible way to switch to normal records (named without the make-) later. > > 2. Please add question marks for boolean flags: #:inherit?, > #:fullscreen?, etc. Ah, good catch, will special-case 'boolean type in the generator (though #:inherit in particular is not a boolean flag). > >> +;;; Generated code - START. > > Could you include the code you used to generate the options? I definitely *could* do that. While the code is maybe a bit ugly, it is not intended to be kept secret. Couple of questions though. 1. Where should I put it? Somewhere in etc directory? Or next to the service, so e.g. gnu/home/services/mpv-refresh.sh? 2. It has external dependencies, some of which are packaged in Guix (emacs, emacs-paredit) and some of them are not (guile-wolfsden). Is that a problem? Do I need to rewrite it to use just packaged libraries and programs? > > Apart from that it LGTM. Thanks for the review. :) Once we clarify the fate of the code generator, I will send v3. Tomas --=20 There are only two hard things in Computer Science: cache invalidation, naming things and off-by-one errors.
guix-patches@HIDDEN
:bug#74801
; Package guix-patches
.
Full text available.Received: (at 74801) by debbugs.gnu.org; 6 May 2025 10:30:53 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Tue May 06 06:30:53 2025 Received: from localhost ([127.0.0.1]:52842 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1uCFZd-0001hi-6o for submit <at> debbugs.gnu.org; Tue, 06 May 2025 06:30:53 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:54362) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from <ludo@HIDDEN>) id 1uCFZX-0001gR-JA for 74801 <at> debbugs.gnu.org; Tue, 06 May 2025 06:30:48 -0400 Received: from fencepost.gnu.org ([2001:470:142:3::e]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <ludo@HIDDEN>) id 1uCFZM-0003Sf-In; Tue, 06 May 2025 06:30:36 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=gnu.org; s=fencepost-gnu-org; h=MIME-Version:Date:References:In-Reply-To:Subject:To: From; bh=iEVd8K5Z48u8HqxJvuWUGkE2jT2vektCR6mg+w/7SJo=; b=SwH4XU6zgEgUw1i3osjp TPoWK7a77zdUqikmRK484agh5m6ptPhML1cNseIpmG96hdjPeO+D9Hbwd3s++V0cOoNPPvGsoPIMX wM/tB/LF8eGIgl7mpnzxCMoslkB9XBTzXBw+eYpn4EF9JRkPkHZTAcM63Oylen0aEA3lb3wccDjlt h0YQdJtmR+2c6rBJm3CNjpgWVN7DrDhNYkTemfoZvvCM7llCholqUGCBLLuxk8yN+/UL1GgwQo9sw L4O8mm8kHDMaSwkmS/YkrM1mLf8P/fK33j3sqDnv9L3MFkbM/cDLTZBCrIvAOUulLEKSQ3AlBNnFn y2joP+v+pBd/Ig==; From: =?utf-8?Q?Ludovic_Court=C3=A8s?= <ludo@HIDDEN> To: Tomas Volf <~@wolfsden.cz> Subject: Re: [bug#74801] [PATCH v2] gnu: home: services: Add home-mpv-service-type. In-Reply-To: <ea877c6277825b1fc87a6d15c581975ef1a81167.1746204040.git.~@wolfsden.cz> (Tomas Volf's message of "Fri, 2 May 2025 18:40:40 +0200") References: <29d3cc661a49b7bef951041f8ec3c7600c9777a7.1733953822.git.~@wolfsden.cz> <ea877c6277825b1fc87a6d15c581975ef1a81167.1746204040.git.~@wolfsden.cz> User-Agent: mu4e 1.12.9; emacs 29.4 X-URL: https://people.bordeaux.inria.fr/lcourtes/ X-PGP-Fingerprint: 3CE4 6455 8A84 FDC6 9DB4 0CFB 090B 1199 3D9A EBB5 X-OS: x86_64-pc-linux-gnu X-Revolutionary-Date: Septidi 17 =?utf-8?Q?Flor=C3=A9al?= an 233 de la =?utf-8?Q?R=C3=A9volution=2C?= jour de la Pimprenelle Date: Tue, 06 May 2025 11:44:27 +0200 Message-ID: <87v7qevzt0.fsf@HIDDEN> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable X-Spam-Score: 0.2 (/) X-Debbugs-Envelope-To: 74801 Cc: Tanguy Le Carrour <tanguy@HIDDEN>, Maxim Cournoyer <maxim.cournoyer@HIDDEN>, Gabriel Wicki <gabriel@HIDDEN>, Andrew Tropin <andrew@HIDDEN>, Hilton Chain <hako@HIDDEN>, 74801 <at> debbugs.gnu.org, Janneke Nieuwenhuizen <janneke@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -3.3 (---) Hi, Tomas Volf <~@wolfsden.cz> writes: > This commit adds a new service type to generate configuration file for th= e mpv > media player. > > Originally I attempted to use Guix Records (via define-configuration) for > this, but ran into the bug #74748, so I had to switch to procedures inste= ad. > The usage is (hopefully) sufficiently described in the documentation. Wh= en > the bug is resolved, I will update it to use define-configuration instead. Is #74748 still a significant issue after 5b158ddca9425d79ea4ceb374003fe0f7e6bd336? (This v2 already takes quite a few seconds to build, so it might be a good starting point for profiling=E2=80=A6) > The full list of supported options is documented, however I decided to *n= ot* > document types and purpose for each individual fields. While I had mostly > working prototype to extract the documentation from mpv, once I realized = it > would be few 10k of lines added, I decided it is not worth it. It would = bloat > the .texi file (by more than 50%), be hard to maintain and, in my opinion, > would not provide enough value to justify that. The current version seems > like sane middle ground. Sounds reasonable. > Option to configure inputs (for mpv) will come later in a separate patch. OK. (I think this text is not meant for the commit log itself; you can instead write it after the --- line.) > +@deffn {Procedure} make-home-mpv-configuration > +Return a new instance of @code{home-mpv-configuration}. Available > +keyword arguments are: > + > +@table @asis > +@item @code{inherit} (default: @code{#t}) > +Inherit fields from an another instance. > + > +@item @code{global} (default: @code{(make-mpv-profile-configuration)}) > +The global configuration preceding all profiles. > + > +@item @code{profiles} (default: @code{()}) > +An alist containing configuration for any additional profiles to include > +in the configuration file. > + > +@lisp > +(make-home-mpv-configuration > + #:profiles `((fullscreen . ,(make-mpv-profile-configuration > + #:fullscreen #t)))) > +@end lisp > + > +@item @code{extra-config} (default: @code{#f}) > +Additional content to include in the configuration file. It is placed > +at the end of the file. Two minor stylistic issues: 1. We almost always drop the =E2=80=98make-=E2=80=99 bit from constructor= s, so I wonder whether we should do the same here (OTOH these procedures are different from the usual record constructors, so=E2=80=A6). 2. Please add question marks for boolean flags: #:inherit?, #:fullscreen?, etc. > +;;; Generated code - START. Could you include the code you used to generate the options? Apart from that it LGTM. Thanks, Ludo=E2=80=99.
guix-patches@HIDDEN
:bug#74801
; Package guix-patches
.
Full text available.Received: (at 74801) by debbugs.gnu.org; 2 May 2025 16:41:07 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 02 12:41:07 2025 Received: from localhost ([127.0.0.1]:60973 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1uAtRi-0005o0-OT for submit <at> debbugs.gnu.org; Fri, 02 May 2025 12:41:07 -0400 Received: from wolfsden.cz ([37.205.8.62]:36568) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from <~@wolfsden.cz>) id 1uAtRc-0005nG-CT for 74801 <at> debbugs.gnu.org; Fri, 02 May 2025 12:41:00 -0400 Received: by wolfsden.cz (Postfix, from userid 104) id 6EAA739AEE5; Fri, 2 May 2025 16:40:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail; t=1746204059; bh=ahpo2NoLNfq6QL7Pq8OXD9XJY8V1Ev0HRAqTPSXKNmk=; h=From:To:Cc:Subject:In-Reply-To:References:Date; b=YfCKGj4lcGk11zK/Er2MLPhVUOAeXHM74N6Ku5FnHId2dbAHN6CqW3ivyF4K2y0s0 byqM/HpVqS2epQraoiLQqieKBglQKr0qJgIhzBjrOZmFLgNhd4gLKOYOcikeZvUzkl peFFiVFK9q16v7T6EQXD/4VXt2U8fOmOy+AaSGsSTdgCg/wvb0TpiGaa7ROE0wECts Ug+XLt6VzvrrHuMBRpjXyX4JVdfksx64A+ipV32zrEEpgEVAGjd3T6hGYkrQ8cGnq9 rU0uZwwUY4ym8eX9WGjvQEy4wIrtbZ3XHLquVCj5wub0T23T09I8BZjpgqiGStsgHb 0NFG3RpWXC4yMCV7CSk4ZlfGHimh2zEuebBLYs05WSuKw+d8d1WMKf3ZdCy37E7VbX RHwdEMKu2FCE5uGQM6mC8i0cCcTSqGb8EBdmd+SuHmEtqj1D8O3Ko0S8FXxkOtKIhY +t9jCD7rcP27zvNNrlFQGOjvOnuclE4kZpSzVsCmhsxzRUBUg2eYgL1U3E6N9agYMX o3BkGDHFNjnZVfnJQAHmH1KCzyG+yHTsWJIORBqVtakxrHlAn4pTeGMc+bBtype7Bi V88TmKXk6PDyDb8nFlbZD8blowSWUqyOBAgzXGFo5Ns5lsv2ojmRaahTozPTWtMEKm TKijdW5qsRMcM6NMZ9fRHfZY= X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on wolfsden X-Spam-Level: X-Spam-Status: No, score=-3.1 required=5.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.6 Received: from localhost (unknown [128.0.188.242]) by wolfsden.cz (Postfix) with ESMTPSA id 3887839BE85; Fri, 2 May 2025 16:40:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail; t=1746204058; bh=ahpo2NoLNfq6QL7Pq8OXD9XJY8V1Ev0HRAqTPSXKNmk=; h=From:To:Cc:Subject:In-Reply-To:References:Date; b=MjqGf4ic7/LnjgXANyNHK36cCJu34QlH0FOyDKhUPdxfvM2tBOIXlAEHUkOudl7Ak RtzPuf4TzSqR4vDVXkSFXnJKXexDulr6AwxzSfCrY5eUOkFE3MiLVIYEKfnRuIHwyt nF5eMcSoK7ZZ/rJjkzCTCIfhv0H8D0DDOzuQgDXZCS+Clc0pUpV+UnOLNgE3lKy04T APOI64WgpLsq8XnbLZ/SXYD7djU66NoRbPDbL/fRd8YIdLgPTmLVlBa68KECB6CrwU 6apS0rTsy5RTpHVN6RhC+nll7KBoLiOVuIPCJAfpm9O8r4qgvZFin0J7ohwWlE+O7B SGKSMxO4yaGa+ncUBC/dIUh3j4lMXbVduzPwIEE9gs6aIUSExpriWlRlfw79cVfcDX UkUhp/X9AZ1KrX6mG3UbVuL9oOL0bkFNksib1xOow29ZAd7ZO3W2MZbrxBrdp0Onln MG3P+wnlqLJH989iCfZTzXXeYCzPc4kqeK8YC/caxBeRMvButUxyejtUuLQAe7uKip kP23NWq6QMItQXhi6l+uD2dqykWRFyAjBOQTlor1zp+TR+KQAooRfYKYv89dra73/D 26a7Vs8t/2rkAkPeu+QqLn26QRzDmFEI+T4uAZm4S1z7YRj+wCIa0OA84fqCpRsxKA tiMSmRjBAgwrSeOmPnUq12OE= From: Tomas Volf <~@wolfsden.cz> To: Maxim Cournoyer <maxim.cournoyer@HIDDEN> Subject: Re: bug#74801: [PATCH] gnu: home: services: Add home-mpv-service-type. In-Reply-To: <87tt6fxwpc.fsf_-_@HIDDEN> (Maxim Cournoyer's message of "Wed, 23 Apr 2025 14:39:59 +0900") References: <29d3cc661a49b7bef951041f8ec3c7600c9777a7.1733953822.git.~@wolfsden.cz> <50f9a741440bc9b89ecdabcd7afb3a324173f7f9.1743602733.git.~@wolfsden.cz> <87y0whxtpx.fsf@HIDDEN> <87mscxw6fa.fsf@HIDDEN> <87tt6fxwpc.fsf_-_@HIDDEN> Date: Fri, 02 May 2025 18:40:58 +0200 Message-ID: <87frhn2cf9.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 74801 Cc: 74801 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -1.0 (-) Maxim Cournoyer <maxim.cournoyer@HIDDEN> writes: > Hi Tomas, > > Tomas Volf <~@wolfsden.cz> writes: > > [...] > >>>> + >>>> +;;; >>>> +;;; Basic types. >>>> +;;; >>>> +(define (serialize-type/boolean field-name value) >>> >>> Nitpick: it's more common in the code base to name serializers as >>> 'serialize-boolean'; it'd be nicer to stick to that naming style, for >>> consistency. >> >> But it does follow the same pattern. The type is named type/boolean. >> So the pattern of serialize-$TYPE results in serialize-type/boolean. >> Without the type/ prefix I would run into collisions, since I need a >> predicate for an integer (type/integer?), but integer? is already a >> procedure doing something else. I am not sure I want to shadow it. >> >> Hm, would it make it better for you if I replaced the type/ prefix with >> mpv/ prefix? So mpv/integer, instead of type/integer? That would >> result in serialize-mpv/boolean, which might be better in your eyes? > > I think that'd be more precise naming yes, if there's a valid reason > that mpv/integer? != integer? (which I'm sure there is since you went to > the trouble of defining it!) Well, mpv/integer is basically an integer with additional range check. --8<---------------cut here---------------start------------->8--- (define (mpv/integer? n) ;; We assume integer is a signed 32bit number. (and-let* (((integer? n)) ((>= n (* -1 (expt 2 (1- 32))))) ((<= n (1- (expt 2 (1- 32)))))))) --8<---------------cut here---------------end--------------->8--- On the other hand, for e.g. mpv/boolean there is nothing extra to check, so it is just a matter of consistency to have all "types" sharing the same naming pattern. I have renamed all the type/ to mpv/, so hopefully you will find the new version better. :) >>> >>> Could you send a v2 with the above taken into consideration? >> >> Once I know what to do with the type/..., will send. :) > > Sorry for the delay. Now you know :-). And sorry for the delay from my side. :) I really appreciate you taking the time to do the review, and have now sent a v2 hopefully addressing all your concerns. Have a nice day, Tomas -- There are only two hard things in Computer Science: cache invalidation, naming things and off-by-one errors.
guix-patches@HIDDEN
:bug#74801
; Package guix-patches
.
Full text available.Received: (at 74801) by debbugs.gnu.org; 2 May 2025 16:41:06 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Fri May 02 12:41:06 2025 Received: from localhost ([127.0.0.1]:60971 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1uAtRd-0005nR-FA for submit <at> debbugs.gnu.org; Fri, 02 May 2025 12:41:06 -0400 Received: from wolfsden.cz ([37.205.8.62]:40634) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from <~@wolfsden.cz>) id 1uAtRV-0005my-GA for 74801 <at> debbugs.gnu.org; Fri, 02 May 2025 12:40:59 -0400 Received: by wolfsden.cz (Postfix, from userid 104) id A3BCF39BE84; Fri, 2 May 2025 16:40:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail; t=1746204051; bh=mjomtBKYCMsbZxvKtWQC7f7yJyt0aAMiM1VMLAaB2Ao=; h=From:To:Cc:Subject:Date; b=tbvOwTNaLR7wzy1J+2ViIwDiZ1pWDxgdE2EmIRqClnvzbGwv3/s9UqyNHJ9LCyPZJ DjkhgTWnleWnKxCYdTEmW300H9MvwETyFsMItqPET+P4oxQ32wac/SCpSR+/9Ol72u 9JxHzkGDlh+0tIdowkM+waP+KkwccTJTN3wvottiinCLyH/EHOUA/OF/DJi0HFLnNJ QR0ej1dLcX60rPHsL5BI/UuHMXpevftRkuxrARDmDk8J6XrLqqOu9lqubUSjUJtNqf vFC94KWJ8SJA2MTlvnUglRxcLjzT9ZQE7cVNv2Imh2ZTrpzZh30/+OZGmJi6GFsZAU bnn2MMVmJWPtULMo50z7axp9RZEyxUeMEjGxU9iyUnZomv+p97lbcNbWrJM/UiNfLg QZeI65UhoRHX5KWKv3yatAWZR6bHEuiz+hvxPrUVo3FJrwG0Q9QdssmKPsgShI4irx OfLgu1ez8ZHZ4H/KYyfgFNbf4KtsDtMCxkgpE3NSAFZ829su1NK7m9gaJmh18ATgoj U+wM+Ei71i7QdKtBHu9qwik42Bqfo0U3/wosOQ4NiiMsPF1pnA5KRui/RkZ7Rf2O0/ kbUI5udsjpoUArp++oeU9fx8xjHiViC0XK3qOCasMajk0RIuohBMG3QpYHa+afAnqo HRIs6t+WVpeExadBStGTl+cg= X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on wolfsden X-Spam-Level: X-Spam-Status: No, score=-3.1 required=5.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,URIBL_BLOCKED autolearn=unavailable autolearn_force=no version=3.4.6 Received: from localhost (unknown [128.0.188.242]) by wolfsden.cz (Postfix) with ESMTPSA id DABBE39AFC4; Fri, 2 May 2025 16:40:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail; t=1746204046; bh=mjomtBKYCMsbZxvKtWQC7f7yJyt0aAMiM1VMLAaB2Ao=; h=From:To:Cc:Subject:Date; b=MotxCwUCmnYz5FCRGKxbrnVQ68kNuej+w7mf5KTayJU4sqxRwlvtLm37Cp2zEzyH7 V04uquY0SKEQ74Y6u46976gW/sB6NZ/YB+9v9J1Gj0bMqWQX+jg4WtHPGQjGOVZJYP 9YpWpVT19UwJZoNLL1RO4/NJ5Xnm51EZLkJ+mW0oO1lU9Q8qlOeDp2ucNg2oh0kcL2 wqWuSutgS+LU462sehy3GdN9BE5nIHVr9gLbk8yeYAd7z4BfbMXhFQ3WJf/O7WxKc3 gFrj/UUmi/++8crqm6u0syybYSJgwgIH9roMRNf702Sy9m9CU8ElrcF/HmhBvNAcAO SqeNhjz3Y0vyhN5d+1oLOZ6N+WV5pJqAMk5c6Y9M2279NFM1jMAQknhE44epRGRXp9 eiMlQ2YipzhjoGc8V/uk8GVXWZiR3OqNUOt7GqGqnYT3REf5apDPlaC8rrhowCWASw hRC86wnM/z9xr/FmMxl0gt1M6tpUygkc3tVQFa+OBOxnHBmBTqTinMUTkZPlM0Shpo sPAf7ybk2c0bz2h8hp6BqbwPSz6TGNVCZLVraBBa0dIfU+FDwgHb9isX4Tj+pSftYa 9eDFGCzX4Isu5E9cg5xB+TdrzJA6VvybniYvmfG9el8C6yoQx/+uFvbsL7Y/pbgEQ3 XHb5qCJAks9PMX+X8wJhtjvw= From: Tomas Volf <~@wolfsden.cz> To: 74801 <at> debbugs.gnu.org Subject: [PATCH v2] gnu: home: services: Add home-mpv-service-type. Date: Fri, 2 May 2025 18:40:40 +0200 Message-ID: <ea877c6277825b1fc87a6d15c581975ef1a81167.1746204040.git.~@wolfsden.cz> X-Mailer: git-send-email 2.49.0 MIME-Version: 1.0 X-Debbugs-Cc: Andrew Tropin <andrew@HIDDEN>, Gabriel Wicki <gabriel@HIDDEN>, Hilton Chain <hako@HIDDEN>, Janneke Nieuwenhuizen <janneke@HIDDEN>, Ludovic Courtès <ludo@HIDDEN>, Maxim Cournoyer <maxim.cournoyer@HIDDEN>, Tanguy Le Carrour <tanguy@HIDDEN> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 74801 Cc: Tomas Volf <~@wolfsden.cz> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -1.0 (-) This commit adds a new service type to generate configuration file for the mpv media player. Originally I attempted to use Guix Records (via define-configuration) for this, but ran into the bug #74748, so I had to switch to procedures instead. The usage is (hopefully) sufficiently described in the documentation. When the bug is resolved, I will update it to use define-configuration instead. The full list of supported options is documented, however I decided to *not* document types and purpose for each individual fields. While I had mostly working prototype to extract the documentation from mpv, once I realized it would be few 10k of lines added, I decided it is not worth it. It would bloat the .texi file (by more than 50%), be hard to maintain and, in my opinion, would not provide enough value to justify that. The current version seems like sane middle ground. Option to configure inputs (for mpv) will come later in a separate patch. * gnu/home/services/mpv.scm: New file. * gnu/local.mk (GNU_SYSTEM_MODULES): Register it. * doc/guix.texi (mpv Media Player): Document it. Change-Id: I2deb44799a28047cb5d67da97dc6007a9df873af --- doc/guix.texi | 427 ++++++ gnu/home/services/mpv.scm | 2746 +++++++++++++++++++++++++++++++++++++ gnu/local.mk | 1 + 3 files changed, 3174 insertions(+) create mode 100644 gnu/home/services/mpv.scm diff --git a/doc/guix.texi b/doc/guix.texi index 90d90b2e1e..325a0287a6 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -50711,6 +50711,433 @@ Media Home Services @end table @end deftp +@c This is ugly, but upstream does *not* capitalize the ``m'' even when +@c at the beginning of a sentence. So let us follow the branding. +@node mpv Media Player +@subsection mpv Media Player + +@cindex mpv, Home Service +@cindex mpv, configuration +Configuring the @uref{https://mpv.io/, mpv media player} can be somewhat +daunting task, due to the sheer amount of options available, especially +if one wants to be able to inherit the configuration in their code. The +@code{home-mpv-service-type} is provided to help with that problem. +When the service is added to your home environment, file based on the +passed configuration is generated and placed into the correct location. + +Due to the bug #74748, it does not use Guix Records to represent the +configuration, but uses keyword arguments to achieve similar result. +Example follows: + +@lisp +(service home-mpv-service-type + (make-home-mpv-configuration + #:global (make-mpv-profile-configuration + #:fullscreen #t + #:alang '("jpn" "eng")))) +@end lisp + +@defvar home-mpv-service-type +This is the type of the mpv home service, whose value is a +@code{home-mpv-configuration} object. +@end defvar + +@deffn {Procedure} make-home-mpv-configuration +Return a new instance of @code{home-mpv-configuration}. Available +keyword arguments are: + +@table @asis +@item @code{inherit} (default: @code{#t}) +Inherit fields from an another instance. + +@item @code{global} (default: @code{(make-mpv-profile-configuration)}) +The global configuration preceding all profiles. + +@item @code{profiles} (default: @code{()}) +An alist containing configuration for any additional profiles to include +in the configuration file. + +@lisp +(make-home-mpv-configuration + #:profiles `((fullscreen . ,(make-mpv-profile-configuration + #:fullscreen #t)))) +@end lisp + +@item @code{extra-config} (default: @code{#f}) +Additional content to include in the configuration file. It is placed +at the end of the file. + +@end table +@end deffn + +@deffn {Procedure} make-mpv-profile-configuration +Return a new instance of @code{mpv-profile-configuration}. As above, it +also supports the @code{#:inherit} argument. Additionally it supports +keyword arguments named after the options of @command{mpv}. Hence +@option{--fullscreen} (or @code{fullscreen} in the configuration file) +becomes @code{#:fullscreen}. + +Few options are using their aliases instead. @option{audio} instead of +@option{aid}, @option{video} instead of @option{vid}, @option{sub} +instead of @option{sid}, @option{screenshot-directory} instead of +@option{screenshot-dir} and @option{watch-later-directory} instead of +@option{watch-later-dir}. + +Valid values for the fields depend on their type. + +@table @asis +@item Flags +The value should be @code{#f} or @code{#t}. + +@item Numerical fields +Integer and integer64 fields are validated by @code{integer?}, float and +double fields by @code{real?}. Ranges are checked when applicable. + +@item Aspect +Same as integer. + +@item ByteSize +Same as integer64. + +@item Choice +The value should be a symbol representing member of the enumeration. If +the choice has @samp{or ...} part, it can also be value of that +alternative type. + +@item @var{type} list +The value should be a list of the @var{type}. + +@end table + +Other types accept strings, with validation of the values where possible +(e.g. type @samp{Color} is validated, but type @samp{Audio channels or +channel map} is not). + +The full list of currently supported keyword arguments is below. For +the types, allowed values and full description please refer to the +@command{mpv --list-options} and +@uref{https://mpv.io/manual/stable/#options, mpv manual}. + +Only set fields are outputted to the configuration file. Accessors are +provided for every field, returning either their value or a sentinel +object @code{%unset-value} (from @code{(gnu services configuration)}). + +@code{ab-loop-a}, @code{ab-loop-b}, @code{ab-loop-count}, +@code{access-references}, @code{ad}, @code{ad-lavc-ac3drc}, +@code{ad-lavc-downmix}, @code{ad-lavc-o}, @code{ad-lavc-threads}, +@code{ad-queue-enable}, @code{ad-queue-max-bytes}, +@code{ad-queue-max-samples}, @code{ad-queue-max-secs}, @code{af}, +@code{audio}, @code{alang}, @code{allow-delayed-peak-detect}, +@code{alsa-buffer-time}, @code{alsa-ignore-chmap}, +@code{alsa-mixer-device}, @code{alsa-mixer-index}, +@code{alsa-mixer-name}, @code{alsa-non-interleaved}, +@code{alsa-periods}, @code{alsa-resample}, @code{ao}, +@code{ao-null-broken-delay}, @code{ao-null-broken-eof}, +@code{ao-null-buffer}, @code{ao-null-channel-layouts}, +@code{ao-null-format}, @code{ao-null-latency}, @code{ao-null-outburst}, +@code{ao-null-speed}, @code{ao-null-untimed}, @code{ao-pcm-append}, +@code{ao-pcm-file}, @code{ao-pcm-waveheader}, +@code{audio-backward-batch}, @code{audio-backward-overlap}, +@code{audio-buffer}, @code{audio-channels}, @code{audio-client-name}, +@code{audio-delay}, @code{audio-demuxer}, @code{audio-device}, +@code{audio-display}, @code{audio-exclusive}, @code{audio-exts}, +@code{audio-fallback-to-null}, @code{audio-file-auto}, +@code{audio-file-paths}, @code{audio-files}, @code{audio-format}, +@code{audio-normalize-downmix}, @code{audio-pitch-correction}, +@code{audio-resample-cutoff}, @code{audio-resample-filter-size}, +@code{audio-resample-linear}, @code{audio-resample-max-output-size}, +@code{audio-resample-phase-shift}, @code{audio-reversal-buffer}, +@code{audio-samplerate}, @code{audio-spdif}, +@code{audio-stream-silence}, @code{audio-swresample-o}, +@code{audio-wait-open}, @code{auto-window-resize}, +@code{autocreate-playlist}, @code{autofit}, @code{autofit-larger}, +@code{autofit-smaller}, @code{autoload-files}, @code{autosync}, +@code{background}, @code{background-color}, @code{blend-subtitles}, +@code{bluray-device}, @code{border}, @code{border-background}, +@code{brightness}, @code{cache}, @code{cache-on-disk}, +@code{cache-pause}, @code{cache-pause-initial}, @code{cache-pause-wait}, +@code{cache-secs}, @code{cdda-cdtext}, @code{cdda-device}, +@code{cdda-overlap}, @code{cdda-paranoia}, @code{cdda-sector-size}, +@code{cdda-skip}, @code{cdda-span-a}, @code{cdda-span-b}, +@code{cdda-speed}, @code{cdda-toc-offset}, +@code{chapter-merge-threshold}, @code{chapter-seek-threshold}, +@code{chapters-file}, @code{config}, @code{container-fps-override}, +@code{contrast}, @code{cookies}, @code{cookies-file}, +@code{corner-rounding}, @code{correct-downscaling}, @code{correct-pts}, +@code{cover-art-auto}, @code{cover-art-files}, +@code{cover-art-whitelist}, @code{cscale}, @code{cscale-antiring}, +@code{cscale-blur}, @code{cscale-clamp}, @code{cscale-param1}, +@code{cscale-param2}, @code{cscale-radius}, @code{cscale-taper}, +@code{cscale-window}, @code{cscale-wparam}, @code{cscale-wtaper}, +@code{cursor-autohide}, @code{cursor-autohide-fs-only}, @code{deband}, +@code{deband-grain}, @code{deband-iterations}, @code{deband-range}, +@code{deband-threshold}, @code{deinterlace}, +@code{deinterlace-field-parity}, @code{demuxer}, +@code{demuxer-backward-playback-step}, @code{demuxer-cache-dir}, +@code{demuxer-cache-unlink-files}, @code{demuxer-cache-wait}, +@code{demuxer-donate-buffer}, @code{demuxer-hysteresis-secs}, +@code{demuxer-lavf-allow-mimetype}, @code{demuxer-lavf-analyzeduration}, +@code{demuxer-lavf-buffersize}, @code{demuxer-lavf-format}, +@code{demuxer-lavf-hacks}, @code{demuxer-lavf-linearize-timestamps}, +@code{demuxer-lavf-o}, @code{demuxer-lavf-probe-info}, +@code{demuxer-lavf-probescore}, @code{demuxer-lavf-probesize}, +@code{demuxer-lavf-propagate-opts}, @code{demuxer-max-back-bytes}, +@code{demuxer-max-bytes}, @code{demuxer-mkv-probe-start-time}, +@code{demuxer-mkv-probe-video-duration}, +@code{demuxer-mkv-subtitle-preroll}, +@code{demuxer-mkv-subtitle-preroll-secs}, +@code{demuxer-mkv-subtitle-preroll-secs-index}, +@code{demuxer-rawaudio-channels}, @code{demuxer-rawaudio-format}, +@code{demuxer-rawaudio-rate}, @code{demuxer-rawvideo-codec}, +@code{demuxer-rawvideo-format}, @code{demuxer-rawvideo-fps}, +@code{demuxer-rawvideo-h}, @code{demuxer-rawvideo-mp-format}, +@code{demuxer-rawvideo-size}, @code{demuxer-rawvideo-w}, +@code{demuxer-readahead-secs}, @code{demuxer-seekable-cache}, +@code{demuxer-termination-timeout}, @code{demuxer-thread}, +@code{directory-filter-types}, @code{directory-mode}, +@code{display-fps-override}, @code{display-tags}, @code{dither}, +@code{dither-depth}, @code{dither-size-fruit}, @code{drag-and-drop}, +@code{drm-connector}, @code{drm-device}, @code{drm-draw-plane}, +@code{drm-draw-surface-size}, @code{drm-drmprime-video-plane}, +@code{drm-format}, @code{drm-mode}, @code{drm-vrr-enabled}, +@code{dscale}, @code{dscale-antiring}, @code{dscale-blur}, +@code{dscale-clamp}, @code{dscale-param1}, @code{dscale-param2}, +@code{dscale-radius}, @code{dscale-taper}, @code{dscale-window}, +@code{dscale-wparam}, @code{dscale-wtaper}, @code{dump-stats}, +@code{dvbin-card}, @code{dvbin-channel-switch-offset}, +@code{dvbin-file}, @code{dvbin-full-transponder}, @code{dvbin-prog}, +@code{dvbin-timeout}, @code{dvd-angle}, @code{dvd-device}, +@code{dvd-speed}, @code{edition}, @code{egl-config-id}, +@code{egl-output-format}, @code{embeddedfonts}, @code{end}, +@code{error-diffusion}, @code{external-files}, @code{fbo-format}, +@code{focus-on}, @code{force-media-title}, @code{force-render}, +@code{force-rgba-osd-rendering}, @code{force-seekable}, +@code{force-window}, @code{force-window-position}, @code{framedrop}, +@code{frames}, @code{fs-screen}, @code{fs-screen-name}, +@code{fullscreen}, @code{gamma}, @code{gamma-auto}, @code{gamma-factor}, +@code{gamut-mapping-mode}, @code{gapless-audio}, @code{geometry}, +@code{glsl-shader-opts}, @code{glsl-shaders}, @code{gpu-api}, +@code{gpu-context}, @code{gpu-debug}, @code{gpu-dumb-mode}, +@code{gpu-hwdec-interop}, @code{gpu-shader-cache}, +@code{gpu-shader-cache-dir}, @code{gpu-sw}, @code{gpu-tex-pad-x}, +@code{gpu-tex-pad-y}, @code{hdr-compute-peak}, +@code{hdr-contrast-recovery}, @code{hdr-contrast-smoothness}, +@code{hdr-peak-decay-rate}, @code{hdr-peak-percentile}, +@code{hdr-scene-threshold-high}, @code{hdr-scene-threshold-low}, +@code{hidpi-window-scale}, @code{hls-bitrate}, @code{hr-seek}, +@code{hr-seek-demuxer-offset}, @code{hr-seek-framedrop}, +@code{http-header-fields}, @code{http-proxy}, @code{hue}, @code{hwdec}, +@code{hwdec-codecs}, @code{hwdec-extra-frames}, +@code{hwdec-image-format}, @code{icc-3dlut-size}, @code{icc-cache}, +@code{icc-cache-dir}, @code{icc-force-contrast}, @code{icc-intent}, +@code{icc-profile}, @code{icc-profile-auto}, @code{icc-use-luma}, +@code{idle}, @code{ignore-path-in-watch-later-config}, +@code{image-display-duration}, @code{image-exts}, @code{image-lut}, +@code{image-lut-type}, @code{image-subs-video-resolution}, +@code{include}, @code{index}, @code{initial-audio-sync}, +@code{input-ar-delay}, @code{input-ar-rate}, +@code{input-builtin-bindings}, @code{input-builtin-dragging}, +@code{input-commands}, @code{input-conf}, @code{input-cursor}, +@code{input-cursor-passthrough}, @code{input-default-bindings}, +@code{input-doubleclick-time}, @code{input-dragging-deadzone}, +@code{input-ipc-client}, @code{input-ipc-server}, +@code{input-key-fifo-size}, @code{input-media-keys}, +@code{input-preprocess-wheel}, @code{input-right-alt-gr}, +@code{input-terminal}, @code{input-test}, +@code{input-touch-emulate-mouse}, @code{input-vo-keyboard}, +@code{interpolation}, @code{interpolation-preserve}, +@code{interpolation-threshold}, @code{inverse-tone-mapping}, +@code{jack-autostart}, @code{jack-connect}, @code{jack-name}, +@code{jack-port}, @code{jack-std-channel-layout}, @code{keep-open}, +@code{keep-open-pause}, @code{keepaspect}, @code{keepaspect-window}, +@code{lavfi-complex}, @code{length}, @code{libplacebo-opts}, +@code{linear-downscaling}, @code{linear-upscaling}, +@code{load-auto-profiles}, @code{load-osd-console}, @code{load-scripts}, +@code{load-select}, @code{load-stats-overlay}, +@code{load-unsafe-playlists}, @code{log-file}, @code{loop-file}, +@code{loop-playlist}, @code{lut}, @code{lut-type}, @code{mc}, +@code{media-controls}, @code{merge-files}, @code{metadata-codepage}, +@code{mf-fps}, @code{mf-type}, @code{monitoraspect}, +@code{monitorpixelaspect}, @code{msg-color}, @code{msg-level}, +@code{msg-module}, @code{msg-time}, @code{mute}, @code{native-fs}, +@code{native-keyrepeat}, @code{native-touch}, @code{network-timeout}, +@code{oac}, @code{oacopts}, @code{ocopy-metadata}, @code{of}, +@code{ofopts}, @code{on-all-workspaces}, @code{ontop}, +@code{ontop-level}, @code{opengl-check-pattern-a}, +@code{opengl-check-pattern-b}, @code{opengl-early-flush}, +@code{opengl-es}, @code{opengl-glfinish}, @code{opengl-pbo}, +@code{opengl-rectangle-textures}, @code{opengl-swapinterval}, +@code{opengl-waitvsync}, @code{orawts}, @code{ordered-chapters}, +@code{ordered-chapters-files}, @code{oremove-metadata}, @code{osc}, +@code{osd-align-x}, @code{osd-align-y}, @code{osd-back-color}, +@code{osd-bar}, @code{osd-bar-align-x}, @code{osd-bar-align-y}, +@code{osd-bar-h}, @code{osd-bar-outline-size}, @code{osd-bar-w}, +@code{osd-blur}, @code{osd-bold}, @code{osd-border-style}, +@code{osd-color}, @code{osd-duration}, @code{osd-font}, +@code{osd-font-provider}, @code{osd-font-size}, @code{osd-fonts-dir}, +@code{osd-fractions}, @code{osd-italic}, @code{osd-justify}, +@code{osd-level}, @code{osd-margin-x}, @code{osd-margin-y}, +@code{osd-msg1}, @code{osd-msg2}, @code{osd-msg3}, @code{osd-on-seek}, +@code{osd-outline-color}, @code{osd-outline-size}, +@code{osd-playing-msg}, @code{osd-playing-msg-duration}, +@code{osd-playlist-entry}, @code{osd-scale}, @code{osd-scale-by-window}, +@code{osd-shadow-offset}, @code{osd-spacing}, @code{osd-status-msg}, +@code{oset-metadata}, @code{ovc}, @code{ovcopts}, @code{panscan}, +@code{pause}, @code{pipewire-buffer}, @code{pipewire-remote}, +@code{pipewire-volume-mode}, @code{pitch}, @code{play-direction}, +@code{player-operation-mode}, @code{playlist-start}, +@code{prefetch-playlist}, @code{profile}, @code{pulse-allow-suspended}, +@code{pulse-buffer}, @code{pulse-host}, @code{pulse-latency-hacks}, +@code{quiet}, @code{really-quiet}, @code{rebase-start-time}, +@code{referrer}, @code{replaygain}, @code{replaygain-clip}, +@code{replaygain-fallback}, @code{replaygain-preamp}, +@code{reset-on-next-file}, @code{resume-playback}, +@code{resume-playback-check-mtime}, @code{rtsp-transport}, +@code{saturation}, @code{save-position-on-quit}, @code{scale}, +@code{scale-antiring}, @code{scale-blur}, @code{scale-clamp}, +@code{scale-param1}, @code{scale-param2}, @code{scale-radius}, +@code{scale-taper}, @code{scale-window}, @code{scale-wparam}, +@code{scale-wtaper}, @code{scaler-resizes-only}, @code{screen}, +@code{screen-name}, @code{screenshot-avif-encoder}, +@code{screenshot-avif-opts}, @code{screenshot-avif-pixfmt}, +@code{screenshot-directory}, @code{screenshot-format}, +@code{screenshot-high-bit-depth}, @code{screenshot-jpeg-quality}, +@code{screenshot-jpeg-source-chroma}, @code{screenshot-jxl-distance}, +@code{screenshot-jxl-effort}, @code{screenshot-png-compression}, +@code{screenshot-png-filter}, @code{screenshot-sw}, +@code{screenshot-tag-colorspace}, @code{screenshot-template}, +@code{screenshot-webp-compression}, @code{screenshot-webp-lossless}, +@code{screenshot-webp-quality}, @code{script-opts}, @code{scripts}, +@code{secondary-sid}, @code{secondary-sub-ass-override}, +@code{secondary-sub-delay}, @code{secondary-sub-pos}, +@code{secondary-sub-visibility}, @code{sharpen}, @code{show-in-taskbar}, +@code{shuffle}, @code{sub}, @code{sigmoid-center}, @code{sigmoid-slope}, +@code{sigmoid-upscaling}, @code{slang}, @code{snap-window}, +@code{speed}, @code{spirv-compiler}, @code{sstep}, @code{start}, +@code{stop-playback-on-init-failure}, @code{stop-screensaver}, +@code{stream-buffer-size}, @code{stream-dump}, @code{stream-lavf-o}, +@code{stream-record}, @code{stretch-dvd-subs}, +@code{stretch-image-subs-to-screen}, @code{sub-align-x}, +@code{sub-align-y}, @code{sub-ass}, @code{sub-ass-force-margins}, +@code{sub-ass-hinting}, @code{sub-ass-justify}, +@code{sub-ass-line-spacing}, @code{sub-ass-override}, +@code{sub-ass-scale-with-window}, @code{sub-ass-shaper}, +@code{sub-ass-style-overrides}, @code{sub-ass-styles}, +@code{sub-ass-use-video-data}, @code{sub-ass-video-aspect-override}, +@code{sub-ass-vsfilter-color-compat}, @code{sub-auto}, +@code{sub-auto-exts}, @code{sub-back-color}, @code{sub-blur}, +@code{sub-bold}, @code{sub-border-style}, @code{sub-clear-on-seek}, +@code{sub-codepage}, @code{sub-color}, @code{sub-create-cc-track}, +@code{sub-delay}, @code{sub-demuxer}, @code{sub-file-paths}, +@code{sub-files}, @code{sub-filter-jsre}, @code{sub-filter-regex}, +@code{sub-filter-regex-enable}, @code{sub-filter-regex-plain}, +@code{sub-filter-regex-warn}, @code{sub-filter-sdh}, +@code{sub-filter-sdh-enclosures}, @code{sub-filter-sdh-harder}, +@code{sub-fix-timing}, @code{sub-font}, @code{sub-font-provider}, +@code{sub-font-size}, @code{sub-fonts-dir}, +@code{sub-forced-events-only}, @code{sub-fps}, @code{sub-gauss}, +@code{sub-gray}, @code{sub-italic}, @code{sub-justify}, +@code{sub-lavc-o}, @code{sub-margin-x}, @code{sub-margin-y}, +@code{sub-outline-color}, @code{sub-outline-size}, +@code{sub-past-video-end}, @code{sub-pos}, @code{sub-scale}, +@code{sub-scale-by-window}, @code{sub-scale-with-window}, +@code{sub-shadow-offset}, @code{sub-spacing}, @code{sub-speed}, +@code{sub-stretch-durations}, @code{sub-use-margins}, +@code{sub-visibility}, @code{sub-vsfilter-bidi-compat}, +@code{subs-fallback}, @code{subs-fallback-forced}, +@code{subs-match-os-language}, @code{subs-with-matching-audio}, +@code{swapchain-depth}, @code{sws-allow-zimg}, @code{sws-bitexact}, +@code{sws-cgb}, @code{sws-chs}, @code{sws-cs}, @code{sws-cvs}, +@code{sws-fast}, @code{sws-lgb}, @code{sws-ls}, @code{sws-scaler}, +@code{target-colorspace-hint}, @code{target-contrast}, +@code{target-gamut}, @code{target-lut}, @code{target-peak}, +@code{target-prim}, @code{target-trc}, @code{taskbar-progress}, +@code{teletext-page}, @code{temporal-dither}, +@code{temporal-dither-period}, @code{term-osd}, @code{term-osd-bar}, +@code{term-osd-bar-chars}, @code{term-playing-msg}, +@code{term-status-msg}, @code{term-title}, @code{terminal}, +@code{title}, @code{title-bar}, @code{tls-ca-file}, +@code{tls-cert-file}, @code{tls-key-file}, @code{tls-verify}, +@code{tone-mapping}, @code{tone-mapping-max-boost}, +@code{tone-mapping-param}, @code{tone-mapping-visualize}, +@code{track-auto-selection}, @code{tscale}, @code{tscale-antiring}, +@code{tscale-blur}, @code{tscale-clamp}, @code{tscale-param1}, +@code{tscale-param2}, @code{tscale-radius}, @code{tscale-taper}, +@code{tscale-window}, @code{tscale-wparam}, @code{tscale-wtaper}, +@code{untimed}, @code{use-embedded-icc-profile}, +@code{use-filedir-conf}, @code{user-agent}, @code{vaapi-device}, +@code{vd}, @code{vd-apply-cropping}, @code{vd-lavc-assume-old-x264}, +@code{vd-lavc-bitexact}, @code{vd-lavc-check-hw-profile}, +@code{vd-lavc-dr}, @code{vd-lavc-fast}, @code{vd-lavc-film-grain}, +@code{vd-lavc-framedrop}, @code{vd-lavc-o}, @code{vd-lavc-show-all}, +@code{vd-lavc-skipframe}, @code{vd-lavc-skipidct}, +@code{vd-lavc-skiploopfilter}, @code{vd-lavc-software-fallback}, +@code{vd-lavc-threads}, @code{vd-queue-enable}, +@code{vd-queue-max-bytes}, @code{vd-queue-max-samples}, +@code{vd-queue-max-secs}, @code{vf}, @code{video}, @code{video-align-x}, +@code{video-align-y}, @code{video-aspect-method}, +@code{video-aspect-override}, @code{video-backward-batch}, +@code{video-backward-overlap}, @code{video-crop}, @code{video-exts}, +@code{video-latency-hacks}, @code{video-margin-ratio-bottom}, +@code{video-margin-ratio-left}, @code{video-margin-ratio-right}, +@code{video-margin-ratio-top}, @code{video-osd}, +@code{video-output-levels}, @code{video-pan-x}, @code{video-pan-y}, +@code{video-reversal-buffer}, @code{video-rotate}, @code{video-scale-x}, +@code{video-scale-y}, @code{video-sync}, +@code{video-sync-max-audio-change}, @code{video-sync-max-factor}, +@code{video-sync-max-video-change}, @code{video-timing-offset}, +@code{video-unscaled}, @code{video-zoom}, @code{vlang}, @code{vo}, +@code{vo-image-avif-encoder}, @code{vo-image-avif-opts}, +@code{vo-image-avif-pixfmt}, @code{vo-image-format}, +@code{vo-image-high-bit-depth}, @code{vo-image-jpeg-quality}, +@code{vo-image-jpeg-source-chroma}, @code{vo-image-jxl-distance}, +@code{vo-image-jxl-effort}, @code{vo-image-outdir}, +@code{vo-image-png-compression}, @code{vo-image-png-filter}, +@code{vo-image-tag-colorspace}, @code{vo-image-webp-compression}, +@code{vo-image-webp-lossless}, @code{vo-image-webp-quality}, +@code{vo-kitty-alt-screen}, @code{vo-kitty-cols}, +@code{vo-kitty-config-clear}, @code{vo-kitty-height}, +@code{vo-kitty-left}, @code{vo-kitty-rows}, @code{vo-kitty-top}, +@code{vo-kitty-use-shm}, @code{vo-kitty-width}, @code{vo-null-fps}, +@code{vo-sixel-alt-screen}, @code{vo-sixel-buffered}, +@code{vo-sixel-cols}, @code{vo-sixel-config-clear}, +@code{vo-sixel-dither}, @code{vo-sixel-fixedpalette}, +@code{vo-sixel-height}, @code{vo-sixel-left}, @code{vo-sixel-pad-x}, +@code{vo-sixel-pad-y}, @code{vo-sixel-reqcolors}, @code{vo-sixel-rows}, +@code{vo-sixel-threshold}, @code{vo-sixel-top}, @code{vo-sixel-width}, +@code{vo-tct-256}, @code{vo-tct-algo}, @code{vo-tct-buffering}, +@code{vo-tct-height}, @code{vo-tct-width}, @code{vo-vaapi-scaled-osd}, +@code{vo-vaapi-scaling}, @code{vo-vdpau-chroma-deint}, +@code{vo-vdpau-colorkey}, @code{vo-vdpau-composite-detect}, +@code{vo-vdpau-denoise}, @code{vo-vdpau-force-yuv}, @code{vo-vdpau-fps}, +@code{vo-vdpau-hqscaling}, @code{vo-vdpau-output-surfaces}, +@code{vo-vdpau-pullup}, @code{vo-vdpau-queuetime-fs}, +@code{vo-vdpau-queuetime-windowed}, @code{vo-vdpau-sharpen}, +@code{volume}, @code{volume-gain}, @code{volume-gain-max}, +@code{volume-gain-min}, @code{volume-max}, @code{vulkan-async-compute}, +@code{vulkan-async-transfer}, @code{vulkan-device}, +@code{vulkan-display-display}, @code{vulkan-display-mode}, +@code{vulkan-display-plane}, @code{vulkan-queue-count}, +@code{vulkan-swap-mode}, @code{watch-later-directory}, +@code{watch-later-options}, @code{wayland-app-id}, +@code{wayland-configure-bounds}, @code{wayland-content-type}, +@code{wayland-disable-vsync}, @code{wayland-edge-pixels-pointer}, +@code{wayland-edge-pixels-touch}, @code{wayland-present}, @code{wid}, +@code{window-dragging}, @code{window-maximized}, +@code{window-minimized}, @code{window-scale}, +@code{write-filename-in-watch-later-config}, +@code{x11-bypass-compositor}, @code{x11-name}, @code{x11-netwm}, +@code{x11-present}, @code{x11-wid-title}, @code{xv-adaptor}, +@code{xv-buffers}, @code{xv-ck}, @code{xv-ck-method}, +@code{xv-colorkey}, @code{xv-port}, @code{ytdl}, @code{ytdl-format}, +@code{ytdl-raw-options}, @code{zimg-dither}, @code{zimg-fast}, +@code{zimg-scaler}, @code{zimg-scaler-chroma}, +@code{zimg-scaler-chroma-param-a}, @code{zimg-scaler-chroma-param-b}, +@code{zimg-scaler-param-a}, @code{zimg-scaler-param-b}, and +@code{zimg-threads}. + +@end deffn + @node Sway window manager @subsection Sway window manager diff --git a/gnu/home/services/mpv.scm b/gnu/home/services/mpv.scm new file mode 100644 index 0000000000..581c614a4b --- /dev/null +++ b/gnu/home/services/mpv.scm @@ -0,0 +1,2746 @@ +;;; GNU Guix --- Functional package management for GNU +;;; Copyright © 2024, 2025 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 <http://www.gnu.org/licenses/>. + +(define-module (gnu home services mpv) + #:use-module ((gnu services configuration) #:select (%unset-value + maybe-value-set?)) + #:use-module (gnu home services) + #:autoload (guix diagnostics) (formatted-message) + #:autoload (guix i18n) (G_) + #: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 + + 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)) + + +;;; +;;; Basic types. +;;; +(define (serialize-mpv/boolean field-name value) + #~(string-append #$(symbol->string field-name) + "=" + #$(if value "yes" "no") + "\n")) +(define mpv/boolean? boolean?) + +(define (serialize-mpv/integer field-name value) + #~(string-append #$(symbol->string field-name) + "=" + #$(number->string value) + "\n")) +(define (mpv/integer? n) + ;; We assume integer is a signed 32bit number. + (and-let* (((integer? n)) + ((>= n (* -1 (expt 2 (1- 32))))) + ((<= n (1- (expt 2 (1- 32)))))))) + +(define (serialize-mpv/integer64 field-name value) + #~(string-append #$(symbol->string field-name) + "=" + #$(number->string value) + "\n")) +(define (mpv/integer64? n) + ;; We assume integer is a signed 64bit number. + (and-let* (((integer? n)) + ((>= n (* -1 (expt 2 (1- 64))))) + ((<= n (1- (expt 2 (1- 64)))))))) + +(define (serialize-mpv/string field-name value) + #~(string-append #$(symbol->string field-name) + "=" + #$value + "\n")) +(define mpv/string? + string?) + +(define (serialize-mpv/float field-name value) + #~(string-append #$(symbol->string field-name) + "=" + #$(number->string (exact->inexact value)) + "\n")) +(define mpv/float? + ;; I am not sure how to validate floats. + real?) + +(define (serialize-mpv/double field-name value) + #~(string-append #$(symbol->string field-name) + "=" + #$(number->string (exact->inexact value)) + "\n")) +(define mpv/double? + ;; 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-mpv/aspect serialize-mpv/integer) +(define mpv/aspect? mpv/integer?) + +;;; `Audio channels or channel map' seems to be basically a free form string +;;; with no way to validate. +(define serialize-mpv/audio-channels-or-channel-map serialize-mpv/string) +(define mpv/audio-channels-or-channel-map? mpv/string?) + +;;; Does not seem possible to validate. +(define serialize-mpv/audio-format serialize-mpv/string) +(define mpv/audio-format? mpv/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-mpv/byte-size serialize-mpv/integer64) +(define mpv/byte-size? mpv/integer64?) + +(define (serialize-mpv/color field-name value) + #~(string-append #$(symbol->string field-name) + "=" + #$(if (list? value) + (string-join (map number->string value) "/") + value) + "\n")) +(define (mpv/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-mpv/fourcc serialize-mpv/string) +(define mpv/fourcc? mpv/string?) + +;;; No way to validate. +(define serialize-mpv/image-format serialize-mpv/string) +(define mpv/image-format? mpv/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-mpv/relative-time-or-percent-position serialize-mpv/string) +(define mpv/relative-time-or-percent-position? mpv/string?) + +(define serialize-mpv/time serialize-mpv/string) +(define mpv/time? mpv/string?) + +(define serialize-mpv/video-rectangle serialize-mpv/string) +(define (mpv/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-mpv/window-geometry serialize-mpv/string) +(define (mpv/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-mpv/window-size serialize-mpv/string) +(define (mpv/window-size? value) + (string-match "^([0-9]+%?(x[0-9]+%?)?)?$" value)) + +(define (serialize-mpv/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 (mpv/enumeration? value) + ;; There is no general way to check enumerations. The field always has to + ;; define custom sanitizer. + #t) + + + + +;;; +;;; List types. +;;; +(define (serialize-mpv/list-of-string field-name lst) + #~(string-append #$(symbol->string field-name) + "=" + #$(string-join lst ",") + "\n")) +(define (mpv/list-of-string? lst) + (every mpv/string? lst)) + +(define (serialize-mpv/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 (mpv/list-of-key-value? lst) + (every (match-lambda + (((? string?) . (? string?)) #t) + (_ #f)) + lst)) + +(define serialize-mpv/list-of-object-setting serialize-mpv/list-of-string) +(define mpv/list-of-object-setting? mpv/list-of-string?) + +(define serialize-mpv/list-of-output-verbosity serialize-mpv/list-of-key-value) +(define mpv/list-of-output-verbosity? mpv/list-of-key-value?) + + + + +;;; +;;; Actual configuration record. Contains a lot of generated code. +;;; + +(define-record-type <profile-option> + (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 "mpv/~a?" d/t))) + (d/serializer (string->symbol + (format #f "serialize-mpv/~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-value))) + (if (eq? x %unset-value) + %unset-value + (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 + pipewire-buffer + enumeration + (or (memq val '(native)) + (and (integer? val) (>= val 1) (<= val 2000)))) +(define-opt pipewire-remote string) +(define-opt + pipewire-volume-mode + enumeration + (memq val '(channel global))) +(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 <mpv-profile-configuration> + (%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 + (raise-exception + (formatted-message + (G_ "option ~a not found for mpv-profile-configuration") key))) + (if (maybe-value-set? val) + (if ((profile-option-type-check opt) val) + (hashq-set! new key (cons val + (profile-option-serializer opt))) + (raise-exception + (formatted-message + (G_ "invalid mpv configuration for ~a: ~a~%") + key val))) + (hashq-remove! new key))) + (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) + (string<? (symbol->string (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-mpv/mpv-profile-configurations _ profiles) + #~(string-append + #$@(map (match-lambda + ((name . config) + #~(string-append + #$(format #f "[~a]~%" name) + #$(serialize-mpv-profile-configuration _ config)))) + profiles))) +(define (mpv/mpv-profile-configurations? alist) + (and (list? alist) + (every (match-lambda + (((? symbol?) . (? mpv-profile-configuration?)) #t) + (_ #f)) + alist))) + +(define (serialize-mpv/extra _ value) + (if value + #~(string-append #$value + ;; Ensure the extra content ends in a new line. + #$(if (string-suffix? "\n" value) + "" "\n")) + #~"")) +(define (mpv/extra? val) + (or (string? val) + (gexp? val))) + +(define-record-type <home-mpv-configuration> + (%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 (mpv-profile-configuration? global) + (raise-exception + (formatted-message + (G_ "global must satisfy mpv-profile-configuration?")))) + (unless (mpv/mpv-profile-configurations? profiles) + (raise-exception + (formatted-message + (G_ "profiles must be an alist of mpv-profile-configuration?")))) + (unless (or (not extra-config) (mpv/extra? extra-config)) + (raise-exception + (formatted-message + (G_ "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-mpv/mpv-profile-configurations + 'profiles + (home-mpv-configuration-profiles cfg)) + #$(serialize-mpv/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."))) diff --git a/gnu/local.mk b/gnu/local.mk index f6f95bbf10..cab6655c7b 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -113,6 +113,7 @@ GNU_SYSTEM_MODULES = \ %D%/home/services/mail.scm \ %D%/home/services/media.scm \ %D%/home/services/messaging.scm \ + %D%/home/services/mpv.scm \ %D%/home/services/music.scm \ %D%/home/services/pm.scm \ %D%/home/services/shells.scm \ -- 2.49.0
andrew@HIDDEN, gabriel@HIDDEN, hako@HIDDEN, janneke@HIDDEN, ludo@HIDDEN, maxim.cournoyer@HIDDEN, tanguy@HIDDEN, guix-patches@HIDDEN
:bug#74801
; Package guix-patches
.
Full text available.Received: (at 74801) by debbugs.gnu.org; 23 Apr 2025 05:40:18 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Wed Apr 23 01:40:18 2025 Received: from localhost ([127.0.0.1]:51930 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1u7SqG-0004uw-OC for submit <at> debbugs.gnu.org; Wed, 23 Apr 2025 01:40:18 -0400 Received: from mail-pl1-x635.google.com ([2607:f8b0:4864:20::635]:50472) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from <maxim.cournoyer@HIDDEN>) id 1u7Sq9-0004pw-Fn for 74801 <at> debbugs.gnu.org; Wed, 23 Apr 2025 01:40:13 -0400 Received: by mail-pl1-x635.google.com with SMTP id d9443c01a7336-2279915e06eso62422005ad.1 for <74801 <at> debbugs.gnu.org>; Tue, 22 Apr 2025 22:40:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1745386803; x=1745991603; darn=debbugs.gnu.org; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to; bh=GgUH3SMLz6eF1FMVcwjzPqVrDp8CtaGk93N/t+Wqc60=; b=PtlB0f/kRGbTRWrCmaVJXceI9+KMvz/INnGTM6fBwWVW8lqhoDNrOLdD2JguDgRPrb O2DxAdefpooLypqf+DgLEbGNQ1xMFKD9qlyqJDdKCYejjYIpQxD728U3CcXSRedesDRX iVcVYLBrE7sRIC7uoy+7cu2jw00sybTfF8OP9vcBpbluQgmFUVh7E2Qw8PU95RaH2mSz tKlHPluQeAtSHr97ft17UdNLYEJLgyzziBQKYTjGzvs/k6eJw4WLr0+W5GzIsQw5oaed bPXQJzJxnCU1/41ksN49GWUkCcXjOCE/UsSatAdknVYAjv4yfsdYneextuMHPEgYhD+D hD8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1745386803; x=1745991603; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=GgUH3SMLz6eF1FMVcwjzPqVrDp8CtaGk93N/t+Wqc60=; b=HmbogiUEWaGKkWLkiydc4c8oZStW30fZgeOPkjDW9v3FRZQrPdGELse0oPTg9nmRPb rgZcABESZzMISAJEXuAP42dhtHZTRw7wy9XH2rJp2xiyhpb31YhJdlKXKrgXBME67xDS GWnH49v9lCFzKLsDvfpbsngjpUkmuNaFO8zbp2IgT07ZJfLYY0xIndl1BXirIbDhKmwL XwU95Hp5vVzQH1hUBMHAFW/B/kw7f6rYI8i/zMIUkhQ5AXBJWBvPHNQQO104cDiPhNRv VbVWc3qD164wpiYgEupxbd0aDlCro2QJjck6MVkEVm5APx1MMmDwwG9YlwkeUMVCMmGj oO2g== X-Gm-Message-State: AOJu0YyC83BU+MRbKzMd6atX8h8AlzjnBgYZvSwU+wc8gfP1WLGnQUl1 PlpxWuObqFflTkHIen9e1NH/kd4PW7HnoQ/kRKgCl0rG5y6g4gGPfNgu3Vt5 X-Gm-Gg: ASbGncuLwdM8l7DGEMXt80JzmVoscp7VQVg8OMYq8OnTIBargN7Mk/oRdzkvBmiYPXZ S5NWPAt3enByj6SoWy9C5OUjs6SVV5qfZJB9pmuYzuT03SRwDxW+OVBgHlT0FMOfe0sOwarDGXD wf6NAj+/skRx+SogZQd4+m3Csl3uUhFhNBtSIukm6W+C1X8SO8/EMOskcOb9qZ7B6G67eniKgKB 3ADvuFYESiJHR3+wqYWGpc7LqHmElurUc6eYy0ede7g318H8mON6kUyBBPdBzMf9K3pl4NVG1Vt b5D0yFd12W7uyFOVcLZT91Wcxhx2PkZ/4ZdNqTs= X-Google-Smtp-Source: AGHT+IGfTiZvm5nI0HGfUAI+JUX/B/zxlDTG8/+JjjDW7VKWbbYbFyJjLjbsOV0sfzFvZHOFJ4aQFQ== X-Received: by 2002:a17:903:3c6c:b0:224:76f:9e59 with SMTP id d9443c01a7336-22c53573ce3mr291600165ad.10.1745386802487; Tue, 22 Apr 2025 22:40:02 -0700 (PDT) Received: from terra ([2405:6586:be0:0:83c8:d31d:2cec:f542]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-22c50eb4897sm95285165ad.143.2025.04.22.22.40.00 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 22 Apr 2025 22:40:01 -0700 (PDT) From: Maxim Cournoyer <maxim.cournoyer@HIDDEN> To: Tomas Volf <~@wolfsden.cz> Subject: Re: bug#74801: [PATCH] gnu: home: services: Add home-mpv-service-type. In-Reply-To: <87mscxw6fa.fsf@HIDDEN> (Tomas Volf's message of "Thu, 03 Apr 2025 18:34:01 +0200") References: <29d3cc661a49b7bef951041f8ec3c7600c9777a7.1733953822.git.~@wolfsden.cz> <50f9a741440bc9b89ecdabcd7afb3a324173f7f9.1743602733.git.~@wolfsden.cz> <87y0whxtpx.fsf@HIDDEN> <87mscxw6fa.fsf@HIDDEN> Date: Wed, 23 Apr 2025 14:39:59 +0900 Message-ID: <87tt6fxwpc.fsf_-_@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 74801 Cc: 74801 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -1.0 (-) Hi Tomas, Tomas Volf <~@wolfsden.cz> writes: [...] >>> + >>> +;;; >>> +;;; Basic types. >>> +;;; >>> +(define (serialize-type/boolean field-name value) >> >> Nitpick: it's more common in the code base to name serializers as >> 'serialize-boolean'; it'd be nicer to stick to that naming style, for >> consistency. > > But it does follow the same pattern. The type is named type/boolean. > So the pattern of serialize-$TYPE results in serialize-type/boolean. > Without the type/ prefix I would run into collisions, since I need a > predicate for an integer (type/integer?), but integer? is already a > procedure doing something else. I am not sure I want to shadow it. > > Hm, would it make it better for you if I replaced the type/ prefix with > mpv/ prefix? So mpv/integer, instead of type/integer? That would > result in serialize-mpv/boolean, which might be better in your eyes? I think that'd be more precise naming yes, if there's a valid reason that mpv/integer? != integer? (which I'm sure there is since you went to the trouble of defining it!) [...] >>> +(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?) >> >> Maybe inexact? would be closer. > > However values satisfying integer? should be accepted as well, at least > from the user point of view it should be fine to write just 2, not 2.0, > so inexact? does not seem ideal here. OK! >> For floats you could check that >> >> (type/integer? (inexact->exact (truncate value))) is true. >> >> For doubles you could check that >> >> (type/integer64? (inexact->exact (truncate value))) is true. >> >> I think. > > I am not sure this is correct, since floats/doubles can have large range > than integers. So, if you do not mind too much, I will leave the real? > for now. In practice I believe it should work well enough. OK! I don't mind, and I haven't got refreshed on the IEEE representations of numbers before I commented ;-). >> For the rest, it looks good to me, except that you throw old fashioned >> exception values. Please take a look in the code base to see how >> raising error message exceptions that get shown nicely by the Guix command >> line. >> >> Maybe define-compile-time-procedure from (guix combinators) can be used, >> see it used for example in (gnu services base) for >> `assert-valid-name'. > > I was not able to wrap my head around define-compile-time-procedure, but > I took some other inspiration in the (gnu services base) module and used > formatted-message. Seems to be printed well by guix build. > > guix build: error: option fullscreena not found for mpv-profile-configuration > > > and > > guix build: error: invalid mpv configuration for fullscreen: yes That's good enough to start! It can always be refined later. >> >> Could you send a v2 with the above taken into consideration? > > Once I know what to do with the type/..., will send. :) Sorry for the delay. Now you know :-). -- Thanks, Maxim
guix-patches@HIDDEN
:bug#74801
; Package guix-patches
.
Full text available.Received: (at 74801) by debbugs.gnu.org; 3 Apr 2025 16:34:10 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Thu Apr 03 12:34:10 2025 Received: from localhost ([127.0.0.1]:35404 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1u0NW5-0008Om-Re for submit <at> debbugs.gnu.org; Thu, 03 Apr 2025 12:34:10 -0400 Received: from wolfsden.cz ([37.205.8.62]:47386) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from <~@wolfsden.cz>) id 1u0NW2-0008Oa-E0 for 74801 <at> debbugs.gnu.org; Thu, 03 Apr 2025 12:34:07 -0400 Received: by wolfsden.cz (Postfix, from userid 104) id 26E9D29904F; Thu, 3 Apr 2025 16:34:03 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail; t=1743698043; bh=j5Axaf+MgQTGmXBV0DRZbnZGB5+KD7z82hWydBf8HIU=; h=From:To:Cc:Subject:In-Reply-To:References:Date; b=v1fT4kDdv+McX6hgNMMR3bJzCohQLJckb9zJ8rX4azLf3OnuKcQSXtr7ltwEcpIaD vtwMRMM9/UUbkiJvxrSNh6AAPKfzZG3V4o0OLcsHBjcX21SFycpZ6AtAtFweJftD7F 2BloGIzUp/AwIA1YU4iMY/uM9XCeR6xCYAwgwpZSTzXf/kE1F459iQ12g4zgL6RcWi ZchPaAMjkJY/NYGLiV+1yrszDzyXotH7sjXo3mjM4bX42Kz+IiIRXkksN7a/ahuDwK DSDtcInnKNqDZsMg0x3EndURF44yOT5N3FEBCFPs4KfHbETx7M5mqMOFz5DQbw8Nub QroM6Dt5Ta3KQZRzW6fDF7fBc6e2F36/y/n7e/Zx8z4J+qec4pMRl4Qtzim/s8npOp HCUurdpyM87BnbD1btLeDF8fvE+/Nv1y8YGbyys0vU7zMfaHZQnC072xNbocVZ+W+c ha0PU02vUvWzydvpslFNzs/gt4VbJQ1B222IYhCuh4KG/Bhj45aLwY8fzkoa3H/Bku XNZxBhkQ1nlXxW8kJXDMsmxUgbeqGlLENypz4C9rjyGDqImTWqv8tjjJhq0UjZSWQG fdW/qOAGyXGrRywfyus7NIGrx9mskZRktReKAjfidJVMPhEcw/icCuRPj4gO455yX/ KHvZOQZYkoFQoERzhe/Ejmvk= X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on wolfsden X-Spam-Level: X-Spam-Status: No, score=-3.1 required=5.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 Received: from localhost (unknown [128.0.188.242]) by wolfsden.cz (Postfix) with ESMTPSA id 31692298BB7; Thu, 3 Apr 2025 16:34:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail; t=1743698042; bh=j5Axaf+MgQTGmXBV0DRZbnZGB5+KD7z82hWydBf8HIU=; h=From:To:Cc:Subject:In-Reply-To:References:Date; b=xW9gmXjKjhuX76thHKU56uApF+Y+0rNFM61MCrjog2t15yLAlq9N5JjnaE1lmI7a+ tStW9DPZjAHaTVrg/TRCzHQpIPlwyy5c4Z2P3rxnyc+dwryxbwzOUb1QqF1304yvNX p8S9yl43lJdIHhQcMAVkQ6p+osB3h5mNcl76IGaXH2mLaKt1d5NP58ZTFOB9sTn4pV gyiEct4KGhHcsyhLMQUFPCekiuVTzRuJDUMQMEcun45NQHk012Ip3xe8lrO7VsN+Lx YiQy1BYLgc7Xk8OABWnJSleRT3gRNxaK7V2Q6A2F4Tu8z0Eu2EfHEaRy80TTLhgvlI qUV02d6R3T0d46MFqd3mHE01dF1TIxnrTbQxH/8WMVwZJKknw/bS5pEcohDdivEfAF DDb+txZ41rLIhIE0Tme7dmBKvjKbHgNa5Wzl1+869xT5yeEPHKFD3Ria3GsAYe98C0 gxTxjgoOOxAGhoYpoDGpZXV749YAHnGj8r9SWLojczppvRDYOfWiLFBpXhZGVUtKTI QdL2Sw8OZtfKqx6CKWZqTRtg7z7cl/rZfuojDtmtwozZ/jSFlnDJGFHPIDvEqF1ZYX Xk967GV5n+8QzW3/exLpBFbe+HBT4YsGprZ1sLdSz10MzISOPpM/f+sKo6lvQN4Pd+ xihKGbPeu6lVbxKLzYCvs+tA= From: Tomas Volf <~@wolfsden.cz> To: Maxim Cournoyer <maxim.cournoyer@HIDDEN> Subject: Re: [bug#74801] [PATCH v2] gnu: home: services: Add home-mpv-service-type. In-Reply-To: <87y0whxtpx.fsf@HIDDEN> (Maxim Cournoyer's message of "Thu, 03 Apr 2025 22:25:30 +0900") References: <29d3cc661a49b7bef951041f8ec3c7600c9777a7.1733953822.git.~@wolfsden.cz> <50f9a741440bc9b89ecdabcd7afb3a324173f7f9.1743602733.git.~@wolfsden.cz> <87y0whxtpx.fsf@HIDDEN> Date: Thu, 03 Apr 2025 18:34:01 +0200 Message-ID: <87mscxw6fa.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 74801 Cc: 74801 <at> debbugs.gnu.org X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -1.0 (-) Hi Maxim, thanks a lot for the review! :) I have implemented most of your comments, only remaining question is about the type/... pattern, see below. Maxim Cournoyer <maxim.cournoyer@HIDDEN> writes: > Hi, > > Tomas Volf <~@wolfsden.cz> writes: > >> This commit adds a new service type to generate configuration file for the mpv >> media player. >> >> Originally I attempted to use Guix Records (via define-configuration) for >> this, but ran into the bug #74748, so I had to switch to procedures instead. >> The usage is (hopefully) sufficiently described in the documentation. When >> the bug is resolved, I will update it to use define-configuration instead. >> >> The full list of supported options is documented, however I decided to *not* >> document types and purpose for each individual fields. While I had mostly >> working prototype to extract the documentation from mpv, once I realized it >> would be few 10k of lines added, I decided it is not worth it. It would bloat >> the .texi file (by more than 50%), be hard to maintain and, in my opinion, >> would not provide enough value to justify that. The current version seems >> like sane middle ground. > > Wow! I didn't know mpv add so many configurable switches. I was also surprised. :) > > > [...] > >> +Due to the bug #74748, it does not use Guix Records to represent the >> +configuration, but uses keyword arguments to achieve similar result. > > >> +Example follows: >> + >> +@lisp >> +(service home-mpv-service-type >> + (make-home-mpv-configuration >> + #:global (make-mpv-profile-configuration >> + #:fullscreen #t >> + #:alang '("jpn" "eng")))) >> +@end lisp > > This looks reasonable if #74748 can't be resolved (I suspect it may > cause an itch to Ludovic, but their plate is pretty full already I > assume!). > > [...] > >> +@table @asis >> +@item Flags >> +The value is evaluated for truthfulness. Typically you would use >> +@code{#f} or @code{#t}. > > nitpick: I'd leave out the implementation details (the phrase about > truthfulness) and simply mention these expect a boolean value, #t or #f. > I have liked the flexibility (no need to wrap procedure calls in ->bool), but will change this to #t/#f only, it does not matter much. > >> +Only set fields are outputted to the configuration file. Accessors are >> +provided for every field, returning either their value or a sentinel >> +object @code{%unset}. > > This should be %unset-value, which is already defined in (gnu services > configuration). I did not like that someone could set the field to '%unset-marker%, and it would be treated the same way as %unset-value. That is why my %unset value was a list '(*unset*), to ensure uniqueness as far as eq? goes. However I will give you that this is somewhat unlikely to cause any issues in practice, so I will yield here and use %unset-value instead. > > [...] > >> + >> +;;; >> +;;; Basic types. >> +;;; >> +(define (serialize-type/boolean field-name value) > > Nitpick: it's more common in the code base to name serializers as > 'serialize-boolean'; it'd be nicer to stick to that naming style, for > consistency. But it does follow the same pattern. The type is named type/boolean. So the pattern of serialize-$TYPE results in serialize-type/boolean. Without the type/ prefix I would run into collisions, since I need a predicate for an integer (type/integer?), but integer? is already a procedure doing something else. I am not sure I want to shadow it. Hm, would it make it better for you if I replaced the type/ prefix with mpv/ prefix? So mpv/integer, instead of type/integer? That would result in serialize-mpv/boolean, which might be better in your eyes? > >> + #~(string-append #$(symbol->string field-name) >> + "=" >> + #$(if value "yes" "no") >> + "\n")) >> +(define type/boolean? >> + (const #t)) > > Does the above really check anything? It does not, by design. :) > > (type/boolean? "string") > $25 = #t > > (type/boolean? 0) > $26 = #t > > Seems like no. Well, since any object is acceptable as test in an if, the (const #t) seemed appropriate. Now that I have per your suggestion above switched to #t or #f instead of truthfulness, I will update the check to check for #t or #f instead. > >> +(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))))) > > I'd use the maths to compute the values, for clarity and ensuring > correctness, e.g. (* -1 (expt 2 (1- 32))) and (1- (expt 2 (1- 32))). Done. > >> + >> +(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))))) > > Likewise. Done. > >> +(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?) > > Maybe inexact? would be closer. However values satisfying integer? should be accepted as well, at least from the user point of view it should be fine to write just 2, not 2.0, so inexact? does not seem ideal here. > For floats you could check that > > (type/integer? (inexact->exact (truncate value))) is true. > > For doubles you could check that > > (type/integer64? (inexact->exact (truncate value))) is true. > > I think. I am not sure this is correct, since floats/doubles can have large range than integers. So, if you do not mind too much, I will leave the real? for now. In practice I believe it should work well enough. > > For the rest, it looks good to me, except that you throw old fashioned > exception values. Please take a look in the code base to see how > raising error message exceptions that get shown nicely by the Guix command > line. > > Maybe define-compile-time-procedure from (guix combinators) can be used, > see it used for example in (gnu services base) for > `assert-valid-name'. I was not able to wrap my head around define-compile-time-procedure, but I took some other inspiration in the (gnu services base) module and used formatted-message. Seems to be printed well by guix build. --8<---------------cut here---------------start------------->8--- guix build: error: option fullscreena not found for mpv-profile-configuration --8<---------------cut here---------------end--------------->8--- and --8<---------------cut here---------------start------------->8--- guix build: error: invalid mpv configuration for fullscreen: yes --8<---------------cut here---------------end--------------->8--- > > Could you send a v2 with the above taken into consideration? Once I know what to do with the type/..., will send. :) Tomas -- There are only two hard things in Computer Science: cache invalidation, naming things and off-by-one errors.
guix-patches@HIDDEN
:bug#74801
; Package guix-patches
.
Full text available.Received: (at 74801) by debbugs.gnu.org; 3 Apr 2025 13:26:01 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Thu Apr 03 09:26:00 2025 Received: from localhost ([127.0.0.1]:33347 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1u0KZz-0001jB-Qc for submit <at> debbugs.gnu.org; Thu, 03 Apr 2025 09:26:00 -0400 Received: from mail-pl1-x62f.google.com ([2607:f8b0:4864:20::62f]:46356) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.84_2) (envelope-from <maxim.cournoyer@HIDDEN>) id 1u0KZv-0001iu-5W for 74801 <at> debbugs.gnu.org; Thu, 03 Apr 2025 09:25:56 -0400 Received: by mail-pl1-x62f.google.com with SMTP id d9443c01a7336-227b828de00so8859505ad.1 for <74801 <at> debbugs.gnu.org>; Thu, 03 Apr 2025 06:25:55 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1743686749; x=1744291549; darn=debbugs.gnu.org; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:from:to:cc:subject:date:message-id:reply-to; bh=IC4gaCTmME5ThocGxpUrf5QPymDJ8ejRarSAMm9l878=; b=DiQsdfGdDw2E+srDa0X7TzTzdppMOEXgjQ6v4wlBuZDTwHulKrGAZYNHs4o0kdial7 bcXoYpH+wJb8lzlEnJViHE75kSoZutnmeivVz/Lmx5NgR5u/rIhZvcz7jctC+XWa1yii kkhdQrplK8rf/GTI/2bfC0CmeR/VHdZTxrLnJsr+WbezYx+Q2t2nhWBk2UJLxxTVD2Vr Rqx1Q5l70OeGUvzp4y+m84uCLO5kJWF4NSun3+Vh964LWZ86gQT/91Fp9Vka274IVD3e OXFlJeTz7+rdXDNdif7gdxA3c7WMg+4JnAhsZN678Z0zrv6eTtizXAYvkzPHJ8x6S0KQ gnVg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1743686749; x=1744291549; h=mime-version:user-agent:message-id:date:references:in-reply-to :subject:cc:to:from:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=IC4gaCTmME5ThocGxpUrf5QPymDJ8ejRarSAMm9l878=; b=xNdMuiM+ae5Bp9EO85ve5p3qcgtVA0oV/S5JgFZ0dAOqzoKLye2ZQ1l9DbvOJonsKz fkVP5hzStbF7lh669JNkH46R69ewqm3fA9i9QXQx9dhjH/hJkkovBm6SAppozJu1Bse8 96d08OY96001F79EhnML+0tjEVuS+fPwqVQfdgX7aCES+OIFrokJkgBJ43VGzdvYLA1g Pc+nFe0G7EJsk6c1HpoxsqLD5N3BJ377Wv3PnrJCiAU81/PZFGi/DXjuwWrfKQMFmj2m Q9mv7Z1R7cm0x+ajoqldSfzv5BM9lAFaTgW7aKPBojXTuF4IOdMi5bVqoi7EbCG0jyLV CrCw== X-Gm-Message-State: AOJu0YzK2w6UaMNREreklgqxi9/V+FsxN9h/5VqrHyQUJuOgfbmsb/8X G6nSxQNo8iIIxaEDYwv7A3stexIvUwdjOlBBgL4GFufMP6pu08JZAD1Iw6/n X-Gm-Gg: ASbGncsrLItsEJLOAO0I/wri10nBe4YE7G/U/OvFkOeUhaLm8RdgfZ44fl81sn458hi x5ioKk/FAE6wFJlhWICim4rZwG2ANX6C0azNt1hsLuR4EjYElL2b3/0km0FTf40lxl4M/zveqpW Z2kRrU2Er8jTppb5xCpGd1ReJEQQbmMesRwJJ0Xr8IdLo4e7208H3cGoX+iv6H0rSylt52di9yM T/VaqZF479A+Wlfvrkfq40HSayUdqoPlojafp0yhaFNlxISRcAgAp1CYD0lXCBzLD0j5vP9VHSk k7cDkMpudkhvuCOmU9lBStgOFVxl7jxjEvgBn2s/cq8= X-Google-Smtp-Source: AGHT+IEluEyM7anY3GVyApw4TWthK0GZdTwjg5mxvQei9SATQIo1LeqzkHcWGzbWl2lsq3lOuoZu2Q== X-Received: by 2002:a17:903:1c4:b0:220:c066:94eb with SMTP id d9443c01a7336-2296c688bdcmr74208475ad.25.1743686748550; Thu, 03 Apr 2025 06:25:48 -0700 (PDT) Received: from terra ([2405:6586:be0:0:83c8:d31d:2cec:f542]) by smtp.gmail.com with ESMTPSA id d9443c01a7336-2297865dfefsm13832295ad.151.2025.04.03.06.25.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 03 Apr 2025 06:25:47 -0700 (PDT) From: Maxim Cournoyer <maxim.cournoyer@HIDDEN> To: Tomas Volf <~@wolfsden.cz> Subject: Re: [bug#74801] [PATCH v2] gnu: home: services: Add home-mpv-service-type. In-Reply-To: <50f9a741440bc9b89ecdabcd7afb3a324173f7f9.1743602733.git.~@wolfsden.cz> (Tomas Volf's message of "Wed, 2 Apr 2025 16:05:33 +0200") References: <29d3cc661a49b7bef951041f8ec3c7600c9777a7.1733953822.git.~@wolfsden.cz> <50f9a741440bc9b89ecdabcd7afb3a324173f7f9.1743602733.git.~@wolfsden.cz> Date: Thu, 03 Apr 2025 22:25:30 +0900 Message-ID: <87y0whxtpx.fsf@HIDDEN> User-Agent: Gnus/5.13 (Gnus v5.13) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 74801 Cc: Ludovic =?utf-8?Q?Court=C3=A8s?= <ludo@HIDDEN>, Janneke Nieuwenhuizen <janneke@HIDDEN>, Tanguy Le Carrour <tanguy@HIDDEN>, 74801 <at> debbugs.gnu.org, Andrew Tropin <andrew@HIDDEN> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -1.0 (-) Hi, Tomas Volf <~@wolfsden.cz> writes: > This commit adds a new service type to generate configuration file for the mpv > media player. > > Originally I attempted to use Guix Records (via define-configuration) for > this, but ran into the bug #74748, so I had to switch to procedures instead. > The usage is (hopefully) sufficiently described in the documentation. When > the bug is resolved, I will update it to use define-configuration instead. > > The full list of supported options is documented, however I decided to *not* > document types and purpose for each individual fields. While I had mostly > working prototype to extract the documentation from mpv, once I realized it > would be few 10k of lines added, I decided it is not worth it. It would bloat > the .texi file (by more than 50%), be hard to maintain and, in my opinion, > would not provide enough value to justify that. The current version seems > like sane middle ground. Wow! I didn't know mpv add so many configurable switches. [...] > +Due to the bug #74748, it does not use Guix Records to represent the > +configuration, but uses keyword arguments to achieve similar result. > +Example follows: > + > +@lisp > +(service home-mpv-service-type > + (make-home-mpv-configuration > + #:global (make-mpv-profile-configuration > + #:fullscreen #t > + #:alang '("jpn" "eng")))) > +@end lisp This looks reasonable if #74748 can't be resolved (I suspect it may cause an itch to Ludovic, but their plate is pretty full already I assume!). [...] > +@table @asis > +@item Flags > +The value is evaluated for truthfulness. Typically you would use > +@code{#f} or @code{#t}. nitpick: I'd leave out the implementation details (the phrase about truthfulness) and simply mention these expect a boolean value, #t or #f. [...] > +Only set fields are outputted to the configuration file. Accessors are > +provided for every field, returning either their value or a sentinel > +object @code{%unset}. This should be %unset-value, which is already defined in (gnu services configuration). [...] > + > +;;; > +;;; Basic types. > +;;; > +(define (serialize-type/boolean field-name value) Nitpick: it's more common in the code base to name serializers as 'serialize-boolean'; it'd be nicer to stick to that naming style, for consistency. > + #~(string-append #$(symbol->string field-name) > + "=" > + #$(if value "yes" "no") > + "\n")) > +(define type/boolean? > + (const #t)) Does the above really check anything? (type/boolean? "string") $25 = #t (type/boolean? 0) $26 = #t Seems like no. > +(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))))) I'd use the maths to compute the values, for clarity and ensuring correctness, e.g. (* -1 (expt 2 (1- 32))) and (1- (expt 2 (1- 32))). > + > +(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))))) Likewise. > +(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?) Maybe inexact? would be closer. For floats you could check that (type/integer? (inexact->exact (truncate value))) is true. For doubles you could check that (type/integer64? (inexact->exact (truncate value))) is true. I think. For the rest, it looks good to me, except that you throw old fashioned exception values. Please take a look in the code base to see how raising error message exceptions that get shown nicely by the Guix command line. Maybe define-compile-time-procedure from (guix combinators) can be used, see it used for example in (gnu services base) for `assert-valid-name'. Could you send a v2 with the above taken into consideration? -- Thanks, Maxim
guix-patches@HIDDEN
:bug#74801
; Package guix-patches
.
Full text available.Received: (at 74801) by debbugs.gnu.org; 2 Apr 2025 14:07:03 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Wed Apr 02 10:07:02 2025 Received: from localhost ([127.0.0.1]:58648 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1tzyju-0006Bk-Nb for submit <at> debbugs.gnu.org; Wed, 02 Apr 2025 10:07:02 -0400 Received: from wolfsden.cz ([37.205.8.62]:33310) by debbugs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.84_2) (envelope-from <~@wolfsden.cz>) id 1tzyjT-00069r-Ab for 74801 <at> debbugs.gnu.org; Wed, 02 Apr 2025 10:06:43 -0400 Received: by wolfsden.cz (Postfix, from userid 104) id DD941383982; Wed, 2 Apr 2025 14:06:15 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail; t=1743602775; bh=0oaFhh6AQs512H/DWJCzvW7Vo0cdVq5tKbVdJ9j/KAM=; h=From:To:Cc:Subject:Date; b=QBdTbOp0Veqm+BLFIVqV2JqKRL8KFrKSSvHaAayzrWMWx5IaRZEyjRpRGXz3RZOPJ SbmvcVR3s89lKkoisc+W9DmKZJe9y+ceDOW8UXilf1GFO02xdT99R9TznmMBaLhho4 EKWRnsxEFsCVaFKaSFAZRTairgpXXcXMRgE95CQOI8D5jBW/Vrnztps9KAJ1sDmZ0P 6pAwSm6m7YwXDlsXj34MdqBNT1ddDtEuAMPbZT6DL/s47nPtTxm9nINfUUPjah8nuI /teaiub3aJYWRMpODJll7IBve8D+Zhr+606WtJXpHdvbFIz56xU52hw2a0eniBWR+R R072KO627slXRdpPECSMOvM7wqFKQnxFCB4owADhOvos27l9ciAMH8DUN3ziUN6UW/ oMl7XzRX5szWQxDULH/svfKvWXr0ekKsQUT7OjhWp++eV2nFqpMj+JNChDB3GRV8r/ SjUP+alQMbe+gZ7rDzDy9nT1CJcYUPtgbOGtHVzTncvcpIe1Wp2YGnrH94KDicywhM aVSNNE1ykLFruffdsiHaAPRnBD+7si1TZwdRLlPwt+0y9PV9KyVAXQRvw6RwHPxZcK 3RelHn+Gz66P5tPrj0eydHyyt8lAhkoAHkf1T/Zw8w5FzEQpLhLrB9FshpQdGZA62V p89xALS42GZlUYgdfB0plrnQ= X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on wolfsden X-Spam-Level: X-Spam-Status: No, score=-3.1 required=5.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 Received: from localhost (unknown [128.0.188.242]) by wolfsden.cz (Postfix) with ESMTPSA id 6400A383519; Wed, 2 Apr 2025 14:06:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail; t=1743602772; bh=0oaFhh6AQs512H/DWJCzvW7Vo0cdVq5tKbVdJ9j/KAM=; h=From:To:Cc:Subject:Date; b=CwWzBE7WCOr42Tu7gnArmei34ca9LPI+mkSM3buHUsmMr0y1I4+DcpRQ2riG+vhAk KMaLCcyBUkAH7fRQVWCU+VowhTTG+xdlCurdax53jWDg9XViap1vMg1xhXMs9wpGQA hp9GmhCZiKCaqKri8PBr1i9oq308INRuEOLMSCcBsRKXU5yJpyFk8KirPYVsTOBa3W ruqMoG9BLVQ7Ud6xR8nj2CitLA+mWHOEuvjiwEvQk4HPleFbHQ7PMds/cj/bgZD6B8 14S8lDIXx+KAIguJh6hOe647fyYXNzzIA1cXmANx/AEmfTiSGu4IALzvZpISHtFSsF IDLmDFOooMXbHKW703NSP1LUPqBURCtY74yyhTm1ROQE6Y5cG3HY+9cYQDrWa1C3Db 4cmX5ui01RsJaKyun+o1ROVYvH0pt00nTKDc+EHjVPKpNLMPJ9VBu0rLjCkh8fT9D7 g25lri7hCACxuiD/p45hMhkoAemAm3jq8ZdaqtOMz7+O1LqOay9pBu49bJFUzVK7+/ m7+NlRVYxWA24dJptJBIi07SzbUDmr8bJI09bd/5QC7nrX0LsDYCh3eqJL7vBx+7ER DposrZ3dYt8FmWsTZToF8PT/NS80dHU8vmtFP79OIzMTu8IdPBAlz1yxzNwsvl3NCH cvRE6obAtLJVgC/My2f+tLHU= From: Tomas Volf <~@wolfsden.cz> To: 74801 <at> debbugs.gnu.org Subject: [PATCH v2] gnu: home: services: Add home-mpv-service-type. Date: Wed, 2 Apr 2025 16:05:33 +0200 Message-ID: <50f9a741440bc9b89ecdabcd7afb3a324173f7f9.1743602733.git.~@wolfsden.cz> X-Mailer: git-send-email 2.49.0 MIME-Version: 1.0 X-Debbugs-Cc: Andrew Tropin <andrew@HIDDEN>, Janneke Nieuwenhuizen <janneke@HIDDEN>, Ludovic Courtès <ludo@HIDDEN>, Maxim Cournoyer <maxim.cournoyer@HIDDEN>, Tanguy Le Carrour <tanguy@HIDDEN> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Spam-Score: 0.0 (/) X-Debbugs-Envelope-To: 74801 Cc: Tomas Volf <~@wolfsden.cz> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -1.0 (-) This commit adds a new service type to generate configuration file for the mpv media player. Originally I attempted to use Guix Records (via define-configuration) for this, but ran into the bug #74748, so I had to switch to procedures instead. The usage is (hopefully) sufficiently described in the documentation. When the bug is resolved, I will update it to use define-configuration instead. The full list of supported options is documented, however I decided to *not* document types and purpose for each individual fields. While I had mostly working prototype to extract the documentation from mpv, once I realized it would be few 10k of lines added, I decided it is not worth it. It would bloat the .texi file (by more than 50%), be hard to maintain and, in my opinion, would not provide enough value to justify that. The current version seems like sane middle ground. Option to configure inputs (for mpv) will come later in a separate patch. * gnu/home/services/mpv.scm: New file. * gnu/local.mk (GNU_SYSTEM_MODULES): Register it. * doc/guix.texi (mpv Media Player): Document it. Change-Id: I2deb44799a28047cb5d67da97dc6007a9df873af --- Update for 0.39.0. doc/guix.texi | 428 ++++++ gnu/home/services/mpv.scm | 2732 +++++++++++++++++++++++++++++++++++++ gnu/local.mk | 1 + 3 files changed, 3161 insertions(+) create mode 100644 gnu/home/services/mpv.scm diff --git a/doc/guix.texi b/doc/guix.texi index 3d91dfd7b1..4019346588 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -49846,6 +49846,434 @@ Media Home Services @end table @end deftp +@c This is ugly, but upstream does *not* capitalize the ``m'' even when +@c at the beginning of a sentence. So let us follow the branding. +@node mpv Media Player +@subsection mpv Media Player + +@cindex mpv, Home Service +@cindex mpv, configuration +Configuring the @uref{https://mpv.io/, mpv media player} can be somewhat +daunting task, due to the sheer amount of options available, especially +if one wants to be able to inherit the configuration in their code. The +@code{home-mpv-service-type} is provided to help with that problem. +When the service is added to your home environment, file based on the +passed configuration is generated and placed into the correct location. + +Due to the bug #74748, it does not use Guix Records to represent the +configuration, but uses keyword arguments to achieve similar result. +Example follows: + +@lisp +(service home-mpv-service-type + (make-home-mpv-configuration + #:global (make-mpv-profile-configuration + #:fullscreen #t + #:alang '("jpn" "eng")))) +@end lisp + +@defvar home-mpv-service-type +This is the type of the mpv home service, whose value is a +@code{home-mpv-configuration} object. +@end defvar + +@deffn {Procedure} make-home-mpv-configuration +Return a new instance of @code{home-mpv-configuration}. Available +keyword arguments are: + +@table @asis +@item @code{inherit} (default: @code{#t}) +Inherit fields from an another instance. + +@item @code{global} (default: @code{(make-mpv-profile-configuration)}) +The global configuration preceding all profiles. + +@item @code{profiles} (default: @code{()}) +An alist containing configuration for any additional profiles to include +in the configuration file. + +@lisp +(make-home-mpv-configuration + #:profiles `((fullscreen . ,(make-mpv-profile-configuration + #:fullscreen #t)))) +@end lisp + +@item @code{extra-config} (default: @code{#f}) +Additional content to include in the configuration file. It is placed +at the end of the file. + +@end table +@end deffn + +@deffn {Procedure} make-mpv-profile-configuration +Return a new instance of @code{mpv-profile-configuration}. As above, it +also supports the @code{#:inherit} argument. Additionally it supports +keyword arguments named after the options of @command{mpv}. Hence +@option{--fullscreen} (or @code{fullscreen} in the configuration file) +becomes @code{#:fullscreen}. + +Few options are using their aliases instead. @option{audio} instead of +@option{aid}, @option{video} instead of @option{vid}, @option{sub} +instead of @option{sid}, @option{screenshot-directory} instead of +@option{screenshot-dir} and @option{watch-later-directory} instead of +@option{watch-later-dir}. + +Valid values for the fields depend on their type. + +@table @asis +@item Flags +The value is evaluated for truthfulness. Typically you would use +@code{#f} or @code{#t}. + +@item Numerical fields +Integer and integer64 fields are validated by @code{integer?}, float and +double fields by @code{real?}. Ranges are checked when applicable. + +@item Aspect +Same as integer. + +@item ByteSize +Same as integer64. + +@item Choice +The value should be a symbol representing member of the enumeration. If +the choice has @samp{or ...} part, it can also be value of that +alternative type. + +@item @var{type} list +The value should be a list of the @var{type}. + +@end table + +Other types accept strings, with validation of the values where possible +(e.g. type @samp{Color} is validated, but type @samp{Audio channels or +channel map} is not). + +The full list of currently supported keyword arguments is below. For +the types, allowed values and full description please refer to the +@command{mpv --list-options} and +@uref{https://mpv.io/manual/stable/#options, mpv manual}. + +Only set fields are outputted to the configuration file. Accessors are +provided for every field, returning either their value or a sentinel +object @code{%unset}. + +@code{ab-loop-a}, @code{ab-loop-b}, @code{ab-loop-count}, +@code{access-references}, @code{ad}, @code{ad-lavc-ac3drc}, +@code{ad-lavc-downmix}, @code{ad-lavc-o}, @code{ad-lavc-threads}, +@code{ad-queue-enable}, @code{ad-queue-max-bytes}, +@code{ad-queue-max-samples}, @code{ad-queue-max-secs}, @code{af}, +@code{audio}, @code{alang}, @code{allow-delayed-peak-detect}, +@code{alsa-buffer-time}, @code{alsa-ignore-chmap}, +@code{alsa-mixer-device}, @code{alsa-mixer-index}, +@code{alsa-mixer-name}, @code{alsa-non-interleaved}, +@code{alsa-periods}, @code{alsa-resample}, @code{ao}, +@code{ao-null-broken-delay}, @code{ao-null-broken-eof}, +@code{ao-null-buffer}, @code{ao-null-channel-layouts}, +@code{ao-null-format}, @code{ao-null-latency}, @code{ao-null-outburst}, +@code{ao-null-speed}, @code{ao-null-untimed}, @code{ao-pcm-append}, +@code{ao-pcm-file}, @code{ao-pcm-waveheader}, +@code{audio-backward-batch}, @code{audio-backward-overlap}, +@code{audio-buffer}, @code{audio-channels}, @code{audio-client-name}, +@code{audio-delay}, @code{audio-demuxer}, @code{audio-device}, +@code{audio-display}, @code{audio-exclusive}, @code{audio-exts}, +@code{audio-fallback-to-null}, @code{audio-file-auto}, +@code{audio-file-paths}, @code{audio-files}, @code{audio-format}, +@code{audio-normalize-downmix}, @code{audio-pitch-correction}, +@code{audio-resample-cutoff}, @code{audio-resample-filter-size}, +@code{audio-resample-linear}, @code{audio-resample-max-output-size}, +@code{audio-resample-phase-shift}, @code{audio-reversal-buffer}, +@code{audio-samplerate}, @code{audio-spdif}, +@code{audio-stream-silence}, @code{audio-swresample-o}, +@code{audio-wait-open}, @code{auto-window-resize}, +@code{autocreate-playlist}, @code{autofit}, @code{autofit-larger}, +@code{autofit-smaller}, @code{autoload-files}, @code{autosync}, +@code{background}, @code{background-color}, @code{blend-subtitles}, +@code{bluray-device}, @code{border}, @code{border-background}, +@code{brightness}, @code{cache}, @code{cache-on-disk}, +@code{cache-pause}, @code{cache-pause-initial}, @code{cache-pause-wait}, +@code{cache-secs}, @code{cdda-cdtext}, @code{cdda-device}, +@code{cdda-overlap}, @code{cdda-paranoia}, @code{cdda-sector-size}, +@code{cdda-skip}, @code{cdda-span-a}, @code{cdda-span-b}, +@code{cdda-speed}, @code{cdda-toc-offset}, +@code{chapter-merge-threshold}, @code{chapter-seek-threshold}, +@code{chapters-file}, @code{config}, @code{container-fps-override}, +@code{contrast}, @code{cookies}, @code{cookies-file}, +@code{corner-rounding}, @code{correct-downscaling}, @code{correct-pts}, +@code{cover-art-auto}, @code{cover-art-files}, +@code{cover-art-whitelist}, @code{cscale}, @code{cscale-antiring}, +@code{cscale-blur}, @code{cscale-clamp}, @code{cscale-param1}, +@code{cscale-param2}, @code{cscale-radius}, @code{cscale-taper}, +@code{cscale-window}, @code{cscale-wparam}, @code{cscale-wtaper}, +@code{cursor-autohide}, @code{cursor-autohide-fs-only}, @code{deband}, +@code{deband-grain}, @code{deband-iterations}, @code{deband-range}, +@code{deband-threshold}, @code{deinterlace}, +@code{deinterlace-field-parity}, @code{demuxer}, +@code{demuxer-backward-playback-step}, @code{demuxer-cache-dir}, +@code{demuxer-cache-unlink-files}, @code{demuxer-cache-wait}, +@code{demuxer-donate-buffer}, @code{demuxer-hysteresis-secs}, +@code{demuxer-lavf-allow-mimetype}, @code{demuxer-lavf-analyzeduration}, +@code{demuxer-lavf-buffersize}, @code{demuxer-lavf-format}, +@code{demuxer-lavf-hacks}, @code{demuxer-lavf-linearize-timestamps}, +@code{demuxer-lavf-o}, @code{demuxer-lavf-probe-info}, +@code{demuxer-lavf-probescore}, @code{demuxer-lavf-probesize}, +@code{demuxer-lavf-propagate-opts}, @code{demuxer-max-back-bytes}, +@code{demuxer-max-bytes}, @code{demuxer-mkv-probe-start-time}, +@code{demuxer-mkv-probe-video-duration}, +@code{demuxer-mkv-subtitle-preroll}, +@code{demuxer-mkv-subtitle-preroll-secs}, +@code{demuxer-mkv-subtitle-preroll-secs-index}, +@code{demuxer-rawaudio-channels}, @code{demuxer-rawaudio-format}, +@code{demuxer-rawaudio-rate}, @code{demuxer-rawvideo-codec}, +@code{demuxer-rawvideo-format}, @code{demuxer-rawvideo-fps}, +@code{demuxer-rawvideo-h}, @code{demuxer-rawvideo-mp-format}, +@code{demuxer-rawvideo-size}, @code{demuxer-rawvideo-w}, +@code{demuxer-readahead-secs}, @code{demuxer-seekable-cache}, +@code{demuxer-termination-timeout}, @code{demuxer-thread}, +@code{directory-filter-types}, @code{directory-mode}, +@code{display-fps-override}, @code{display-tags}, @code{dither}, +@code{dither-depth}, @code{dither-size-fruit}, @code{drag-and-drop}, +@code{drm-connector}, @code{drm-device}, @code{drm-draw-plane}, +@code{drm-draw-surface-size}, @code{drm-drmprime-video-plane}, +@code{drm-format}, @code{drm-mode}, @code{drm-vrr-enabled}, +@code{dscale}, @code{dscale-antiring}, @code{dscale-blur}, +@code{dscale-clamp}, @code{dscale-param1}, @code{dscale-param2}, +@code{dscale-radius}, @code{dscale-taper}, @code{dscale-window}, +@code{dscale-wparam}, @code{dscale-wtaper}, @code{dump-stats}, +@code{dvbin-card}, @code{dvbin-channel-switch-offset}, +@code{dvbin-file}, @code{dvbin-full-transponder}, @code{dvbin-prog}, +@code{dvbin-timeout}, @code{dvd-angle}, @code{dvd-device}, +@code{dvd-speed}, @code{edition}, @code{egl-config-id}, +@code{egl-output-format}, @code{embeddedfonts}, @code{end}, +@code{error-diffusion}, @code{external-files}, @code{fbo-format}, +@code{focus-on}, @code{force-media-title}, @code{force-render}, +@code{force-rgba-osd-rendering}, @code{force-seekable}, +@code{force-window}, @code{force-window-position}, @code{framedrop}, +@code{frames}, @code{fs-screen}, @code{fs-screen-name}, +@code{fullscreen}, @code{gamma}, @code{gamma-auto}, @code{gamma-factor}, +@code{gamut-mapping-mode}, @code{gapless-audio}, @code{geometry}, +@code{glsl-shader-opts}, @code{glsl-shaders}, @code{gpu-api}, +@code{gpu-context}, @code{gpu-debug}, @code{gpu-dumb-mode}, +@code{gpu-hwdec-interop}, @code{gpu-shader-cache}, +@code{gpu-shader-cache-dir}, @code{gpu-sw}, @code{gpu-tex-pad-x}, +@code{gpu-tex-pad-y}, @code{hdr-compute-peak}, +@code{hdr-contrast-recovery}, @code{hdr-contrast-smoothness}, +@code{hdr-peak-decay-rate}, @code{hdr-peak-percentile}, +@code{hdr-scene-threshold-high}, @code{hdr-scene-threshold-low}, +@code{hidpi-window-scale}, @code{hls-bitrate}, @code{hr-seek}, +@code{hr-seek-demuxer-offset}, @code{hr-seek-framedrop}, +@code{http-header-fields}, @code{http-proxy}, @code{hue}, @code{hwdec}, +@code{hwdec-codecs}, @code{hwdec-extra-frames}, +@code{hwdec-image-format}, @code{icc-3dlut-size}, @code{icc-cache}, +@code{icc-cache-dir}, @code{icc-force-contrast}, @code{icc-intent}, +@code{icc-profile}, @code{icc-profile-auto}, @code{icc-use-luma}, +@code{idle}, @code{ignore-path-in-watch-later-config}, +@code{image-display-duration}, @code{image-exts}, @code{image-lut}, +@code{image-lut-type}, @code{image-subs-video-resolution}, +@code{include}, @code{index}, @code{initial-audio-sync}, +@code{input-ar-delay}, @code{input-ar-rate}, +@code{input-builtin-bindings}, @code{input-builtin-dragging}, +@code{input-commands}, @code{input-conf}, @code{input-cursor}, +@code{input-cursor-passthrough}, @code{input-default-bindings}, +@code{input-doubleclick-time}, @code{input-dragging-deadzone}, +@code{input-ipc-client}, @code{input-ipc-server}, +@code{input-key-fifo-size}, @code{input-media-keys}, +@code{input-preprocess-wheel}, @code{input-right-alt-gr}, +@code{input-terminal}, @code{input-test}, +@code{input-touch-emulate-mouse}, @code{input-vo-keyboard}, +@code{interpolation}, @code{interpolation-preserve}, +@code{interpolation-threshold}, @code{inverse-tone-mapping}, +@code{jack-autostart}, @code{jack-connect}, @code{jack-name}, +@code{jack-port}, @code{jack-std-channel-layout}, @code{keep-open}, +@code{keep-open-pause}, @code{keepaspect}, @code{keepaspect-window}, +@code{lavfi-complex}, @code{length}, @code{libplacebo-opts}, +@code{linear-downscaling}, @code{linear-upscaling}, +@code{load-auto-profiles}, @code{load-osd-console}, @code{load-scripts}, +@code{load-select}, @code{load-stats-overlay}, +@code{load-unsafe-playlists}, @code{log-file}, @code{loop-file}, +@code{loop-playlist}, @code{lut}, @code{lut-type}, @code{mc}, +@code{media-controls}, @code{merge-files}, @code{metadata-codepage}, +@code{mf-fps}, @code{mf-type}, @code{monitoraspect}, +@code{monitorpixelaspect}, @code{msg-color}, @code{msg-level}, +@code{msg-module}, @code{msg-time}, @code{mute}, @code{native-fs}, +@code{native-keyrepeat}, @code{native-touch}, @code{network-timeout}, +@code{oac}, @code{oacopts}, @code{ocopy-metadata}, @code{of}, +@code{ofopts}, @code{on-all-workspaces}, @code{ontop}, +@code{ontop-level}, @code{opengl-check-pattern-a}, +@code{opengl-check-pattern-b}, @code{opengl-early-flush}, +@code{opengl-es}, @code{opengl-glfinish}, @code{opengl-pbo}, +@code{opengl-rectangle-textures}, @code{opengl-swapinterval}, +@code{opengl-waitvsync}, @code{orawts}, @code{ordered-chapters}, +@code{ordered-chapters-files}, @code{oremove-metadata}, @code{osc}, +@code{osd-align-x}, @code{osd-align-y}, @code{osd-back-color}, +@code{osd-bar}, @code{osd-bar-align-x}, @code{osd-bar-align-y}, +@code{osd-bar-h}, @code{osd-bar-outline-size}, @code{osd-bar-w}, +@code{osd-blur}, @code{osd-bold}, @code{osd-border-style}, +@code{osd-color}, @code{osd-duration}, @code{osd-font}, +@code{osd-font-provider}, @code{osd-font-size}, @code{osd-fonts-dir}, +@code{osd-fractions}, @code{osd-italic}, @code{osd-justify}, +@code{osd-level}, @code{osd-margin-x}, @code{osd-margin-y}, +@code{osd-msg1}, @code{osd-msg2}, @code{osd-msg3}, @code{osd-on-seek}, +@code{osd-outline-color}, @code{osd-outline-size}, +@code{osd-playing-msg}, @code{osd-playing-msg-duration}, +@code{osd-playlist-entry}, @code{osd-scale}, @code{osd-scale-by-window}, +@code{osd-shadow-offset}, @code{osd-spacing}, @code{osd-status-msg}, +@code{oset-metadata}, @code{ovc}, @code{ovcopts}, @code{panscan}, +@code{pause}, @code{pipewire-buffer}, @code{pipewire-remote}, +@code{pipewire-volume-mode}, @code{pitch}, @code{play-direction}, +@code{player-operation-mode}, @code{playlist-start}, +@code{prefetch-playlist}, @code{profile}, @code{pulse-allow-suspended}, +@code{pulse-buffer}, @code{pulse-host}, @code{pulse-latency-hacks}, +@code{quiet}, @code{really-quiet}, @code{rebase-start-time}, +@code{referrer}, @code{replaygain}, @code{replaygain-clip}, +@code{replaygain-fallback}, @code{replaygain-preamp}, +@code{reset-on-next-file}, @code{resume-playback}, +@code{resume-playback-check-mtime}, @code{rtsp-transport}, +@code{saturation}, @code{save-position-on-quit}, @code{scale}, +@code{scale-antiring}, @code{scale-blur}, @code{scale-clamp}, +@code{scale-param1}, @code{scale-param2}, @code{scale-radius}, +@code{scale-taper}, @code{scale-window}, @code{scale-wparam}, +@code{scale-wtaper}, @code{scaler-resizes-only}, @code{screen}, +@code{screen-name}, @code{screenshot-avif-encoder}, +@code{screenshot-avif-opts}, @code{screenshot-avif-pixfmt}, +@code{screenshot-directory}, @code{screenshot-format}, +@code{screenshot-high-bit-depth}, @code{screenshot-jpeg-quality}, +@code{screenshot-jpeg-source-chroma}, @code{screenshot-jxl-distance}, +@code{screenshot-jxl-effort}, @code{screenshot-png-compression}, +@code{screenshot-png-filter}, @code{screenshot-sw}, +@code{screenshot-tag-colorspace}, @code{screenshot-template}, +@code{screenshot-webp-compression}, @code{screenshot-webp-lossless}, +@code{screenshot-webp-quality}, @code{script-opts}, @code{scripts}, +@code{secondary-sid}, @code{secondary-sub-ass-override}, +@code{secondary-sub-delay}, @code{secondary-sub-pos}, +@code{secondary-sub-visibility}, @code{sharpen}, @code{show-in-taskbar}, +@code{shuffle}, @code{sub}, @code{sigmoid-center}, @code{sigmoid-slope}, +@code{sigmoid-upscaling}, @code{slang}, @code{snap-window}, +@code{speed}, @code{spirv-compiler}, @code{sstep}, @code{start}, +@code{stop-playback-on-init-failure}, @code{stop-screensaver}, +@code{stream-buffer-size}, @code{stream-dump}, @code{stream-lavf-o}, +@code{stream-record}, @code{stretch-dvd-subs}, +@code{stretch-image-subs-to-screen}, @code{sub-align-x}, +@code{sub-align-y}, @code{sub-ass}, @code{sub-ass-force-margins}, +@code{sub-ass-hinting}, @code{sub-ass-justify}, +@code{sub-ass-line-spacing}, @code{sub-ass-override}, +@code{sub-ass-scale-with-window}, @code{sub-ass-shaper}, +@code{sub-ass-style-overrides}, @code{sub-ass-styles}, +@code{sub-ass-use-video-data}, @code{sub-ass-video-aspect-override}, +@code{sub-ass-vsfilter-color-compat}, @code{sub-auto}, +@code{sub-auto-exts}, @code{sub-back-color}, @code{sub-blur}, +@code{sub-bold}, @code{sub-border-style}, @code{sub-clear-on-seek}, +@code{sub-codepage}, @code{sub-color}, @code{sub-create-cc-track}, +@code{sub-delay}, @code{sub-demuxer}, @code{sub-file-paths}, +@code{sub-files}, @code{sub-filter-jsre}, @code{sub-filter-regex}, +@code{sub-filter-regex-enable}, @code{sub-filter-regex-plain}, +@code{sub-filter-regex-warn}, @code{sub-filter-sdh}, +@code{sub-filter-sdh-enclosures}, @code{sub-filter-sdh-harder}, +@code{sub-fix-timing}, @code{sub-font}, @code{sub-font-provider}, +@code{sub-font-size}, @code{sub-fonts-dir}, +@code{sub-forced-events-only}, @code{sub-fps}, @code{sub-gauss}, +@code{sub-gray}, @code{sub-italic}, @code{sub-justify}, +@code{sub-lavc-o}, @code{sub-margin-x}, @code{sub-margin-y}, +@code{sub-outline-color}, @code{sub-outline-size}, +@code{sub-past-video-end}, @code{sub-pos}, @code{sub-scale}, +@code{sub-scale-by-window}, @code{sub-scale-with-window}, +@code{sub-shadow-offset}, @code{sub-spacing}, @code{sub-speed}, +@code{sub-stretch-durations}, @code{sub-use-margins}, +@code{sub-visibility}, @code{sub-vsfilter-bidi-compat}, +@code{subs-fallback}, @code{subs-fallback-forced}, +@code{subs-match-os-language}, @code{subs-with-matching-audio}, +@code{swapchain-depth}, @code{sws-allow-zimg}, @code{sws-bitexact}, +@code{sws-cgb}, @code{sws-chs}, @code{sws-cs}, @code{sws-cvs}, +@code{sws-fast}, @code{sws-lgb}, @code{sws-ls}, @code{sws-scaler}, +@code{target-colorspace-hint}, @code{target-contrast}, +@code{target-gamut}, @code{target-lut}, @code{target-peak}, +@code{target-prim}, @code{target-trc}, @code{taskbar-progress}, +@code{teletext-page}, @code{temporal-dither}, +@code{temporal-dither-period}, @code{term-osd}, @code{term-osd-bar}, +@code{term-osd-bar-chars}, @code{term-playing-msg}, +@code{term-status-msg}, @code{term-title}, @code{terminal}, +@code{title}, @code{title-bar}, @code{tls-ca-file}, +@code{tls-cert-file}, @code{tls-key-file}, @code{tls-verify}, +@code{tone-mapping}, @code{tone-mapping-max-boost}, +@code{tone-mapping-param}, @code{tone-mapping-visualize}, +@code{track-auto-selection}, @code{tscale}, @code{tscale-antiring}, +@code{tscale-blur}, @code{tscale-clamp}, @code{tscale-param1}, +@code{tscale-param2}, @code{tscale-radius}, @code{tscale-taper}, +@code{tscale-window}, @code{tscale-wparam}, @code{tscale-wtaper}, +@code{untimed}, @code{use-embedded-icc-profile}, +@code{use-filedir-conf}, @code{user-agent}, @code{vaapi-device}, +@code{vd}, @code{vd-apply-cropping}, @code{vd-lavc-assume-old-x264}, +@code{vd-lavc-bitexact}, @code{vd-lavc-check-hw-profile}, +@code{vd-lavc-dr}, @code{vd-lavc-fast}, @code{vd-lavc-film-grain}, +@code{vd-lavc-framedrop}, @code{vd-lavc-o}, @code{vd-lavc-show-all}, +@code{vd-lavc-skipframe}, @code{vd-lavc-skipidct}, +@code{vd-lavc-skiploopfilter}, @code{vd-lavc-software-fallback}, +@code{vd-lavc-threads}, @code{vd-queue-enable}, +@code{vd-queue-max-bytes}, @code{vd-queue-max-samples}, +@code{vd-queue-max-secs}, @code{vf}, @code{video}, @code{video-align-x}, +@code{video-align-y}, @code{video-aspect-method}, +@code{video-aspect-override}, @code{video-backward-batch}, +@code{video-backward-overlap}, @code{video-crop}, @code{video-exts}, +@code{video-latency-hacks}, @code{video-margin-ratio-bottom}, +@code{video-margin-ratio-left}, @code{video-margin-ratio-right}, +@code{video-margin-ratio-top}, @code{video-osd}, +@code{video-output-levels}, @code{video-pan-x}, @code{video-pan-y}, +@code{video-reversal-buffer}, @code{video-rotate}, @code{video-scale-x}, +@code{video-scale-y}, @code{video-sync}, +@code{video-sync-max-audio-change}, @code{video-sync-max-factor}, +@code{video-sync-max-video-change}, @code{video-timing-offset}, +@code{video-unscaled}, @code{video-zoom}, @code{vlang}, @code{vo}, +@code{vo-image-avif-encoder}, @code{vo-image-avif-opts}, +@code{vo-image-avif-pixfmt}, @code{vo-image-format}, +@code{vo-image-high-bit-depth}, @code{vo-image-jpeg-quality}, +@code{vo-image-jpeg-source-chroma}, @code{vo-image-jxl-distance}, +@code{vo-image-jxl-effort}, @code{vo-image-outdir}, +@code{vo-image-png-compression}, @code{vo-image-png-filter}, +@code{vo-image-tag-colorspace}, @code{vo-image-webp-compression}, +@code{vo-image-webp-lossless}, @code{vo-image-webp-quality}, +@code{vo-kitty-alt-screen}, @code{vo-kitty-cols}, +@code{vo-kitty-config-clear}, @code{vo-kitty-height}, +@code{vo-kitty-left}, @code{vo-kitty-rows}, @code{vo-kitty-top}, +@code{vo-kitty-use-shm}, @code{vo-kitty-width}, @code{vo-null-fps}, +@code{vo-sixel-alt-screen}, @code{vo-sixel-buffered}, +@code{vo-sixel-cols}, @code{vo-sixel-config-clear}, +@code{vo-sixel-dither}, @code{vo-sixel-fixedpalette}, +@code{vo-sixel-height}, @code{vo-sixel-left}, @code{vo-sixel-pad-x}, +@code{vo-sixel-pad-y}, @code{vo-sixel-reqcolors}, @code{vo-sixel-rows}, +@code{vo-sixel-threshold}, @code{vo-sixel-top}, @code{vo-sixel-width}, +@code{vo-tct-256}, @code{vo-tct-algo}, @code{vo-tct-buffering}, +@code{vo-tct-height}, @code{vo-tct-width}, @code{vo-vaapi-scaled-osd}, +@code{vo-vaapi-scaling}, @code{vo-vdpau-chroma-deint}, +@code{vo-vdpau-colorkey}, @code{vo-vdpau-composite-detect}, +@code{vo-vdpau-denoise}, @code{vo-vdpau-force-yuv}, @code{vo-vdpau-fps}, +@code{vo-vdpau-hqscaling}, @code{vo-vdpau-output-surfaces}, +@code{vo-vdpau-pullup}, @code{vo-vdpau-queuetime-fs}, +@code{vo-vdpau-queuetime-windowed}, @code{vo-vdpau-sharpen}, +@code{volume}, @code{volume-gain}, @code{volume-gain-max}, +@code{volume-gain-min}, @code{volume-max}, @code{vulkan-async-compute}, +@code{vulkan-async-transfer}, @code{vulkan-device}, +@code{vulkan-display-display}, @code{vulkan-display-mode}, +@code{vulkan-display-plane}, @code{vulkan-queue-count}, +@code{vulkan-swap-mode}, @code{watch-later-directory}, +@code{watch-later-options}, @code{wayland-app-id}, +@code{wayland-configure-bounds}, @code{wayland-content-type}, +@code{wayland-disable-vsync}, @code{wayland-edge-pixels-pointer}, +@code{wayland-edge-pixels-touch}, @code{wayland-present}, @code{wid}, +@code{window-dragging}, @code{window-maximized}, +@code{window-minimized}, @code{window-scale}, +@code{write-filename-in-watch-later-config}, +@code{x11-bypass-compositor}, @code{x11-name}, @code{x11-netwm}, +@code{x11-present}, @code{x11-wid-title}, @code{xv-adaptor}, +@code{xv-buffers}, @code{xv-ck}, @code{xv-ck-method}, +@code{xv-colorkey}, @code{xv-port}, @code{ytdl}, @code{ytdl-format}, +@code{ytdl-raw-options}, @code{zimg-dither}, @code{zimg-fast}, +@code{zimg-scaler}, @code{zimg-scaler-chroma}, +@code{zimg-scaler-chroma-param-a}, @code{zimg-scaler-chroma-param-b}, +@code{zimg-scaler-param-a}, @code{zimg-scaler-param-b}, and +@code{zimg-threads}. + +@end deffn + @node Sway window manager @subsection Sway window manager diff --git a/gnu/home/services/mpv.scm b/gnu/home/services/mpv.scm new file mode 100644 index 0000000000..e2fa44162a --- /dev/null +++ b/gnu/home/services/mpv.scm @@ -0,0 +1,2732 @@ +;;; 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 <http://www.gnu.org/licenses/>. + +(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 <profile-option> + (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 + pipewire-buffer + enumeration + (or (memq val '(native)) + (and (integer? val) (>= val 1) (<= val 2000)))) +(define-opt pipewire-remote string) +(define-opt + pipewire-volume-mode + enumeration + (memq val '(channel global))) +(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 <mpv-profile-configuration> + (%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) + (string<? (symbol->string (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 <home-mpv-configuration> + (%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."))) diff --git a/gnu/local.mk b/gnu/local.mk index f03fcb14fc..c5e545fcb9 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -113,6 +113,7 @@ GNU_SYSTEM_MODULES = \ %D%/home/services/mail.scm \ %D%/home/services/media.scm \ %D%/home/services/messaging.scm \ + %D%/home/services/mpv.scm \ %D%/home/services/music.scm \ %D%/home/services/pm.scm \ %D%/home/services/shells.scm \ -- 2.49.0
andrew@HIDDEN, janneke@HIDDEN, ludo@HIDDEN, maxim.cournoyer@HIDDEN, tanguy@HIDDEN, guix-patches@HIDDEN
:bug#74801
; Package guix-patches
.
Full text available.Received: (at submit) by debbugs.gnu.org; 11 Dec 2024 21:53:58 +0000 From debbugs-submit-bounces <at> debbugs.gnu.org Wed Dec 11 16:53:58 2024 Received: from localhost ([127.0.0.1]:36553 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <debbugs-submit-bounces <at> debbugs.gnu.org>) id 1tLUeX-0002mm-30 for submit <at> debbugs.gnu.org; Wed, 11 Dec 2024 16:53:58 -0500 Received: from lists.gnu.org ([209.51.188.17]:50700) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from <~@wolfsden.cz>) id 1tLUeQ-0002mC-V6 for submit <at> debbugs.gnu.org; Wed, 11 Dec 2024 16:53:52 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <~@wolfsden.cz>) id 1tLUeQ-000731-IW for guix-patches@HIDDEN; Wed, 11 Dec 2024 16:53:46 -0500 Received: from wolfsden.cz ([37.205.8.62]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from <~@wolfsden.cz>) id 1tLUeK-00087a-Bv for guix-patches@HIDDEN; Wed, 11 Dec 2024 16:53:46 -0500 Received: by wolfsden.cz (Postfix, from userid 104) id 32754350AE8; Wed, 11 Dec 2024 21:53:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail; t=1733954017; bh=0JJdJHMX0s9Ubg8XRMoBkMUG4m8rmRiw4vS33Ja+5bo=; h=From:To:Cc:Subject:Date; b=J81eszPLS05dPR2dD6dDzDJuabt4WoA/VjHHYjq0kvY2ZLgjcCS9y5wn5nmrdDMv1 wTHTkHriJkMFoj/F392W1MXxB2w1EqRwfIuxb3vq9Qg8uXVIOYEorW3lwnYwwDJRqS PHMbtMaroaCbjFYYFGMWJq27cI/uH7fO9hr0aiMwmmepNQe8tlK7UWEHzARGhkwiUs fi7YXUMbPXzooXqrUhsjPp87zLXazJhL58Z5BjkfPvd+n0KJjw5WPPuRcQbD0hT6U7 TVJRFoXXH/Sh/aV+C/IqDfLRU97x2icCJi+ub9AdKv5tfcnRONvZiLuOcnF0TJUUlL e0bz6QVx+bvCtpwGLHWik6+dFKZ/a9VX9Eu+r8ZserxAaQZH2R2PEdsLub/XITe+pn tBDKwQJiIE6KVzzzXyoQBtFzKXfY27ueKwa6AxIE/7n1yh8eBd9fMkS/ev5zU/2EU/ 9ZvIvsdy5oPZId+TpaOkRK+89EJX53GGC8l/64wZk2pKn4SHTc/1FazCdNbgSg3YoM N6MiyksfgNMfBD2p+GxkjSuc/3l9H2BjpRj3CueMelCDDDM89MfzMC2ZA12WQqBfWh zz5oRVTWXk6N1K+ICiN0pWnrei1TkniEj5q118tUSpod9DRvOLDeG0DnJcSTQpfuMZ uLGj6BLwJcEL7PdAZ8qef0sk= X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on wolfsden X-Spam-Level: X-Spam-Status: No, score=-3.1 required=5.0 tests=ALL_TRUSTED,BAYES_00, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 Received: from localhost (unknown [128.0.188.242]) by wolfsden.cz (Postfix) with ESMTPSA id 4C8293519EF; Wed, 11 Dec 2024 21:53:33 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=wolfsden.cz; s=mail; t=1733954013; bh=0JJdJHMX0s9Ubg8XRMoBkMUG4m8rmRiw4vS33Ja+5bo=; h=From:To:Cc:Subject:Date; b=O0iC0iUI8qURnXBBaAwwhhL9O9OwIFJIlP8OvbxCganHERAGhlh49iZMi+4xfyLhI fI2fp+32yisnnS5RPfMWQ47K5GccQ4joPu6GCcv2a2bYUFlP9WnUdsLVxdoxYMoHsZ j1mwZZXchpN3Nqb/5GrBJY+Mk/4HCcKrCOkfVlHow/Gb+cjJh21Q3pvJg+/yckQSaa zNYkJDkCnijpMID/lUkohZ1IxaR4Nd4XXQRzJRJ9qFJD34AQ5xq1AQo+PJ/zgbEJHx lIZq9FdTycl5hM7KIv+xBySrtKmF84J+P7r8vMo4VSAPZZWbVGPWD7uNi+A4kPKaMZ uqmJj5LrvQwHXQfrTo0M7vtTZ6JcI08V3XYg1/CLWjjuXNKUgXjPXXYkYR0tOiQj8z KInzY7V5Q0fQSvRKO45tldVBLeZVQsCJ8RyngF6I1zlqk+gjyC8elQDCdLrXb0J7oK 338L9AzfSUN/pYwkuVle5wJhHfG8K0V6VET/esw+gRIEftAoucGkcAenZoECC4TTTA yb89VtrYl6VyXPs6MnBdoQmU3YNri+P2xCdJZd4MwRr8UsktxOafX8RATQYUZUxzEZ truZwYXIxfOwLj8wwivHogDUB3AAs4T2WrVIG2CNhh/bRj6CB2aDwJo07Qtkd71NBk XCgJMzXaY2oVDtetfYwPEv2I= From: Tomas Volf <~@wolfsden.cz> To: guix-patches@HIDDEN Subject: [PATCH] gnu: home: services: Add home-mpv-service-type. Date: Wed, 11 Dec 2024 22:50:22 +0100 Message-ID: <29d3cc661a49b7bef951041f8ec3c7600c9777a7.1733953822.git.~@wolfsden.cz> X-Mailer: git-send-email 2.46.0 MIME-Version: 1.0 X-Debbugs-Cc: ( <paren@HIDDEN>, Andrew Tropin <andrew@HIDDEN>, Janneke Nieuwenhuizen <janneke@HIDDEN>, Ludovic Courtès <ludo@HIDDEN>, Maxim Cournoyer <maxim.cournoyer@HIDDEN>, Tanguy Le Carrour <tanguy@HIDDEN> Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Received-SPF: pass client-ip=37.205.8.62; envelope-from=~@wolfsden.cz; helo=wolfsden.cz X-Spam_score_int: -20 X-Spam_score: -2.1 X-Spam_bar: -- X-Spam_report: (-2.1 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_VALIDITY_CERTIFIED_BLOCKED=0.001, RCVD_IN_VALIDITY_RPBL_BLOCKED=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-Spam-Score: -1.3 (-) X-Debbugs-Envelope-To: submit Cc: Tomas Volf <~@wolfsden.cz> X-BeenThere: debbugs-submit <at> debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: <debbugs-submit.debbugs.gnu.org> List-Unsubscribe: <https://debbugs.gnu.org/cgi-bin/mailman/options/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=unsubscribe> List-Archive: <https://debbugs.gnu.org/cgi-bin/mailman/private/debbugs-submit/> List-Post: <mailto:debbugs-submit <at> debbugs.gnu.org> List-Help: <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=help> List-Subscribe: <https://debbugs.gnu.org/cgi-bin/mailman/listinfo/debbugs-submit>, <mailto:debbugs-submit-request <at> debbugs.gnu.org?subject=subscribe> Errors-To: debbugs-submit-bounces <at> debbugs.gnu.org Sender: "Debbugs-submit" <debbugs-submit-bounces <at> debbugs.gnu.org> X-Spam-Score: -2.3 (--) This commit adds a new service type to generate configuration file for the mpv media player. Originally I attempted to use Guix Records (via define-configuration) for this, but ran into the bug #74748, so I had to switch to procedures instead. The usage is (hopefully) sufficiently described in the documentation. When the bug is resolved, I will update it to use define-configuration instead. The full list of supported options is documented, however I decided to *not* document types and purpose for each individual fields. While I had mostly working prototype to extract the documentation from mpv, once I realized it would be few 10k of lines added, I decided it is not worth it. It would bloat the .texi file (by more than 50%), be hard to maintain and, in my opinion, would not provide enough value to justify that. The current version seems like sane middle ground. Option to configure inputs (for mpv) will come later in a separate patch. * gnu/home/services/mpv.scm: New file. * gnu/local.mk (GNU_SYSTEM_MODULES): Register it. * doc/guix.texi (mpv Media Player): Document it. Change-Id: I2deb44799a28047cb5d67da97dc6007a9df873af --- The change itself is not that large. Everything between `START.' and `END.' can be skipped in the code review. The (semi-)interesting parts are above and below. I would prefer to use define-configuration instead of reinventing the wheel, and I even had it implemented, but the performance is just unusable. Waiting 30s after hitting ENTER in the REPL is unbearable. doc/guix.texi | 427 ++++++ gnu/home/services/mpv.scm | 2722 +++++++++++++++++++++++++++++++++++++ gnu/local.mk | 1 + 3 files changed, 3150 insertions(+) create mode 100644 gnu/home/services/mpv.scm diff --git a/doc/guix.texi b/doc/guix.texi index 49c87700b9..249cb323e3 100644 --- a/doc/guix.texi +++ b/doc/guix.texi @@ -47711,6 +47711,433 @@ Media Home Services @end table @end deftp +@c This is ugly, but upstream does *not* capitalize the ``m'' even when +@c at the beginning of a sentence. So let us follow the branding. +@node mpv Media Player +@subsection mpv Media Player + +@cindex mpv, Home Service +@cindex mpv, configuration +Configuring the @uref{https://mpv.io/, mpv media player} can be somewhat +daunting task, due to the sheer amount of options available, especially +if one wants to be able to inherit the configuration in their code. The +@code{home-mpv-service-type} is provided to help with that problem. +When the service is added to your home environment, file based on the +passed configuration is generated and placed into the correct location. + +Due to the bug #74748, it does not use Guix Records to represent the +configuration, but uses keyword arguments to achieve similar result. +Example follows: + +@lisp +(service home-mpv-service-type + (make-home-mpv-configuration + #:global (make-mpv-profile-configuration + #:fullscreen #t + #:alang '("jpn" "eng")))) +@end lisp + +@defvar home-mpv-service-type +This is the type of the mpv home service, whose value is a +@code{home-mpv-configuration} object. +@end defvar + +@deffn {Procedure} make-home-mpv-configuration +Return a new instance of @code{home-mpv-configuration}. Available +keyword arguments are: + +@table @asis +@item @code{inherit} (default: @code{#t}) +Inherit fields from an another instance. + +@item @code{global} (default: @code{(make-mpv-profile-configuration)}) +The global configuration preceding all profiles. + +@item @code{profiles} (default: @code{()}) +An alist containing configuration for any additional profiles to include +in the configuration file. + +@lisp +(make-home-mpv-configuration + #:profiles `((fullscreen . ,(make-mpv-profile-configuration + #:fullscreen #t)))) +@end lisp + +@item @code{extra-config} (default: @code{#f}) +Additional content to include in the configuration file. It is placed +at the end of the file. + +@end table +@end deffn + +@deffn {Procedure} make-mpv-profile-configuration +Return a new instance of @code{mpv-profile-configuration}. As above, it +also supports the @code{#:inherit} argument. Additionally it supports +keyword arguments named after the options of @command{mpv}. Hence +@option{--fullscreen} (or @code{fullscreen} in the configuration file) +becomes @code{#:fullscreen}. + +Few options are using their aliases instead. @option{audio} instead of +@option{aid}, @option{video} instead of @option{vid}, @option{sub} +instead of @option{sid}, @option{screenshot-directory} instead of +@option{screenshot-dir} and @option{watch-later-directory} instead of +@option{watch-later-dir}. + +Valid values for the fields depend on their type. + +@table @asis +@item Flags +The value is evaluated for truthfulness. Typically you would use +@code{#f} or @code{#t}. + +@item Numerical fields +Integer and integer64 fields are validated by @code{integer?}, float and +double fields by @code{real?}. Ranges are checked when applicable. + +@item Aspect +Same as integer. + +@item ByteSize +Same as integer64. + +@item Choice +The value should be a symbol representing member of the enumeration. If +the choice has @samp{or ...} part, it can also be value of that +alternative type. + +@item @var{type} list +The value should be a list of the @var{type}. + +@end table + +Other types accept strings, with validation of the values where possible +(e.g. type @samp{Color} is validated, but type @samp{Audio channels or +channel map} is not). + +The full list of currently supported keyword arguments is below. For +the types, allowed values and full description please refer to the +@command{mpv --list-options} and +@uref{https://mpv.io/manual/stable/#options, mpv manual}. + +Only set fields are outputted to the configuration file. Accessors are +provided for every field, returning either their value or a sentinel +object @code{%unset}. + +@code{ab-loop-a}, @code{ab-loop-b}, @code{ab-loop-count}, +@code{access-references}, @code{ad}, @code{ad-lavc-ac3drc}, +@code{ad-lavc-downmix}, @code{ad-lavc-o}, @code{ad-lavc-threads}, +@code{ad-queue-enable}, @code{ad-queue-max-bytes}, +@code{ad-queue-max-samples}, @code{ad-queue-max-secs}, @code{af}, +@code{audio}, @code{alang}, @code{allow-delayed-peak-detect}, +@code{alsa-buffer-time}, @code{alsa-ignore-chmap}, +@code{alsa-mixer-device}, @code{alsa-mixer-index}, +@code{alsa-mixer-name}, @code{alsa-non-interleaved}, +@code{alsa-periods}, @code{alsa-resample}, @code{ao}, +@code{ao-null-broken-delay}, @code{ao-null-broken-eof}, +@code{ao-null-buffer}, @code{ao-null-channel-layouts}, +@code{ao-null-format}, @code{ao-null-latency}, @code{ao-null-outburst}, +@code{ao-null-speed}, @code{ao-null-untimed}, @code{ao-pcm-append}, +@code{ao-pcm-file}, @code{ao-pcm-waveheader}, +@code{audio-backward-batch}, @code{audio-backward-overlap}, +@code{audio-buffer}, @code{audio-channels}, @code{audio-client-name}, +@code{audio-delay}, @code{audio-demuxer}, @code{audio-device}, +@code{audio-display}, @code{audio-exclusive}, @code{audio-exts}, +@code{audio-fallback-to-null}, @code{audio-file-auto}, +@code{audio-file-paths}, @code{audio-files}, @code{audio-format}, +@code{audio-normalize-downmix}, @code{audio-pitch-correction}, +@code{audio-resample-cutoff}, @code{audio-resample-filter-size}, +@code{audio-resample-linear}, @code{audio-resample-max-output-size}, +@code{audio-resample-phase-shift}, @code{audio-reversal-buffer}, +@code{audio-samplerate}, @code{audio-spdif}, +@code{audio-stream-silence}, @code{audio-swresample-o}, +@code{audio-wait-open}, @code{auto-window-resize}, +@code{autocreate-playlist}, @code{autofit}, @code{autofit-larger}, +@code{autofit-smaller}, @code{autoload-files}, @code{autosync}, +@code{background}, @code{background-color}, @code{blend-subtitles}, +@code{bluray-device}, @code{border}, @code{border-background}, +@code{brightness}, @code{cache}, @code{cache-on-disk}, +@code{cache-pause}, @code{cache-pause-initial}, @code{cache-pause-wait}, +@code{cache-secs}, @code{cdda-cdtext}, @code{cdda-device}, +@code{cdda-overlap}, @code{cdda-paranoia}, @code{cdda-sector-size}, +@code{cdda-skip}, @code{cdda-span-a}, @code{cdda-span-b}, +@code{cdda-speed}, @code{cdda-toc-offset}, +@code{chapter-merge-threshold}, @code{chapter-seek-threshold}, +@code{chapters-file}, @code{config}, @code{container-fps-override}, +@code{contrast}, @code{cookies}, @code{cookies-file}, +@code{corner-rounding}, @code{correct-downscaling}, @code{correct-pts}, +@code{cover-art-auto}, @code{cover-art-files}, +@code{cover-art-whitelist}, @code{cscale}, @code{cscale-antiring}, +@code{cscale-blur}, @code{cscale-clamp}, @code{cscale-param1}, +@code{cscale-param2}, @code{cscale-radius}, @code{cscale-taper}, +@code{cscale-window}, @code{cscale-wparam}, @code{cscale-wtaper}, +@code{cursor-autohide}, @code{cursor-autohide-fs-only}, @code{deband}, +@code{deband-grain}, @code{deband-iterations}, @code{deband-range}, +@code{deband-threshold}, @code{deinterlace}, +@code{deinterlace-field-parity}, @code{demuxer}, +@code{demuxer-backward-playback-step}, @code{demuxer-cache-dir}, +@code{demuxer-cache-unlink-files}, @code{demuxer-cache-wait}, +@code{demuxer-donate-buffer}, @code{demuxer-hysteresis-secs}, +@code{demuxer-lavf-allow-mimetype}, @code{demuxer-lavf-analyzeduration}, +@code{demuxer-lavf-buffersize}, @code{demuxer-lavf-format}, +@code{demuxer-lavf-hacks}, @code{demuxer-lavf-linearize-timestamps}, +@code{demuxer-lavf-o}, @code{demuxer-lavf-probe-info}, +@code{demuxer-lavf-probescore}, @code{demuxer-lavf-probesize}, +@code{demuxer-lavf-propagate-opts}, @code{demuxer-max-back-bytes}, +@code{demuxer-max-bytes}, @code{demuxer-mkv-probe-start-time}, +@code{demuxer-mkv-probe-video-duration}, +@code{demuxer-mkv-subtitle-preroll}, +@code{demuxer-mkv-subtitle-preroll-secs}, +@code{demuxer-mkv-subtitle-preroll-secs-index}, +@code{demuxer-rawaudio-channels}, @code{demuxer-rawaudio-format}, +@code{demuxer-rawaudio-rate}, @code{demuxer-rawvideo-codec}, +@code{demuxer-rawvideo-format}, @code{demuxer-rawvideo-fps}, +@code{demuxer-rawvideo-h}, @code{demuxer-rawvideo-mp-format}, +@code{demuxer-rawvideo-size}, @code{demuxer-rawvideo-w}, +@code{demuxer-readahead-secs}, @code{demuxer-seekable-cache}, +@code{demuxer-termination-timeout}, @code{demuxer-thread}, +@code{directory-filter-types}, @code{directory-mode}, +@code{display-fps-override}, @code{display-tags}, @code{dither}, +@code{dither-depth}, @code{dither-size-fruit}, @code{drag-and-drop}, +@code{drm-connector}, @code{drm-device}, @code{drm-draw-plane}, +@code{drm-draw-surface-size}, @code{drm-drmprime-video-plane}, +@code{drm-format}, @code{drm-mode}, @code{drm-vrr-enabled}, +@code{dscale}, @code{dscale-antiring}, @code{dscale-blur}, +@code{dscale-clamp}, @code{dscale-param1}, @code{dscale-param2}, +@code{dscale-radius}, @code{dscale-taper}, @code{dscale-window}, +@code{dscale-wparam}, @code{dscale-wtaper}, @code{dump-stats}, +@code{dvbin-card}, @code{dvbin-channel-switch-offset}, +@code{dvbin-file}, @code{dvbin-full-transponder}, @code{dvbin-prog}, +@code{dvbin-timeout}, @code{dvd-angle}, @code{dvd-device}, +@code{dvd-speed}, @code{edition}, @code{egl-config-id}, +@code{egl-output-format}, @code{embeddedfonts}, @code{end}, +@code{error-diffusion}, @code{external-files}, @code{fbo-format}, +@code{focus-on}, @code{force-media-title}, @code{force-render}, +@code{force-rgba-osd-rendering}, @code{force-seekable}, +@code{force-window}, @code{force-window-position}, @code{framedrop}, +@code{frames}, @code{fs-screen}, @code{fs-screen-name}, +@code{fullscreen}, @code{gamma}, @code{gamma-auto}, @code{gamma-factor}, +@code{gamut-mapping-mode}, @code{gapless-audio}, @code{geometry}, +@code{glsl-shader-opts}, @code{glsl-shaders}, @code{gpu-api}, +@code{gpu-context}, @code{gpu-debug}, @code{gpu-dumb-mode}, +@code{gpu-hwdec-interop}, @code{gpu-shader-cache}, +@code{gpu-shader-cache-dir}, @code{gpu-sw}, @code{gpu-tex-pad-x}, +@code{gpu-tex-pad-y}, @code{hdr-compute-peak}, +@code{hdr-contrast-recovery}, @code{hdr-contrast-smoothness}, +@code{hdr-peak-decay-rate}, @code{hdr-peak-percentile}, +@code{hdr-scene-threshold-high}, @code{hdr-scene-threshold-low}, +@code{hidpi-window-scale}, @code{hls-bitrate}, @code{hr-seek}, +@code{hr-seek-demuxer-offset}, @code{hr-seek-framedrop}, +@code{http-header-fields}, @code{http-proxy}, @code{hue}, @code{hwdec}, +@code{hwdec-codecs}, @code{hwdec-extra-frames}, +@code{hwdec-image-format}, @code{icc-3dlut-size}, @code{icc-cache}, +@code{icc-cache-dir}, @code{icc-force-contrast}, @code{icc-intent}, +@code{icc-profile}, @code{icc-profile-auto}, @code{icc-use-luma}, +@code{idle}, @code{ignore-path-in-watch-later-config}, +@code{image-display-duration}, @code{image-exts}, @code{image-lut}, +@code{image-lut-type}, @code{image-subs-video-resolution}, +@code{include}, @code{index}, @code{initial-audio-sync}, +@code{input-ar-delay}, @code{input-ar-rate}, +@code{input-builtin-bindings}, @code{input-builtin-dragging}, +@code{input-commands}, @code{input-conf}, @code{input-cursor}, +@code{input-cursor-passthrough}, @code{input-default-bindings}, +@code{input-doubleclick-time}, @code{input-dragging-deadzone}, +@code{input-ipc-client}, @code{input-ipc-server}, +@code{input-key-fifo-size}, @code{input-media-keys}, +@code{input-preprocess-wheel}, @code{input-right-alt-gr}, +@code{input-terminal}, @code{input-test}, +@code{input-touch-emulate-mouse}, @code{input-vo-keyboard}, +@code{interpolation}, @code{interpolation-preserve}, +@code{interpolation-threshold}, @code{inverse-tone-mapping}, +@code{jack-autostart}, @code{jack-connect}, @code{jack-name}, +@code{jack-port}, @code{jack-std-channel-layout}, @code{keep-open}, +@code{keep-open-pause}, @code{keepaspect}, @code{keepaspect-window}, +@code{lavfi-complex}, @code{length}, @code{libplacebo-opts}, +@code{linear-downscaling}, @code{linear-upscaling}, +@code{load-auto-profiles}, @code{load-osd-console}, @code{load-scripts}, +@code{load-select}, @code{load-stats-overlay}, +@code{load-unsafe-playlists}, @code{log-file}, @code{loop-file}, +@code{loop-playlist}, @code{lut}, @code{lut-type}, @code{mc}, +@code{media-controls}, @code{merge-files}, @code{metadata-codepage}, +@code{mf-fps}, @code{mf-type}, @code{monitoraspect}, +@code{monitorpixelaspect}, @code{msg-color}, @code{msg-level}, +@code{msg-module}, @code{msg-time}, @code{mute}, @code{native-fs}, +@code{native-keyrepeat}, @code{native-touch}, @code{network-timeout}, +@code{oac}, @code{oacopts}, @code{ocopy-metadata}, @code{of}, +@code{ofopts}, @code{on-all-workspaces}, @code{ontop}, +@code{ontop-level}, @code{opengl-check-pattern-a}, +@code{opengl-check-pattern-b}, @code{opengl-early-flush}, +@code{opengl-es}, @code{opengl-glfinish}, @code{opengl-pbo}, +@code{opengl-rectangle-textures}, @code{opengl-swapinterval}, +@code{opengl-waitvsync}, @code{orawts}, @code{ordered-chapters}, +@code{ordered-chapters-files}, @code{oremove-metadata}, @code{osc}, +@code{osd-align-x}, @code{osd-align-y}, @code{osd-back-color}, +@code{osd-bar}, @code{osd-bar-align-x}, @code{osd-bar-align-y}, +@code{osd-bar-h}, @code{osd-bar-outline-size}, @code{osd-bar-w}, +@code{osd-blur}, @code{osd-bold}, @code{osd-border-style}, +@code{osd-color}, @code{osd-duration}, @code{osd-font}, +@code{osd-font-provider}, @code{osd-font-size}, @code{osd-fonts-dir}, +@code{osd-fractions}, @code{osd-italic}, @code{osd-justify}, +@code{osd-level}, @code{osd-margin-x}, @code{osd-margin-y}, +@code{osd-msg1}, @code{osd-msg2}, @code{osd-msg3}, @code{osd-on-seek}, +@code{osd-outline-color}, @code{osd-outline-size}, +@code{osd-playing-msg}, @code{osd-playing-msg-duration}, +@code{osd-playlist-entry}, @code{osd-scale}, @code{osd-scale-by-window}, +@code{osd-shadow-offset}, @code{osd-spacing}, @code{osd-status-msg}, +@code{oset-metadata}, @code{ovc}, @code{ovcopts}, @code{panscan}, +@code{pause}, @code{pitch}, @code{play-direction}, +@code{player-operation-mode}, @code{playlist-start}, +@code{prefetch-playlist}, @code{profile}, @code{pulse-allow-suspended}, +@code{pulse-buffer}, @code{pulse-host}, @code{pulse-latency-hacks}, +@code{quiet}, @code{really-quiet}, @code{rebase-start-time}, +@code{referrer}, @code{replaygain}, @code{replaygain-clip}, +@code{replaygain-fallback}, @code{replaygain-preamp}, +@code{reset-on-next-file}, @code{resume-playback}, +@code{resume-playback-check-mtime}, @code{rtsp-transport}, +@code{saturation}, @code{save-position-on-quit}, @code{scale}, +@code{scale-antiring}, @code{scale-blur}, @code{scale-clamp}, +@code{scale-param1}, @code{scale-param2}, @code{scale-radius}, +@code{scale-taper}, @code{scale-window}, @code{scale-wparam}, +@code{scale-wtaper}, @code{scaler-resizes-only}, @code{screen}, +@code{screen-name}, @code{screenshot-avif-encoder}, +@code{screenshot-avif-opts}, @code{screenshot-avif-pixfmt}, +@code{screenshot-directory}, @code{screenshot-format}, +@code{screenshot-high-bit-depth}, @code{screenshot-jpeg-quality}, +@code{screenshot-jpeg-source-chroma}, @code{screenshot-jxl-distance}, +@code{screenshot-jxl-effort}, @code{screenshot-png-compression}, +@code{screenshot-png-filter}, @code{screenshot-sw}, +@code{screenshot-tag-colorspace}, @code{screenshot-template}, +@code{screenshot-webp-compression}, @code{screenshot-webp-lossless}, +@code{screenshot-webp-quality}, @code{script-opts}, @code{scripts}, +@code{secondary-sid}, @code{secondary-sub-ass-override}, +@code{secondary-sub-delay}, @code{secondary-sub-pos}, +@code{secondary-sub-visibility}, @code{sharpen}, @code{show-in-taskbar}, +@code{shuffle}, @code{sub}, @code{sigmoid-center}, @code{sigmoid-slope}, +@code{sigmoid-upscaling}, @code{slang}, @code{snap-window}, +@code{speed}, @code{spirv-compiler}, @code{sstep}, @code{start}, +@code{stop-playback-on-init-failure}, @code{stop-screensaver}, +@code{stream-buffer-size}, @code{stream-dump}, @code{stream-lavf-o}, +@code{stream-record}, @code{stretch-dvd-subs}, +@code{stretch-image-subs-to-screen}, @code{sub-align-x}, +@code{sub-align-y}, @code{sub-ass}, @code{sub-ass-force-margins}, +@code{sub-ass-hinting}, @code{sub-ass-justify}, +@code{sub-ass-line-spacing}, @code{sub-ass-override}, +@code{sub-ass-scale-with-window}, @code{sub-ass-shaper}, +@code{sub-ass-style-overrides}, @code{sub-ass-styles}, +@code{sub-ass-use-video-data}, @code{sub-ass-video-aspect-override}, +@code{sub-ass-vsfilter-color-compat}, @code{sub-auto}, +@code{sub-auto-exts}, @code{sub-back-color}, @code{sub-blur}, +@code{sub-bold}, @code{sub-border-style}, @code{sub-clear-on-seek}, +@code{sub-codepage}, @code{sub-color}, @code{sub-create-cc-track}, +@code{sub-delay}, @code{sub-demuxer}, @code{sub-file-paths}, +@code{sub-files}, @code{sub-filter-jsre}, @code{sub-filter-regex}, +@code{sub-filter-regex-enable}, @code{sub-filter-regex-plain}, +@code{sub-filter-regex-warn}, @code{sub-filter-sdh}, +@code{sub-filter-sdh-enclosures}, @code{sub-filter-sdh-harder}, +@code{sub-fix-timing}, @code{sub-font}, @code{sub-font-provider}, +@code{sub-font-size}, @code{sub-fonts-dir}, +@code{sub-forced-events-only}, @code{sub-fps}, @code{sub-gauss}, +@code{sub-gray}, @code{sub-italic}, @code{sub-justify}, +@code{sub-lavc-o}, @code{sub-margin-x}, @code{sub-margin-y}, +@code{sub-outline-color}, @code{sub-outline-size}, +@code{sub-past-video-end}, @code{sub-pos}, @code{sub-scale}, +@code{sub-scale-by-window}, @code{sub-scale-with-window}, +@code{sub-shadow-offset}, @code{sub-spacing}, @code{sub-speed}, +@code{sub-stretch-durations}, @code{sub-use-margins}, +@code{sub-visibility}, @code{sub-vsfilter-bidi-compat}, +@code{subs-fallback}, @code{subs-fallback-forced}, +@code{subs-match-os-language}, @code{subs-with-matching-audio}, +@code{swapchain-depth}, @code{sws-allow-zimg}, @code{sws-bitexact}, +@code{sws-cgb}, @code{sws-chs}, @code{sws-cs}, @code{sws-cvs}, +@code{sws-fast}, @code{sws-lgb}, @code{sws-ls}, @code{sws-scaler}, +@code{target-colorspace-hint}, @code{target-contrast}, +@code{target-gamut}, @code{target-lut}, @code{target-peak}, +@code{target-prim}, @code{target-trc}, @code{taskbar-progress}, +@code{teletext-page}, @code{temporal-dither}, +@code{temporal-dither-period}, @code{term-osd}, @code{term-osd-bar}, +@code{term-osd-bar-chars}, @code{term-playing-msg}, +@code{term-status-msg}, @code{term-title}, @code{terminal}, +@code{title}, @code{title-bar}, @code{tls-ca-file}, +@code{tls-cert-file}, @code{tls-key-file}, @code{tls-verify}, +@code{tone-mapping}, @code{tone-mapping-max-boost}, +@code{tone-mapping-param}, @code{tone-mapping-visualize}, +@code{track-auto-selection}, @code{tscale}, @code{tscale-antiring}, +@code{tscale-blur}, @code{tscale-clamp}, @code{tscale-param1}, +@code{tscale-param2}, @code{tscale-radius}, @code{tscale-taper}, +@code{tscale-window}, @code{tscale-wparam}, @code{tscale-wtaper}, +@code{untimed}, @code{use-embedded-icc-profile}, +@code{use-filedir-conf}, @code{user-agent}, @code{vaapi-device}, +@code{vd}, @code{vd-apply-cropping}, @code{vd-lavc-assume-old-x264}, +@code{vd-lavc-bitexact}, @code{vd-lavc-check-hw-profile}, +@code{vd-lavc-dr}, @code{vd-lavc-fast}, @code{vd-lavc-film-grain}, +@code{vd-lavc-framedrop}, @code{vd-lavc-o}, @code{vd-lavc-show-all}, +@code{vd-lavc-skipframe}, @code{vd-lavc-skipidct}, +@code{vd-lavc-skiploopfilter}, @code{vd-lavc-software-fallback}, +@code{vd-lavc-threads}, @code{vd-queue-enable}, +@code{vd-queue-max-bytes}, @code{vd-queue-max-samples}, +@code{vd-queue-max-secs}, @code{vf}, @code{video}, @code{video-align-x}, +@code{video-align-y}, @code{video-aspect-method}, +@code{video-aspect-override}, @code{video-backward-batch}, +@code{video-backward-overlap}, @code{video-crop}, @code{video-exts}, +@code{video-latency-hacks}, @code{video-margin-ratio-bottom}, +@code{video-margin-ratio-left}, @code{video-margin-ratio-right}, +@code{video-margin-ratio-top}, @code{video-osd}, +@code{video-output-levels}, @code{video-pan-x}, @code{video-pan-y}, +@code{video-reversal-buffer}, @code{video-rotate}, @code{video-scale-x}, +@code{video-scale-y}, @code{video-sync}, +@code{video-sync-max-audio-change}, @code{video-sync-max-factor}, +@code{video-sync-max-video-change}, @code{video-timing-offset}, +@code{video-unscaled}, @code{video-zoom}, @code{vlang}, @code{vo}, +@code{vo-image-avif-encoder}, @code{vo-image-avif-opts}, +@code{vo-image-avif-pixfmt}, @code{vo-image-format}, +@code{vo-image-high-bit-depth}, @code{vo-image-jpeg-quality}, +@code{vo-image-jpeg-source-chroma}, @code{vo-image-jxl-distance}, +@code{vo-image-jxl-effort}, @code{vo-image-outdir}, +@code{vo-image-png-compression}, @code{vo-image-png-filter}, +@code{vo-image-tag-colorspace}, @code{vo-image-webp-compression}, +@code{vo-image-webp-lossless}, @code{vo-image-webp-quality}, +@code{vo-kitty-alt-screen}, @code{vo-kitty-cols}, +@code{vo-kitty-config-clear}, @code{vo-kitty-height}, +@code{vo-kitty-left}, @code{vo-kitty-rows}, @code{vo-kitty-top}, +@code{vo-kitty-use-shm}, @code{vo-kitty-width}, @code{vo-null-fps}, +@code{vo-sixel-alt-screen}, @code{vo-sixel-buffered}, +@code{vo-sixel-cols}, @code{vo-sixel-config-clear}, +@code{vo-sixel-dither}, @code{vo-sixel-fixedpalette}, +@code{vo-sixel-height}, @code{vo-sixel-left}, @code{vo-sixel-pad-x}, +@code{vo-sixel-pad-y}, @code{vo-sixel-reqcolors}, @code{vo-sixel-rows}, +@code{vo-sixel-threshold}, @code{vo-sixel-top}, @code{vo-sixel-width}, +@code{vo-tct-256}, @code{vo-tct-algo}, @code{vo-tct-buffering}, +@code{vo-tct-height}, @code{vo-tct-width}, @code{vo-vaapi-scaled-osd}, +@code{vo-vaapi-scaling}, @code{vo-vdpau-chroma-deint}, +@code{vo-vdpau-colorkey}, @code{vo-vdpau-composite-detect}, +@code{vo-vdpau-denoise}, @code{vo-vdpau-force-yuv}, @code{vo-vdpau-fps}, +@code{vo-vdpau-hqscaling}, @code{vo-vdpau-output-surfaces}, +@code{vo-vdpau-pullup}, @code{vo-vdpau-queuetime-fs}, +@code{vo-vdpau-queuetime-windowed}, @code{vo-vdpau-sharpen}, +@code{volume}, @code{volume-gain}, @code{volume-gain-max}, +@code{volume-gain-min}, @code{volume-max}, @code{vulkan-async-compute}, +@code{vulkan-async-transfer}, @code{vulkan-device}, +@code{vulkan-display-display}, @code{vulkan-display-mode}, +@code{vulkan-display-plane}, @code{vulkan-queue-count}, +@code{vulkan-swap-mode}, @code{watch-later-directory}, +@code{watch-later-options}, @code{wayland-app-id}, +@code{wayland-configure-bounds}, @code{wayland-content-type}, +@code{wayland-disable-vsync}, @code{wayland-edge-pixels-pointer}, +@code{wayland-edge-pixels-touch}, @code{wayland-present}, @code{wid}, +@code{window-dragging}, @code{window-maximized}, +@code{window-minimized}, @code{window-scale}, +@code{write-filename-in-watch-later-config}, +@code{x11-bypass-compositor}, @code{x11-name}, @code{x11-netwm}, +@code{x11-present}, @code{x11-wid-title}, @code{xv-adaptor}, +@code{xv-buffers}, @code{xv-ck}, @code{xv-ck-method}, +@code{xv-colorkey}, @code{xv-port}, @code{ytdl}, @code{ytdl-format}, +@code{ytdl-raw-options}, @code{zimg-dither}, @code{zimg-fast}, +@code{zimg-scaler}, @code{zimg-scaler-chroma}, +@code{zimg-scaler-chroma-param-a}, @code{zimg-scaler-chroma-param-b}, +@code{zimg-scaler-param-a}, @code{zimg-scaler-param-b}, and +@code{zimg-threads}. + +@end deffn + @node Sway window manager @subsection Sway window manager diff --git a/gnu/home/services/mpv.scm b/gnu/home/services/mpv.scm new file mode 100644 index 0000000000..8e6ac8b261 --- /dev/null +++ b/gnu/home/services/mpv.scm @@ -0,0 +1,2722 @@ +;;; 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 <http://www.gnu.org/licenses/>. + +(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 <profile-option> + (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 <mpv-profile-configuration> + (%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) + (string<? (symbol->string (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 <home-mpv-configuration> + (%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."))) diff --git a/gnu/local.mk b/gnu/local.mk index e149b0e9c4..73a5a659c1 100644 --- a/gnu/local.mk +++ b/gnu/local.mk @@ -110,6 +110,7 @@ GNU_SYSTEM_MODULES = \ %D%/home/services/mail.scm \ %D%/home/services/media.scm \ %D%/home/services/messaging.scm \ + %D%/home/services/mpv.scm \ %D%/home/services/music.scm \ %D%/home/services/pm.scm \ %D%/home/services/shells.scm \ -- 2.46.0
Tomas Volf <~@wolfsden.cz>
:, guix-patches@HIDDEN
.
Full text available., guix-patches@HIDDEN
:bug#74801
; Package guix-patches
.
Full text available.
GNU bug tracking system
Copyright (C) 1999 Darren O. Benham,
1997 nCipher Corporation Ltd,
1994-97 Ian Jackson.