From 0d6d5cb351f1bd6b3ec0a19fe4b652df7b514392 Mon Sep 17 00:00:00 2001 From: NSPC911 <87571998+NSPC911@users.noreply.github.com> Date: Sun, 12 Oct 2025 19:59:56 +0800 Subject: [PATCH 1/7] docs(style): fix background and some other styles --- docs/src/styles/custom.css | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/src/styles/custom.css b/docs/src/styles/custom.css index dc29b71d..a2897427 100644 --- a/docs/src/styles/custom.css +++ b/docs/src/styles/custom.css @@ -186,6 +186,7 @@ summary:not(#starlight__on-this-page--mobile) { [class^="right-sidebar"] { min-width: 20vw; max-width: 300px; + pointer-events: none; > .sl-container { width: calc(25vw - (2 * var(--sidebar-pad-x))); max-width: calc(300px - (2 * var(--sidebar-pad-x))); From 9e7d54c00111c7f104f1e9bbb0671b5888c3afb9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 21 Oct 2025 13:55:13 +0800 Subject: [PATCH 2/7] build(deps): bump vite from 6.3.6 to 6.4.1 in /docs (#133) Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/pnpm-lock.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/pnpm-lock.yaml b/docs/pnpm-lock.yaml index d5c2de5e..39c63004 100644 --- a/docs/pnpm-lock.yaml +++ b/docs/pnpm-lock.yaml @@ -2062,6 +2062,7 @@ packages: sitemap@8.0.0: resolution: {integrity: sha512-+AbdxhM9kJsHtruUF39bwS/B0Fytw6Fr1o4ZAIAEqA6cke2xcoO2GleBw9Zw7nRzILVEgz7zBM5GiTJjie1G9A==} engines: {node: '>=14.0.0', npm: '>=6.0.0'} + deprecated: 'SECURITY: Multiple vulnerabilities fixed in 8.0.1 (XML injection, path traversal, command injection, protocol injection). Upgrade immediately: npm install sitemap@8.0.1' hasBin: true smol-toml@1.4.2: From 549fba05c6067f4cbba0b8f089825f1ff3794d89 Mon Sep 17 00:00:00 2001 From: NSPC911 <87571998+NSPC911@users.noreply.github.com> Date: Thu, 23 Oct 2025 09:14:11 +0800 Subject: [PATCH 3/7] ci: add .coderabbit.yaml --- .coderabbit.yaml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .coderabbit.yaml diff --git a/.coderabbit.yaml b/.coderabbit.yaml new file mode 100644 index 00000000..700feee7 --- /dev/null +++ b/.coderabbit.yaml @@ -0,0 +1,19 @@ +# yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json +# Minimal configuration for getting started +language: "en-US" +reviews: + profile: "chill" + high_level_summary: true + auto_review: + enabled: true + drafts: false + ignore_title_keywords: ["WIP", "wip"] + base_brances: ["master", "dev"] + finishing_touches: + unit_tests: + enabled: false + doc_strings: + enabled: false + tools: + ruff: + enabled: true From 67864330bb0b061ea036c59958af47112f51ad25 Mon Sep 17 00:00:00 2001 From: firedotguy Date: Sat, 28 Feb 2026 14:47:45 +0300 Subject: [PATCH 4/7] feat(preview): add video preview --- pyproject.toml | 1 + src/rovr/classes/config.py | 57 ++++++++++++++++ src/rovr/classes/type_aliases.py | 2 +- src/rovr/config/config.toml | 8 +++ src/rovr/config/schema.json | 42 +++++++++++- src/rovr/core/preview_container.py | 27 ++++++++ src/rovr/functions/path.py | 2 +- src/rovr/variables/constants.py | 1 + uv.lock | 100 +++++++++++++++++++++++++++++ 9 files changed, 235 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index be992dfb..9fa0de1d 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -36,6 +36,7 @@ dependencies = [ "textual-image[textual]>=0.8.4", "textual-speedups>=0.2.1", "tomli>=2.4.0", + "textual-video>=0.1.4", ] [project.urls] diff --git a/src/rovr/classes/config.py b/src/rovr/classes/config.py index be30236e..54dbca05 100644 --- a/src/rovr/classes/config.py +++ b/src/rovr/classes/config.py @@ -579,6 +579,9 @@ class _RovrConfigInterface(TypedDict, total=False): image_viewer: "_RovrConfigInterfaceImageViewer" r""" Settings related to the image viewer used in the preview sidebar """ + video_viewer: "_RovrConfigInterfaceVideoViewer" + r""" Settings related to the video viewer used in the preview sidebar """ + allow_tab_nav: bool r""" Allow navigating the main app screen with `tab` and `shift+tab` @@ -713,6 +716,45 @@ class _RovrConfigInterfaceImageViewer(TypedDict, total=False): """ +class _RovrConfigInterfaceVideoViewer(TypedDict, total=False): + r"""Settings related to the video viewer used in the preview sidebar""" + + protocol: "_RovrConfigInterfaceImageViewerProtocol" + r""" + The image protocol to use when displaying an video + + default: Halfcell + """ + + fps_decrease_factor: int + r""" + FPS decrease factor + + default: 1 + """ + + pause_icon_type: "_RovrConfigInterfaceVideoViewerPauseIconType" + r""" + Pause button icon type. + + default: nerd + """ + + show_track: bool + r""" + Whether to show player track + + default: True + """ + + show_controls: bool + r""" + Whether to show player controls (pause button and time) + + default: True + """ + + _RovrConfigInterfaceImageViewerMaxSizeItem = int r""" minimum: 1 """ @@ -767,6 +809,18 @@ class _RovrConfigInterfaceImageViewer(TypedDict, total=False): _ROVRCONFIGINTERFACEIMAGEVIEWERRESAMPLING_HAMMING: Literal["hamming"] = "hamming" r"""The values for the 'The resampling method to use when resizing images. This is only applicable when the image exceeds the maximum size specified in `max_size`' enum""" +_RovrConfigInterfaceVideoViewerPauseIconType = ( + Literal["unicode"] + | Literal["emoji"] + | Literal["ascii"] + | Literal["nerd"] +) +r""" +Pause button icon type. + +default: nerd +""" + _RovrConfigInterfaceMimeRulesAdditionalproperties = ( Literal["text"] @@ -777,6 +831,7 @@ class _RovrConfigInterfaceImageViewer(TypedDict, total=False): | Literal["remime"] | Literal["resvg"] | Literal["font"] + | Literal["video"] ) _ROVRCONFIGINTERFACEMIMERULESADDITIONALPROPERTIES_TEXT: Literal["text"] = "text" r"""The values for the '_RovrConfigInterfaceMimeRulesAdditionalproperties' enum""" @@ -796,6 +851,8 @@ class _RovrConfigInterfaceImageViewer(TypedDict, total=False): r"""The values for the '_RovrConfigInterfaceMimeRulesAdditionalproperties' enum""" _ROVRCONFIGINTERFACEMIMERULESADDITIONALPROPERTIES_FONT: Literal["font"] = "font" r"""The values for the '_RovrConfigInterfaceMimeRulesAdditionalproperties' enum""" +_ROVRCONFIGINTERFACEMIMERULESADDITIONALPROPERTIES_VIDEO: Literal["video"] = "video" +r"""The values for the '_RovrConfigInterfaceMimeRulesAdditionalproperties' enum""" class _RovrConfigInterfacePreviewText(TypedDict, total=False): diff --git a/src/rovr/classes/type_aliases.py b/src/rovr/classes/type_aliases.py index c9a51397..2910cadf 100644 --- a/src/rovr/classes/type_aliases.py +++ b/src/rovr/classes/type_aliases.py @@ -3,7 +3,7 @@ from typing import Literal, TypeAlias PreviewTypes: TypeAlias = Literal[ - "text", "image", "pdf", "archive", "folder", "remime", "resvg", "font" + "text", "image", "pdf", "archive", "folder", "remime", "resvg", "font", "video" ] SortByOptions: TypeAlias = Literal[ "name", "size", "modified", "created", "extension", "natural" diff --git a/src/rovr/config/config.toml b/src/rovr/config/config.toml index c84177bc..fb2f180c 100644 --- a/src/rovr/config/config.toml +++ b/src/rovr/config/config.toml @@ -22,6 +22,13 @@ scrolloff = 3 protocol = "Auto" max_size = [4000, 4000] +[interface.video_viewer] +protocol = "Halfcell" +fps_decrease_factor = 5 +pause_icon_type = 'unicode' +show_controls = true +show_track = true + [interface.preview_text] error = "couldn't read this file! (\u00AC_\u00AC)" # ¬_¬ start = """ @@ -67,6 +74,7 @@ panels = false "application/ms-opentype" = "font" "application/font-.*" = "font" "application/x-font-.*" = "font" +"video/mp4" = "video" [settings] copy_includes_metadata = true diff --git a/src/rovr/config/schema.json b/src/rovr/config/schema.json index 1bb5e506..ced81bbe 100644 --- a/src/rovr/config/schema.json +++ b/src/rovr/config/schema.json @@ -93,6 +93,40 @@ } } }, + "video_viewer": { + "type": "object", + "description": "Settings related to the video viewer used in the preview sidebar", + "additionalProperties": false, + "properties": { + "protocol": { + "type": "string", + "default": "Halfcell", + "description": "The image protocol to use when displaying an video", + "enum": ["Auto", "TGP", "Sixel", "Halfcell", "Unicode"] + }, + "fps_decrease_factor": { + "type": "integer", + "default": 1, + "description": "FPS decrease factor" + }, + "pause_icon_type": { + "type": "string", + "default": "nerd", + "description": "Pause button icon type.", + "enum": ["nerd", "ascii", "emoji", "unicode"] + }, + "show_track": { + "type": "boolean", + "default": true, + "description": "Whether to show player track" + }, + "show_controls": { + "type": "boolean", + "default": "true", + "description": "Whether to show player controls (pause button and time)" + } + } + }, "allow_tab_nav": { "type": "boolean", "default": false, @@ -179,7 +213,8 @@ "folder", "remime", "resvg", - "font" + "font", + "video" ] }, "default": { @@ -201,9 +236,10 @@ "font/.*": "font", "application/ms-opentype": "font", "application/font-.*": "font", - "application/x-font-.*": "font" + "application/x-font-.*": "font", + "video/mp4": "video" }, - "description": "Map MIME type patterns to preview types. Uses regex patterns. Valid preview types: text, image, pdf, archive, folder, resvg, font, remime.\n-> Use 'remime' if you want a more accurate description from file(1)" + "description": "Map MIME type patterns to preview types. Uses regex patterns. Valid preview types: text, image, pdf, archive, folder, resvg, font, remime, video.\n-> Use 'remime' if you want a more accurate description from file(1)" } } }, diff --git a/src/rovr/core/preview_container.py b/src/rovr/core/preview_container.py index 33eacc97..564db93a 100644 --- a/src/rovr/core/preview_container.py +++ b/src/rovr/core/preview_container.py @@ -10,6 +10,8 @@ from typing import cast import textual_image.widget +from textual_video import VideoPlayer +from textual_video.enums import IconType, ImageType from PIL import Image, ImageDraw, ImageFont, UnidentifiedImageError from PIL.Image import Image as PILImage from resvg_py import svg_to_bytes @@ -349,6 +351,28 @@ def show_resvg_preview(self) -> None: return self.app.call_from_thread(setattr, self, "border_title", titles.svg) + def show_video_preview(self, depth: int = 0) -> None: + """Show video preview. Runs in a thread.""" + if should_cancel() or self._current_file_path is None: + return + self.app.call_from_thread(setattr, self, "border_title", titles.video) + self.app.call_from_thread(self.remove_children) + + if should_cancel(): + return + self.app.call_from_thread(self.mount, VideoPlayer( + self._current_file_path, + image_type=ImageType(config['interface']['video_viewer']['protocol']), + # render_delay=0.03, # temporarily fixes assertions with sixel, will be fixed in future + fps_decrease_factor=config['interface']['video_viewer']['fps_decrease_factor'], + pause_icon_type=IconType(config['interface']['video_viewer']['pause_icon_type']), + show_controls=config['interface']['video_viewer']['show_controls'], + show_track=config['interface']['video_viewer']['show_track'] + )) + + if should_cancel(): + return + def show_image_preview(self, depth: int = 0) -> None: """Show image preview. Runs in a thread.""" if should_cancel() or self._current_file_path is None: @@ -1052,6 +1076,9 @@ def update_ui( elif file_type == "image": self.log("Showing image preview") self.show_image_preview() + elif file_type == "video": + self.log("Showing video preview") + self.show_video_preview() elif file_type == "archive": self.log("Showing archive preview") self.show_archive_preview() diff --git a/src/rovr/functions/path.py b/src/rovr/functions/path.py index 9719be42..24978214 100644 --- a/src/rovr/functions/path.py +++ b/src/rovr/functions/path.py @@ -631,7 +631,7 @@ def match_mime_to_preview_type( widget: DOMNode, mime_type: str, ) -> ( - Literal["text", "image", "pdf", "archive", "folder", "remime", "resvg", "font"] + Literal["text", "image", "pdf", "archive", "folder", "remime", "resvg", "font", "video"] | None ): """ diff --git a/src/rovr/variables/constants.py b/src/rovr/variables/constants.py index be485577..de949ad5 100644 --- a/src/rovr/variables/constants.py +++ b/src/rovr/variables/constants.py @@ -60,6 +60,7 @@ class PreviewContainerTitles: pdf = "PDF Preview" svg = "SVG Preview" font = "Font Preview" + video = "Video Preview" buttons_that_depend_on_path = [ diff --git a/uv.lock b/uv.lock index c0f277be..1eb67bb9 100644 --- a/uv.lock +++ b/uv.lock @@ -106,6 +106,35 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, ] +[[package]] +name = "av" +version = "16.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/78/cd/3a83ffbc3cc25b39721d174487fb0d51a76582f4a1703f98e46170ce83d4/av-16.1.0.tar.gz", hash = "sha256:a094b4fd87a3721dacf02794d3d2c82b8d712c85b9534437e82a8a978c175ffd", size = 4285203, upload-time = "2026-01-11T07:31:33.772Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/84/2535f55edcd426cebec02eb37b811b1b0c163f26b8d3f53b059e2ec32665/av-16.1.0-cp312-cp312-macosx_11_0_x86_64.whl", hash = "sha256:640f57b93f927fba8689f6966c956737ee95388a91bd0b8c8b5e0481f73513d6", size = 26945785, upload-time = "2026-01-09T20:18:34.486Z" }, + { url = "https://files.pythonhosted.org/packages/b6/17/ffb940c9e490bf42e86db4db1ff426ee1559cd355a69609ec1efe4d3a9eb/av-16.1.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:ae3fb658eec00852ebd7412fdc141f17f3ddce8afee2d2e1cf366263ad2a3b35", size = 21481147, upload-time = "2026-01-09T20:18:36.716Z" }, + { url = "https://files.pythonhosted.org/packages/15/c1/e0d58003d2d83c3921887d5c8c9b8f5f7de9b58dc2194356a2656a45cfdc/av-16.1.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:27ee558d9c02a142eebcbe55578a6d817fedfde42ff5676275504e16d07a7f86", size = 39517197, upload-time = "2026-01-11T09:57:31.937Z" }, + { url = "https://files.pythonhosted.org/packages/32/77/787797b43475d1b90626af76f80bfb0c12cfec5e11eafcfc4151b8c80218/av-16.1.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:7ae547f6d5fa31763f73900d43901e8c5fa6367bb9a9840978d57b5a7ae14ed2", size = 41174337, upload-time = "2026-01-11T09:57:35.792Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ac/d90df7f1e3b97fc5554cf45076df5045f1e0a6adf13899e10121229b826c/av-16.1.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8cf065f9d438e1921dc31fc7aa045790b58aee71736897866420d80b5450f62a", size = 40817720, upload-time = "2026-01-11T09:57:39.039Z" }, + { url = "https://files.pythonhosted.org/packages/80/6f/13c3a35f9dbcebafd03fe0c4cbd075d71ac8968ec849a3cfce406c35a9d2/av-16.1.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a345877a9d3cc0f08e2bc4ec163ee83176864b92587afb9d08dff50f37a9a829", size = 42267396, upload-time = "2026-01-11T09:57:42.115Z" }, + { url = "https://files.pythonhosted.org/packages/c8/b9/275df9607f7fb44317ccb1d4be74827185c0d410f52b6e2cd770fe209118/av-16.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:f49243b1d27c91cd8c66fdba90a674e344eb8eb917264f36117bf2b6879118fd", size = 31752045, upload-time = "2026-01-11T09:57:45.106Z" }, + { url = "https://files.pythonhosted.org/packages/75/2a/63797a4dde34283dd8054219fcb29294ba1c25d68ba8c8c8a6ae53c62c45/av-16.1.0-cp313-cp313-macosx_11_0_x86_64.whl", hash = "sha256:ce2a1b3d8bf619f6c47a9f28cfa7518ff75ddd516c234a4ee351037b05e6a587", size = 26916715, upload-time = "2026-01-11T09:57:47.682Z" }, + { url = "https://files.pythonhosted.org/packages/d2/c4/0b49cf730d0ae8cda925402f18ae814aef351f5772d14da72dd87ff66448/av-16.1.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:408dbe6a2573ca58a855eb8cd854112b33ea598651902c36709f5f84c991ed8e", size = 21452167, upload-time = "2026-01-11T09:57:50.606Z" }, + { url = "https://files.pythonhosted.org/packages/51/23/408806503e8d5d840975aad5699b153aaa21eb6de41ade75248a79b7a37f/av-16.1.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:57f657f86652a160a8a01887aaab82282f9e629abf94c780bbdbb01595d6f0f7", size = 39215659, upload-time = "2026-01-11T09:57:53.757Z" }, + { url = "https://files.pythonhosted.org/packages/c4/19/a8528d5bba592b3903f44c28dab9cc653c95fcf7393f382d2751a1d1523e/av-16.1.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:adbad2b355c2ee4552cac59762809d791bda90586d134a33c6f13727fb86cb3a", size = 40874970, upload-time = "2026-01-11T09:57:56.802Z" }, + { url = "https://files.pythonhosted.org/packages/e8/24/2dbcdf0e929ad56b7df078e514e7bd4ca0d45cba798aff3c8caac097d2f7/av-16.1.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f42e1a68ec2aebd21f7eb6895be69efa6aa27eec1670536876399725bbda4b99", size = 40530345, upload-time = "2026-01-11T09:58:00.421Z" }, + { url = "https://files.pythonhosted.org/packages/54/27/ae91b41207f34e99602d1c72ab6ffd9c51d7c67e3fbcd4e3a6c0e54f882c/av-16.1.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:58fe47aeaef0f100c40ec8a5de9abbd37f118d3ca03829a1009cf288e9aef67c", size = 41972163, upload-time = "2026-01-11T09:58:03.756Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7a/22158fb923b2a9a00dfab0e96ef2e8a1763a94dd89e666a5858412383d46/av-16.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:565093ebc93b2f4b76782589564869dadfa83af5b852edebedd8fee746457d06", size = 31729230, upload-time = "2026-01-11T09:58:07.254Z" }, + { url = "https://files.pythonhosted.org/packages/7f/f1/878f8687d801d6c4565d57ebec08449c46f75126ebca8e0fed6986599627/av-16.1.0-cp313-cp313t-macosx_11_0_x86_64.whl", hash = "sha256:574081a24edb98343fd9f473e21ae155bf61443d4ec9d7708987fa597d6b04b2", size = 27008769, upload-time = "2026-01-11T09:58:10.266Z" }, + { url = "https://files.pythonhosted.org/packages/30/f1/bd4ce8c8b5cbf1d43e27048e436cbc9de628d48ede088a1d0a993768eb86/av-16.1.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:9ab00ea29c25ebf2ea1d1e928d7babb3532d562481c5d96c0829212b70756ad0", size = 21590588, upload-time = "2026-01-11T09:58:12.629Z" }, + { url = "https://files.pythonhosted.org/packages/1d/dd/c81f6f9209201ff0b5d5bed6da6c6e641eef52d8fbc930d738c3f4f6f75d/av-16.1.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:a84a91188c1071f238a9523fd42dbe567fb2e2607b22b779851b2ce0eac1b560", size = 40638029, upload-time = "2026-01-11T09:58:15.399Z" }, + { url = "https://files.pythonhosted.org/packages/15/4d/07edff82b78d0459a6e807e01cd280d3180ce832efc1543de80d77676722/av-16.1.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:c2cd0de4dd022a7225ff224fde8e7971496d700be41c50adaaa26c07bb50bf97", size = 41970776, upload-time = "2026-01-11T09:58:19.075Z" }, + { url = "https://files.pythonhosted.org/packages/da/9d/1f48b354b82fa135d388477cd1b11b81bdd4384bd6a42a60808e2ec2d66b/av-16.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0816143530624a5a93bc5494f8c6eeaf77549b9366709c2ac8566c1e9bff6df5", size = 41764751, upload-time = "2026-01-11T09:58:22.788Z" }, + { url = "https://files.pythonhosted.org/packages/2f/c7/a509801e98db35ec552dd79da7bdbcff7104044bfeb4c7d196c1ce121593/av-16.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e3a28053af29644696d0c007e897d19b1197585834660a54773e12a40b16974c", size = 43034355, upload-time = "2026-01-11T09:58:26.125Z" }, + { url = "https://files.pythonhosted.org/packages/36/8b/e5f530d9e8f640da5f5c5f681a424c65f9dd171c871cd255d8a861785a6e/av-16.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2e3e67144a202b95ed299d165232533989390a9ea3119d37eccec697dc6dbb0c", size = 31947047, upload-time = "2026-01-11T09:58:31.867Z" }, +] + [[package]] name = "backports-zstd" version = "1.3.0" @@ -677,6 +706,46 @@ version = "4.0.1" source = { registry = "https://pypi.org/simple" } sdist = { url = "https://files.pythonhosted.org/packages/bf/f2/26729cc4e2a893dcabdab4f171e43b2d082756fde1af7cde31f616fc3a31/nuitka-4.0.1.tar.gz", hash = "sha256:8a8dedd549049a145e1545206a082bfbe0bc610457a71d837e560e7cf015635c", size = 4417011, upload-time = "2026-02-14T20:51:34.903Z" } +[[package]] +name = "numpy" +version = "2.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/fd/0005efbd0af48e55eb3c7208af93f2862d4b1a56cd78e84309a2d959208d/numpy-2.4.2.tar.gz", hash = "sha256:659a6107e31a83c4e33f763942275fd278b21d095094044eb35569e86a21ddae", size = 20723651, upload-time = "2026-01-31T23:13:10.135Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/6e/6f394c9c77668153e14d4da83bcc247beb5952f6ead7699a1a2992613bea/numpy-2.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:21982668592194c609de53ba4933a7471880ccbaadcc52352694a59ecc860b3a", size = 16667963, upload-time = "2026-01-31T23:10:52.147Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f8/55483431f2b2fd015ae6ed4fe62288823ce908437ed49db5a03d15151678/numpy-2.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40397bda92382fcec844066efb11f13e1c9a3e2a8e8f318fb72ed8b6db9f60f1", size = 14693571, upload-time = "2026-01-31T23:10:54.789Z" }, + { url = "https://files.pythonhosted.org/packages/2f/20/18026832b1845cdc82248208dd929ca14c9d8f2bac391f67440707fff27c/numpy-2.4.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b3a24467af63c67829bfaa61eecf18d5432d4f11992688537be59ecd6ad32f5e", size = 5203469, upload-time = "2026-01-31T23:10:57.343Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/2eb97c8a77daaba34eaa3fa7241a14ac5f51c46a6bd5911361b644c4a1e2/numpy-2.4.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:805cc8de9fd6e7a22da5aed858e0ab16be5a4db6c873dde1d7451c541553aa27", size = 6550820, upload-time = "2026-01-31T23:10:59.429Z" }, + { url = "https://files.pythonhosted.org/packages/b1/91/b97fdfd12dc75b02c44e26c6638241cc004d4079a0321a69c62f51470c4c/numpy-2.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d82351358ffbcdcd7b686b90742a9b86632d6c1c051016484fa0b326a0a1548", size = 15663067, upload-time = "2026-01-31T23:11:01.291Z" }, + { url = "https://files.pythonhosted.org/packages/f5/c6/a18e59f3f0b8071cc85cbc8d80cd02d68aa9710170b2553a117203d46936/numpy-2.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e35d3e0144137d9fdae62912e869136164534d64a169f86438bc9561b6ad49f", size = 16619782, upload-time = "2026-01-31T23:11:03.669Z" }, + { url = "https://files.pythonhosted.org/packages/b7/83/9751502164601a79e18847309f5ceec0b1446d7b6aa12305759b72cf98b2/numpy-2.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adb6ed2ad29b9e15321d167d152ee909ec73395901b70936f029c3bc6d7f4460", size = 17013128, upload-time = "2026-01-31T23:11:05.913Z" }, + { url = "https://files.pythonhosted.org/packages/61/c4/c4066322256ec740acc1c8923a10047818691d2f8aec254798f3dd90f5f2/numpy-2.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8906e71fd8afcb76580404e2a950caef2685df3d2a57fe82a86ac8d33cc007ba", size = 18345324, upload-time = "2026-01-31T23:11:08.248Z" }, + { url = "https://files.pythonhosted.org/packages/ab/af/6157aa6da728fa4525a755bfad486ae7e3f76d4c1864138003eb84328497/numpy-2.4.2-cp312-cp312-win32.whl", hash = "sha256:ec055f6dae239a6299cace477b479cca2fc125c5675482daf1dd886933a1076f", size = 5960282, upload-time = "2026-01-31T23:11:10.497Z" }, + { url = "https://files.pythonhosted.org/packages/92/0f/7ceaaeaacb40567071e94dbf2c9480c0ae453d5bb4f52bea3892c39dc83c/numpy-2.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:209fae046e62d0ce6435fcfe3b1a10537e858249b3d9b05829e2a05218296a85", size = 12314210, upload-time = "2026-01-31T23:11:12.176Z" }, + { url = "https://files.pythonhosted.org/packages/2f/a3/56c5c604fae6dd40fa2ed3040d005fca97e91bd320d232ac9931d77ba13c/numpy-2.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:fbde1b0c6e81d56f5dccd95dd4a711d9b95df1ae4009a60887e56b27e8d903fa", size = 10220171, upload-time = "2026-01-31T23:11:14.684Z" }, + { url = "https://files.pythonhosted.org/packages/a1/22/815b9fe25d1d7ae7d492152adbc7226d3eff731dffc38fe970589fcaaa38/numpy-2.4.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25f2059807faea4b077a2b6837391b5d830864b3543627f381821c646f31a63c", size = 16663696, upload-time = "2026-01-31T23:11:17.516Z" }, + { url = "https://files.pythonhosted.org/packages/09/f0/817d03a03f93ba9c6c8993de509277d84e69f9453601915e4a69554102a1/numpy-2.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bd3a7a9f5847d2fb8c2c6d1c862fa109c31a9abeca1a3c2bd5a64572955b2979", size = 14688322, upload-time = "2026-01-31T23:11:19.883Z" }, + { url = "https://files.pythonhosted.org/packages/da/b4/f805ab79293c728b9a99438775ce51885fd4f31b76178767cfc718701a39/numpy-2.4.2-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:8e4549f8a3c6d13d55041925e912bfd834285ef1dd64d6bc7d542583355e2e98", size = 5198157, upload-time = "2026-01-31T23:11:22.375Z" }, + { url = "https://files.pythonhosted.org/packages/74/09/826e4289844eccdcd64aac27d13b0fd3f32039915dd5b9ba01baae1f436c/numpy-2.4.2-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:aea4f66ff44dfddf8c2cffd66ba6538c5ec67d389285292fe428cb2c738c8aef", size = 6546330, upload-time = "2026-01-31T23:11:23.958Z" }, + { url = "https://files.pythonhosted.org/packages/19/fb/cbfdbfa3057a10aea5422c558ac57538e6acc87ec1669e666d32ac198da7/numpy-2.4.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c3cd545784805de05aafe1dde61752ea49a359ccba9760c1e5d1c88a93bbf2b7", size = 15660968, upload-time = "2026-01-31T23:11:25.713Z" }, + { url = "https://files.pythonhosted.org/packages/04/dc/46066ce18d01645541f0186877377b9371b8fa8017fa8262002b4ef22612/numpy-2.4.2-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0d9b7c93578baafcbc5f0b83eaf17b79d345c6f36917ba0c67f45226911d499", size = 16607311, upload-time = "2026-01-31T23:11:28.117Z" }, + { url = "https://files.pythonhosted.org/packages/14/d9/4b5adfc39a43fa6bf918c6d544bc60c05236cc2f6339847fc5b35e6cb5b0/numpy-2.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f74f0f7779cc7ae07d1810aab8ac6b1464c3eafb9e283a40da7309d5e6e48fbb", size = 17012850, upload-time = "2026-01-31T23:11:30.888Z" }, + { url = "https://files.pythonhosted.org/packages/b7/20/adb6e6adde6d0130046e6fdfb7675cc62bc2f6b7b02239a09eb58435753d/numpy-2.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c7ac672d699bf36275c035e16b65539931347d68b70667d28984c9fb34e07fa7", size = 18334210, upload-time = "2026-01-31T23:11:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/78/0e/0a73b3dff26803a8c02baa76398015ea2a5434d9b8265a7898a6028c1591/numpy-2.4.2-cp313-cp313-win32.whl", hash = "sha256:8e9afaeb0beff068b4d9cd20d322ba0ee1cecfb0b08db145e4ab4dd44a6b5110", size = 5958199, upload-time = "2026-01-31T23:11:35.385Z" }, + { url = "https://files.pythonhosted.org/packages/43/bc/6352f343522fcb2c04dbaf94cb30cca6fd32c1a750c06ad6231b4293708c/numpy-2.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:7df2de1e4fba69a51c06c28f5a3de36731eb9639feb8e1cf7e4a7b0daf4cf622", size = 12310848, upload-time = "2026-01-31T23:11:38.001Z" }, + { url = "https://files.pythonhosted.org/packages/6e/8d/6da186483e308da5da1cc6918ce913dcfe14ffde98e710bfeff2a6158d4e/numpy-2.4.2-cp313-cp313-win_arm64.whl", hash = "sha256:0fece1d1f0a89c16b03442eae5c56dc0be0c7883b5d388e0c03f53019a4bfd71", size = 10221082, upload-time = "2026-01-31T23:11:40.392Z" }, + { url = "https://files.pythonhosted.org/packages/25/a1/9510aa43555b44781968935c7548a8926274f815de42ad3997e9e83680dd/numpy-2.4.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5633c0da313330fd20c484c78cdd3f9b175b55e1a766c4a174230c6b70ad8262", size = 14815866, upload-time = "2026-01-31T23:11:42.495Z" }, + { url = "https://files.pythonhosted.org/packages/36/30/6bbb5e76631a5ae46e7923dd16ca9d3f1c93cfa8d4ed79a129814a9d8db3/numpy-2.4.2-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:d9f64d786b3b1dd742c946c42d15b07497ed14af1a1f3ce840cce27daa0ce913", size = 5325631, upload-time = "2026-01-31T23:11:44.7Z" }, + { url = "https://files.pythonhosted.org/packages/46/00/3a490938800c1923b567b3a15cd17896e68052e2145d8662aaf3e1ffc58f/numpy-2.4.2-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:b21041e8cb6a1eb5312dd1d2f80a94d91efffb7a06b70597d44f1bd2dfc315ab", size = 6646254, upload-time = "2026-01-31T23:11:46.341Z" }, + { url = "https://files.pythonhosted.org/packages/d3/e9/fac0890149898a9b609caa5af7455a948b544746e4b8fe7c212c8edd71f8/numpy-2.4.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:00ab83c56211a1d7c07c25e3217ea6695e50a3e2f255053686b081dc0b091a82", size = 15720138, upload-time = "2026-01-31T23:11:48.082Z" }, + { url = "https://files.pythonhosted.org/packages/ea/5c/08887c54e68e1e28df53709f1893ce92932cc6f01f7c3d4dc952f61ffd4e/numpy-2.4.2-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2fb882da679409066b4603579619341c6d6898fc83a8995199d5249f986e8e8f", size = 16655398, upload-time = "2026-01-31T23:11:50.293Z" }, + { url = "https://files.pythonhosted.org/packages/4d/89/253db0fa0e66e9129c745e4ef25631dc37d5f1314dad2b53e907b8538e6d/numpy-2.4.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:66cb9422236317f9d44b67b4d18f44efe6e9c7f8794ac0462978513359461554", size = 17079064, upload-time = "2026-01-31T23:11:52.927Z" }, + { url = "https://files.pythonhosted.org/packages/2a/d5/cbade46ce97c59c6c3da525e8d95b7abe8a42974a1dc5c1d489c10433e88/numpy-2.4.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0f01dcf33e73d80bd8dc0f20a71303abbafa26a19e23f6b68d1aa9990af90257", size = 18379680, upload-time = "2026-01-31T23:11:55.22Z" }, + { url = "https://files.pythonhosted.org/packages/40/62/48f99ae172a4b63d981babe683685030e8a3df4f246c893ea5c6ef99f018/numpy-2.4.2-cp313-cp313t-win32.whl", hash = "sha256:52b913ec40ff7ae845687b0b34d8d93b60cb66dcee06996dd5c99f2fc9328657", size = 6082433, upload-time = "2026-01-31T23:11:58.096Z" }, + { url = "https://files.pythonhosted.org/packages/07/38/e054a61cfe48ad9f1ed0d188e78b7e26859d0b60ef21cd9de4897cdb5326/numpy-2.4.2-cp313-cp313t-win_amd64.whl", hash = "sha256:5eea80d908b2c1f91486eb95b3fb6fab187e569ec9752ab7d9333d2e66bf2d6b", size = 12451181, upload-time = "2026-01-31T23:11:59.782Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a4/a05c3a6418575e185dd84d0b9680b6bb2e2dc3e4202f036b7b4e22d6e9dc/numpy-2.4.2-cp313-cp313t-win_arm64.whl", hash = "sha256:fd49860271d52127d61197bb50b64f58454e9f578cb4b2c001a6de8b1f50b0b1", size = 10290756, upload-time = "2026-01-31T23:12:02.438Z" }, +] + [[package]] name = "packaging" version = "26.0" @@ -1103,6 +1172,7 @@ dependencies = [ { name = "textual-autocomplete" }, { name = "textual-image", extra = ["textual"] }, { name = "textual-speedups" }, + { name = "textual-video" }, { name = "tomli" }, ] @@ -1148,6 +1218,7 @@ requires-dist = [ { name = "textual-autocomplete", specifier = ">=4.0.6" }, { name = "textual-image", extras = ["textual"], specifier = ">=0.8.4" }, { name = "textual-speedups", specifier = ">=0.2.1" }, + { name = "textual-video", specifier = ">=0.1.4" }, { name = "tomli", specifier = ">=2.4.0" }, ] @@ -1298,6 +1369,19 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/9f/66/ebe744d79c87f25a42d2654dddbd09462edd595f2ded715245a51a546461/textual_autocomplete-4.0.6-py3-none-any.whl", hash = "sha256:bff69c19386e2cbb4a007503b058dc37671d480a4fa2ddb3959c15ceb4aff9b5", size = 16499, upload-time = "2025-09-24T21:19:18.489Z" }, ] +[[package]] +name = "textual-canvas" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "textual" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/37/7e/f2c65b73f8a795a2ed9fbc65667a80db46b1e85799001e63de9869b7a53d/textual_canvas-1.1.0.tar.gz", hash = "sha256:cad9ad99901db25a94e91f7a1b9e14d7db0638c0cb38979a13db13eef1af0ab4", size = 7329, upload-time = "2025-10-02T15:09:21.603Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/ec/adf15c678f3c373dc781555f112f9f8d5b8b5f8b6b7f28b89b4ef89d440f/textual_canvas-1.1.0-py3-none-any.whl", hash = "sha256:fc7a938011c165f1a189fbae4f2e688d68c1fc3276a9111691a8b96514ffede0", size = 8393, upload-time = "2025-10-02T15:09:20.016Z" }, +] + [[package]] name = "textual-dev" version = "1.8.0" @@ -1391,6 +1475,22 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/94/7d/5c05f0237ea0665dcfe88982b45148a64883cb78bbf5b6bb1beb66265bb2/textual_speedups-0.2.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:bdd9298bd66853b2df37a766193d28bdc0de86b80067fd90737fd9405bd5a727", size = 483602, upload-time = "2025-11-28T09:38:45.728Z" }, ] +[[package]] +name = "textual-video" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "av" }, + { name = "numpy" }, + { name = "textual" }, + { name = "textual-canvas" }, + { name = "textual-image" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/80/83f99397b0c7a11b2e296c2f7006a6255ad4d086b0d2a9c7a167d0d7c3bd/textual_video-0.1.4.tar.gz", hash = "sha256:60c934090c808b539dbe95245d2ec28a6ea34025357bbb5bfc68808b199c3f0b", size = 9601, upload-time = "2026-02-28T10:17:34.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e3/2d/36fa9aadf4f4dcc187aba04f6de9ae36eccfcfe02221a5dd458b399fe9af/textual_video-0.1.4-py3-none-any.whl", hash = "sha256:7f9b947c02875b94de50899e631f46f84f00370b099e2df90875cf94589de25a", size = 10382, upload-time = "2026-02-28T10:17:33.037Z" }, +] + [[package]] name = "tomli" version = "2.4.0" From c5a9d2c47ab83ae75d86bff9f2e6e73380baef77 Mon Sep 17 00:00:00 2001 From: firedotguy Date: Sat, 28 Feb 2026 14:50:46 +0300 Subject: [PATCH 5/7] ruff fixes --- src/rovr/core/preview_container.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/rovr/core/preview_container.py b/src/rovr/core/preview_container.py index 564db93a..49ead2ee 100644 --- a/src/rovr/core/preview_container.py +++ b/src/rovr/core/preview_container.py @@ -10,8 +10,6 @@ from typing import cast import textual_image.widget -from textual_video import VideoPlayer -from textual_video.enums import IconType, ImageType from PIL import Image, ImageDraw, ImageFont, UnidentifiedImageError from PIL.Image import Image as PILImage from resvg_py import svg_to_bytes @@ -29,6 +27,8 @@ from textual.widget import Widget from textual.widgets import Static from textual.widgets.selection_list import Selection +from textual_video import VideoPlayer +from textual_video.enums import IconType, ImageType from rovr.classes.archive import Archive, BadArchiveError from rovr.classes.textual_options import ( @@ -362,12 +362,12 @@ def show_video_preview(self, depth: int = 0) -> None: return self.app.call_from_thread(self.mount, VideoPlayer( self._current_file_path, - image_type=ImageType(config['interface']['video_viewer']['protocol']), + image_type=ImageType(config["interface"]["video_viewer"]["protocol"]), # render_delay=0.03, # temporarily fixes assertions with sixel, will be fixed in future - fps_decrease_factor=config['interface']['video_viewer']['fps_decrease_factor'], - pause_icon_type=IconType(config['interface']['video_viewer']['pause_icon_type']), - show_controls=config['interface']['video_viewer']['show_controls'], - show_track=config['interface']['video_viewer']['show_track'] + fps_decrease_factor=config["interface"]["video_viewer"]["fps_decrease_factor"], + pause_icon_type=IconType(config["interface"]["video_viewer"]["pause_icon_type"]), + show_controls=config["interface"]["video_viewer"]["show_controls"], + show_track=config["interface"]["video_viewer"]["show_track"] )) if should_cancel(): From 402155a931af2d649f16a18a345a135752e0b6f0 Mon Sep 17 00:00:00 2001 From: firedotguy Date: Sat, 28 Feb 2026 15:02:56 +0300 Subject: [PATCH 6/7] fix: decrease FPS 3 times by default --- src/rovr/classes/config.py | 2 +- src/rovr/config/config.toml | 2 +- src/rovr/config/schema.json | 2 +- src/rovr/core/preview_container.py | 1 - 4 files changed, 3 insertions(+), 4 deletions(-) diff --git a/src/rovr/classes/config.py b/src/rovr/classes/config.py index 54dbca05..316e5167 100644 --- a/src/rovr/classes/config.py +++ b/src/rovr/classes/config.py @@ -730,7 +730,7 @@ class _RovrConfigInterfaceVideoViewer(TypedDict, total=False): r""" FPS decrease factor - default: 1 + default: 3 """ pause_icon_type: "_RovrConfigInterfaceVideoViewerPauseIconType" diff --git a/src/rovr/config/config.toml b/src/rovr/config/config.toml index fb2f180c..8b743884 100644 --- a/src/rovr/config/config.toml +++ b/src/rovr/config/config.toml @@ -24,7 +24,7 @@ max_size = [4000, 4000] [interface.video_viewer] protocol = "Halfcell" -fps_decrease_factor = 5 +fps_decrease_factor = 3 pause_icon_type = 'unicode' show_controls = true show_track = true diff --git a/src/rovr/config/schema.json b/src/rovr/config/schema.json index ced81bbe..1a99526f 100644 --- a/src/rovr/config/schema.json +++ b/src/rovr/config/schema.json @@ -106,7 +106,7 @@ }, "fps_decrease_factor": { "type": "integer", - "default": 1, + "default": 3, "description": "FPS decrease factor" }, "pause_icon_type": { diff --git a/src/rovr/core/preview_container.py b/src/rovr/core/preview_container.py index 49ead2ee..fd1474f8 100644 --- a/src/rovr/core/preview_container.py +++ b/src/rovr/core/preview_container.py @@ -363,7 +363,6 @@ def show_video_preview(self, depth: int = 0) -> None: self.app.call_from_thread(self.mount, VideoPlayer( self._current_file_path, image_type=ImageType(config["interface"]["video_viewer"]["protocol"]), - # render_delay=0.03, # temporarily fixes assertions with sixel, will be fixed in future fps_decrease_factor=config["interface"]["video_viewer"]["fps_decrease_factor"], pause_icon_type=IconType(config["interface"]["video_viewer"]["pause_icon_type"]), show_controls=config["interface"]["video_viewer"]["show_controls"], From 61ff8b4aa0df80927739160ede24b549aa8a1e5f Mon Sep 17 00:00:00 2001 From: firedotguy Date: Sat, 28 Feb 2026 15:11:05 +0300 Subject: [PATCH 7/7] fix coderabbit --- src/rovr/classes/config.py | 2 ++ src/rovr/config/schema.json | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/rovr/classes/config.py b/src/rovr/classes/config.py index 316e5167..badcf41b 100644 --- a/src/rovr/classes/config.py +++ b/src/rovr/classes/config.py @@ -92,6 +92,7 @@ class RovrConfig(TypedDict, total=False): "application/ms-opentype": "font", "application/font-.*": "font", "application/x-font-.*": "font", + "video/mp4": "video" } r""" Default value of the field path 'Rovr Config interface mime_rules' """ @@ -640,6 +641,7 @@ class _RovrConfigInterface(TypedDict, total=False): image/svg\+xml: resvg inode/directory: folder text/.*: text + video/mp4: video """ diff --git a/src/rovr/config/schema.json b/src/rovr/config/schema.json index 1a99526f..ecf186e4 100644 --- a/src/rovr/config/schema.json +++ b/src/rovr/config/schema.json @@ -107,6 +107,7 @@ "fps_decrease_factor": { "type": "integer", "default": 3, + "minimum": 1, "description": "FPS decrease factor" }, "pause_icon_type": { @@ -122,7 +123,7 @@ }, "show_controls": { "type": "boolean", - "default": "true", + "default": true, "description": "Whether to show player controls (pause button and time)" } }