Commit Graph

14401 Commits

Author SHA1 Message Date
Konstantin
2e0475b008 make get_search_response return the number of results
this allows subclassses to return an iterator for results and use
internal logic to determine the number of results without prematurely
exhausting it that case
2026-05-17 18:15:07 +02:00
Konstantin
b62a333f19 metadata_plugins: add methods that receive results and return AlbumInfo
overriding them allows subclasses to customize the behavior
2026-05-17 18:15:07 +02:00
Konstantin
5593dbe4b8 metadata_plugins: import TypedDict from typing_extensions
this allows subclasses of IDResponse to use closed=True
2026-05-17 18:15:07 +02:00
Šarūnas Nejus
fc9c02a4b0 Fix command desc formatting in help (#6646)
No impact on core logic, only on CLI help output formatting.

This PR fixes the formatting of command descriptions in the CLI help
output.

- Command descriptions had historically been printed inline, however
9352a79 introduced a bug which moved them to the next line, making the
help output very verbose.
- Now, descriptions again appear inline with the command name (e.g.,
`config show or edit the user configuration`), improving readability and
consistency.
- A regression test (`test_help`) is included to verify the new output
format and prevent future breakage.

High-level impact: CLI help output is more user-friendly, with no effect
on core logic or APIs.

### Before
<img width="477" height="448" alt="image"
src="https://github.com/user-attachments/assets/3c97299a-7f5e-4605-848f-bef15a1b49b9"
/>

### After
<img width="511" height="229" alt="image"
src="https://github.com/user-attachments/assets/f10a72d1-48fd-49e8-9bc6-3228963f62fd"
/>
2026-05-17 16:27:00 +01:00
Šarūnas Nejus
9e3f22b8be Do not move command desc to the next line 2026-05-17 07:38:50 +01:00
Šarūnas Nejus
6a2c451cc3 Reproduce the issue in a test 2026-05-17 07:35:56 +01:00
Šarūnas Nejus
aa33b1cbe9 fix: duplicate album merge broken in threaded import mode (#6623)
Fixes #6601 

Added `import contextvars` and changed `_extend_pipeline` to capture the
current context and run the inner pipeline within it to ensure the
`music_dir` context variable is available when the inner pipeline
resolves paths, preventing the relative-path bug that caused could not
get filesize errors and removing 0 old duplicated items during merge.

Works perfectly after the fix:

```bash
arsaboo@arsmusic:~$ beet import -m -I -t ~/shared/music/ --set genre="Filmi" --search-id 7MwKD3kEFMov4LQqyhnmzL

/home/arsaboo/shared/music (1 items)

  Match (75.2%):
  King - Lukkhe
  ≠ artist, tracks
  Spotify, None, 2026, None, Warner Music India, None, None
  https://open.spotify.com/album/7MwKD3kEFMov4LQqyhnmzL
  ≠ Artist: King; OAFF; Savera; Sunny M.R. -> King
  * Album: Lukkhe
     ≠ (#2) Khamoshiyaan (3:03) -> (#2) Khamoshiyaan (feat. Romy & Manreet Khara) (3:03)
Missing tracks (13/14 - 92.9%):
 ! Bulletproof (#1) (3:09)
 ! Jee Lenge (#3) (3:25)
 ! Headshot (#4) (3:10)
 ! Ruh Teri (feat. Manreet Khara & Agrim Joshi) (#5) (2:31)
 ! Roobaroo (#6) (3:17)
 ! Savere (#7) (2:29)
 ! Haal (#8) (3:29)
 ! Haal (The Journey) (#9) (6:13)
 ! Nachdi Shaam (#10) (2:22)
 ! Hoga Bada Mera Naam (#11) (1:58)
 ! All Eyes On Us (#12) (3:13)
 ! Swan Song (Hoya Azaad) (#13) (3:17)
 ! Bhaari Pangey (#14) (2:19)
➜ [A]pply, More candidates, Skip, Use as-is, as Tracks, Group albums,
Enter search, enter Id, aBort, eDit, edit Candidates, Print tracks,
Open files with Picard? a
This album is already in the library!
Old: 3 items, MP3, 320kbps, 9:45, 22.9 MiB
New: 1 items, MP3, 320kbps, 3:03, 7.8 MiB
➜ [S]kip new, Keep all, Remove old, Merge all? m

/home/arsaboo/shared/music
/data/music/Hindi Music/L/Lukkhe [30718] (2026)/Lukkhe (2026) - Bulletproof.mp3
/data/music/Hindi Music/L/Lukkhe [30718] (2026)/Lukkhe (2026) - Headshot.mp3
/data/music/Hindi Music/L/Lukkhe [30718] (2026)/Lukkhe (2026) - Jee Lenge.mp3 (4 items)

  Match (82.6%):
  King - Lukkhe
  ≠ artist, tracks
  Spotify, None, 2026, None, Warner Music India, None, None
  https://open.spotify.com/album/7MwKD3kEFMov4LQqyhnmzL
  ≠ Artist: OAFF; Savera; Ruaa Kayy; Romy; Manreet Khara -> King
  * Album: Lukkhe
     * (#1) Bulletproof (3:09)
     ≠ (#2) Khamoshiyaan (3:03) -> (#2) Khamoshiyaan (feat. Romy & Manreet Khara) (3:03)
     * (#3) Jee Lenge (3:25)
     * (#4) Headshot (3:10)
Missing tracks (10/14 - 71.4%):
 ! Ruh Teri (feat. Manreet Khara & Agrim Joshi) (#5) (2:31)
 ! Roobaroo (#6) (3:17)
 ! Savere (#7) (2:29)
 ! Haal (#8) (3:29)
 ! Haal (The Journey) (#9) (6:13)
 ! Nachdi Shaam (#10) (2:22)
 ! Hoga Bada Mera Naam (#11) (1:58)
 ! All Eyes On Us (#12) (3:13)
 ! Swan Song (Hoya Azaad) (#13) (3:17)
 ! Bhaari Pangey (#14) (2:19)
➜ [A]pply, More candidates, Skip, Use as-is, as Tracks, Group albums,
Enter search, enter Id, aBort, eDit, edit Candidates, Print tracks,
Open files with Picard? a
```
2026-05-17 03:35:53 +01:00
Alok Saboo
6b760b798f Merge branch 'master' into import 2026-05-16 19:36:09 -04:00
Šarūnas Nejus
44f7bf80d7 Fix path format queries for multi-valued fields (#6635)
Fixes #6598.

the issue was that path format queries are evaluated against an
in-memory Item using query.match(), where multi-valued fields such as
genres are represented as lists, e.g. ["Classical"]. Before this change,
string/exact matching treated that list as one whole value, so a path
rule like genres:=~Classical: _Classical/... failed to match and fell
back to the default path format, even though beet list
genres:=~Classical worked through the database query path. This change
updates in-memory matching so sequence-like field values are matched
element by element, while excluding strings and byte-like values from
sequence handling. I added regression tests for genres:=~Classical,
genres:=Classical, avoiding a false positive for Neoclassical, and
direct query.match() behavior on multi-valued fields. Manual
verification showed the original version returned match: False and
destination: ...\one\two, while the fixed version returns match: True
and destination: ...\one\three.

## Summary

This fixes path format selection for multi-valued fields such as
`genres`.

Path format queries are evaluated against an in-memory `Item` via
`query.match()`.
For multi-valued fields, the in-memory value is a list, for example:

```python
genres = ["Classical"]
2026-05-16 12:25:43 +01:00
Šarūnas Nejus
5caa04f500 Merge branch 'master' into fix/path-query-multivalue-fields 2026-05-16 12:20:09 +01:00
oxms16
8a8ad7f805 add debug message "`genres:=~Classical. 🐛6598`" 2026-05-16 18:28:02 +08:00
Šarūnas Nejus
d741a464a6 core/structure: move UserError to beets.exceptions (#6643)
Update all references in core, plugins, and tests to import UserError
from the new location. This centralizes exception handling and improves
code organization.
2026-05-16 11:24:19 +01:00
Šarūnas Nejus
30ab81eb5b Extract UserError from beets.ui to a new beets.exceptions module.
Update all references in core, plugins, and tests to import UserError
from the new location. This centralizes exception handling and improves
code organization.
2026-05-16 11:18:51 +01:00
oxms16
b574ff6bc8 change changelog.rst format,because: File 'docs/changelog.rst' could be reformatted. in CI 2026-05-16 16:58:46 +08:00
oxms16
3248f92090 merge docs/changelog.rst 2026-05-16 16:51:24 +08:00
oxms16
b47460b3e6 Fix multi-value path query matching 2026-05-16 16:46:48 +08:00
oxms16
04fdf8b870 根据作者建议修改了一下 2026-05-16 16:20:53 +08:00
Alok Saboo
275d7df5cf Merge branch 'master' into import 2026-05-14 10:30:10 -04:00
Šarūnas Nejus
5df37abc43 Update deps (#6632)
We have a vulnerability in `urllib3` so here's an upgrade to all deps.

<img width="713" height="368" alt="image"
src="https://github.com/user-attachments/assets/2d72c1e6-09a9-4d06-92d8-9a5759f205f8"
/>

Fixes #6633
2026-05-14 15:07:42 +01:00
Šarūnas Nejus
4acbb0f913 Add dependency extra for tidal 2026-05-14 14:54:40 +01:00
Šarūnas Nejus
d4f7f9ffd5 Fix types 2026-05-14 14:54:40 +01:00
Šarūnas Nejus
a050ba6eca Update dependencies 2026-05-14 14:54:40 +01:00
Sebastian Mohr
1182713baa Refactored test_mb_sync to use pytest and removed capture_log (#6617)
This pull request refactors the `test/plugins/test_mbsync.py` test suite
to use `pytest` fixtures and utilities rather than the previous
unittest-based helpers. It also updates the way logs are captured in
tests to use `pytest`'s `caplog` fixture instead of the custom
`capture_log` context manager.

---

This is part of the multi-step efforts to improve logging in beets
https://github.com/beetbox/beets/issues/6553
2026-05-14 15:52:30 +02:00
Sebastian Mohr
cf97ce87b8 Refactored test_mb_sync to use pytest and removed capture_log in favor
of caplog.
2026-05-14 15:47:00 +02:00
oxms16
c9e6d0f84c Fix path queries for multi-valued fields 2026-05-14 12:26:48 +08:00
Alok Saboo
c5373e6964 fix format 2026-05-13 20:58:18 -04:00
Alok Saboo
8b2e3a5563 test: address reviewer comments in threaded duplicate merge test 2026-05-13 20:53:53 -04:00
Alok Saboo
cddaf5d3b5 Merge branch 'master' into import 2026-05-13 20:41:36 -04:00
Šarūnas Nejus
544d45a1e9 fix(mbsync): do not clear metadata if import.from_scratch is set (#6625)
if import.from_scratch was set in the config, runnning mbsync would
clear any metadata not provided by MBz (replay gain, lyrics, genres...).
we now ignore this setting when running mbsync to preserve metadata.

Fixes: #6613
2026-05-13 17:57:02 +01:00
ShimmerGlass
65ccaf1408 fix(mbsync): do not clear metadata if import.from_scratch is set
if import.from_scratch was set in the config, runnning mbsync would
clear any metadata not provided by MBz (replay gain, lyrics, genres...).
we now ignore this setting when running mbsync to preserve metadata.

Fixes: #6613
2026-05-13 18:06:08 +02:00
Šarūnas Nejus
030909640c fix(duplicates): output format (#6622)
* The pugin used an empty format string unless `--count` was provided,
resulting in outputs like `: 1`. It now correctly displays duplicated
items.
* `--count` was ignored (aside from above bug), and item count was
always appended to output.

Fixes: https://github.com/beetbox/beets/issues/6476
2026-05-13 12:59:04 +01:00
ShimmerGlass
ec1c25644d fix(duplicates): output format
* the pugin used an empty format string unless --count was provided,
  resulting in outputs like `: 1`. it now correctly displays duplicated
  items.
* --count was ignored (aside from above bug), and item count was always
  appended to output.
2026-05-11 22:43:53 +02:00
Alok Saboo
7fc6284d95 fix: improve context propagation and add threaded regression test 2026-05-10 11:17:37 -04:00
Alok Saboo
53ee4c9023 Update changelog 2026-05-10 11:14:05 -04:00
Alok Saboo
d20ebdf949 update changelog 2026-05-10 11:12:58 -04:00
Alok Saboo
1b121bcb13 Added import contextvars to capture the current context 2026-05-10 11:12:58 -04:00
J0J0 Todos
7c50f94c60 lastgenre: Test empty last.fm result doesnt wipe (#6608)
Add a test case that proves that issue 5991 is fixed by now.

Closes #5991 .
2026-05-09 09:20:05 +02:00
J0J0 Todos
5f94ca79a3 lastgenre: Test empty last.fm result doesnt wipe
Add a test case that proves that issue 5991 is fixed by now.
2026-05-09 09:11:05 +02:00
Šarūnas Nejus
324877042a fix: mbpseudo issues when applying pseudorelease (#6512)
I have not created an issue for this but I tried to use mbpseudo to
apply this pseudorelease:
https://musicbrainz.org/release/6c100fef-6abf-41c4-bd21-6f9becaaab6c

When doing that I encountered two errors as seen below, this PR should
fix those issues. The second issue was only apparent once the first
issue was fixed.

```
Sending event: import_task_choice
Traceback (most recent call last):
  File "/lsiopy/bin/beet", line 6, in <module>
    sys.exit(main())
             ^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/ui/__init__.py", line 1013, in main
    _raw_main(args)
  File "/lsiopy/lib/python3.12/site-packages/beets/ui/__init__.py", line 992, in _raw_main
    subcommand.func(lib, suboptions, subargs)
  File "/lsiopy/lib/python3.12/site-packages/beets/ui/commands/import_/__init__.py", line 131, in import_func
    import_files(lib, byte_paths, query)
  File "/lsiopy/lib/python3.12/site-packages/beets/ui/commands/import_/__init__.py", line 75, in import_files
    session.run()
  File "/lsiopy/lib/python3.12/site-packages/beets/importer/session.py", line 237, in run
    pl.run_parallel(QUEUE_SIZE)
  File "/lsiopy/lib/python3.12/site-packages/beets/util/pipeline.py", line 471, in run_parallel
    raise exc_info[1].with_traceback(exc_info[2])
  File "/lsiopy/lib/python3.12/site-packages/beets/util/pipeline.py", line 336, in run
    out = self.coro.send(msg)
          ^^^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/util/pipeline.py", line 195, in coro
    task = func(*args, task)
           ^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/importer/stages.py", line 217, in user_query
    _apply_choice(session, task)
  File "/lsiopy/lib/python3.12/site-packages/beets/importer/stages.py", line 323, in _apply_choice
    task.apply_metadata()
  File "/lsiopy/lib/python3.12/site-packages/beets/importer/tasks.py", line 263, in apply_metadata
    self.match.apply_metadata()
  File "/lsiopy/lib/python3.12/site-packages/beets/autotag/hooks.py", line 609, in apply_metadata
    for item, data in self.merged_pairs:
                      ^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/autotag/hooks.py", line 603, in merged_pairs
    (i, ti.merge_with_album(self.info))
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/autotag/hooks.py", line 482, in merge_with_album
    album = album_info.raw_data
            ^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/functools.py", line 998, in __get__
    val = self.func(instance)
          ^^^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/autotag/hooks.py", line 301, in raw_data
    data = {**super().raw_data}
              ^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.12/functools.py", line 998, in __get__
    val = self.func(instance)
          ^^^^^^^^^^^^^^^^^^^
  File "/lsiopy/lib/python3.12/site-packages/beets/autotag/hooks.py", line 176, in raw_data
    data = self.__class__(**self.copy())
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: PseudoAlbumInfo.__init__() missing 2 required positional arguments: 'pseudo_release' and 'official_release'
```

```
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/home/martin/personal/src-ext/beets/beets/__main__.py", line 24, in <module>
    main(sys.argv[1:])
    ~~~~^^^^^^^^^^^^^^
  File "/home/martin/personal/src-ext/beets/beets/ui/__init__.py", line 1013, in main
    _raw_main(args)
    ~~~~~~~~~^^^^^^
  File "/home/martin/personal/src-ext/beets/beets/ui/__init__.py", line 992, in _raw_main
    subcommand.func(lib, suboptions, subargs)
    ~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/martin/personal/src-ext/beets/beets/ui/commands/import_/__init__.py", line 131, in import_func
    import_files(lib, byte_paths, query)
    ~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/martin/personal/src-ext/beets/beets/ui/commands/import_/__init__.py", line 75, in import_files
    session.run()
    ~~~~~~~~~~~^^
  File "/home/martin/personal/src-ext/beets/beets/importer/session.py", line 237, in run
    pl.run_parallel(QUEUE_SIZE)
    ~~~~~~~~~~~~~~~^^^^^^^^^^^^
  File "/home/martin/personal/src-ext/beets/beets/util/pipeline.py", line 471, in run_parallel
    raise exc_info[1].with_traceback(exc_info[2])
  File "/home/martin/personal/src-ext/beets/beets/util/pipeline.py", line 336, in run
    out = self.coro.send(msg)
  File "/home/martin/personal/src-ext/beets/beets/util/pipeline.py", line 195, in coro
    task = func(*args, task)
  File "/home/martin/personal/src-ext/beets/beets/importer/stages.py", line 217, in user_query
    _apply_choice(session, task)
    ~~~~~~~~~~~~~^^^^^^^^^^^^^^^
  File "/home/martin/personal/src-ext/beets/beets/importer/stages.py", line 326, in _apply_choice
    task.add(session.lib)
    ~~~~~~~~^^^^^^^^^^^^^
  File "/home/martin/personal/src-ext/beets/beets/importer/tasks.py", line 503, in add
    self.album = lib.add_album(self.imported_items())
                 ~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/martin/personal/src-ext/beets/beets/library/library.py", line 83, in add_album
    item.add(self)
    ~~~~~~~~^^^^^^
  File "/home/martin/personal/src-ext/beets/beets/library/models.py", line 84, in add
    super().add(lib)
    ~~~~~~~~~~~^^^^^
  File "/home/martin/personal/src-ext/beets/beets/dbcore/db.py", line 717, in add
    self.store()
    ~~~~~~~~~~^^
  File "/home/martin/personal/src-ext/beets/beets/library/models.py", line 74, in store
    super().store(fields)
    ~~~~~~~~~~~~~^^^^^^^^
  File "/home/martin/personal/src-ext/beets/beets/dbcore/db.py", line 659, in store
    tx.mutate(
    ~~~~~~~~~^
        f"INSERT INTO {self._flex_table} "
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    ...<2 lines>...
        (self.id, key, value),
        ^^^^^^^^^^^^^^^^^^^^^^
    )
    ^
  File "/home/martin/personal/src-ext/beets/beets/dbcore/db.py", line 1039, in mutate
    return self.db._connection().execute(statement, subvals).lastrowid
           ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^
sqlite3.ProgrammingError: Error binding parameter 3: type 'dict' is not supported
```
2026-05-08 13:53:32 +01:00
Šarūnas Nejus
cde2dd139e Merge branch 'master' into fix/mbpseudo-raw-data 2026-05-08 13:38:30 +01:00
Sebastian Mohr
e58d404222 Refactored test_hook to use pytest and removed capture_log (#6618)
This pull request refactors the `test/plugins/test_hook.py` test suite
to use `pytest` fixtures and utilities rather than the previous
unittest-based helpers. It also updates the way logs are captured in
tests to use `pytest`'s `caplog` fixture instead of the custom
`capture_log` context manager.

---

This is part of the multi-step efforts to improve logging in beets
https://github.com/beetbox/beets/issues/6553
2026-05-08 13:54:01 +02:00
Sebastian Mohr
2056cce74b test_hook: Removed capture_log in favor for pytest caplog
Also minor refactor to align with pytest
2026-05-08 13:47:37 +02:00
Martin Caspersen
610443ae9e doc: fix formatting 2026-05-08 12:35:59 +02:00
Martin Caspersen
5342d9bc76 Merge remote-tracking branch 'fork/master' into fix/mbpseudo-raw-data 2026-05-08 12:25:49 +02:00
Mathilde Gilles
48b5dbb0e2 feat(import): add --nomove / -M option (#6615)
## Description

Add `--nomove` / `-M` option to override the `move: yes` config option
during import.

This option is especially useful for reimporting when using players /
music servers like Navidrome that easily loose track of files when they
change path and tags at the same time.
Now one can retag their files without moving them `beet import -M
my-files/`, wait for a rescan, and then `beet move`.

original idea by @snejus 

## To Do

<!--
- If you believe one of below checkpoints is not required for the change
you
are submitting, cross it out and check the box nonetheless to let us
know.
  For example: - [x] ~Changelog~
- Regarding the changelog, often it makes sense to add your entry only
once
reviewing is finished. That way you might prevent conflicts from other
PR's in
that file, as well as keep the chance high your description fits with
the
  latest revision of your feature/fix.
- Regarding documentation, bugfixes often don't require additions to the
docs.
- Please remove the descriptive sentences in braces from the enumeration
below,
  which helps to unclutter your PR description.
-->

- [x] Documentation. (If you've added a new command-line flag, for
example, find the appropriate page under `docs/` to describe it.)
- [x] Changelog. (Add an entry to `docs/changelog.rst` to the bottom of
one of the lists near the top of the document.)
- [ ] Tests. (Very much encouraged but not strictly required.)
2026-05-08 08:53:40 +02:00
ShimmerGlass
45e78473b0 feat(import): add --nomove / -M option 2026-05-07 13:50:40 +02:00
Šarūnas Nejus
7dde183d7d convert: Add types and simplify args parsing (#6573)
## Refactor `ConvertPlugin` to use instance attributes instead of
parameter threading

This PR cleans up the `ConvertPlugin` class by eliminating the pattern
of passing config values as explicit parameters through the call chain.

### What changed

- **Removed `_get_opts_and_config`** — a method that returned a 9-tuple
of config values. All callers unpacked and re-passed these values
explicitly.
- **Config values are now `@cached_property` attributes** on
`ConvertPlugin`: `dest`, `fmt`, `force`, `pretend`, `link`, `hardlink`,
`threads`, `playlist`, `path_formats`.
- **CLI option defaults now set from config**, so
`self.config.set(vars(opts))` in `convert_func` is sufficient to merge
CLI overrides — no more `opts.x or config["x"]` branching in
`_get_opts_and_config`.
- **`get_format` → `command` cached property** returning a typed
`FormatCommand` `NamedTuple`, replacing a free function that accessed
the global `config`.
- **`should_transcode` and `encode`** signatures simplified — `fmt`,
`force`, and `pretend` no longer passed as arguments; methods read from
`self`.
- **`_parallel_convert` and `convert_item`** reduced to `(items,
keep_new)` signatures.
- **Free module-level functions** (`get_format`, `in_no_convert`,
`should_transcode`) removed; equivalent logic now lives as methods,
removing the dependency on the global `config` object.
- Types and `TYPE_CHECKING` imports added throughout; `after_convert`
event registered in `plugins.py`.

### Impact

No behaviour change. The refactor reduces argument surface area
significantly, makes the config read path explicit and testable
per-instance, and eliminates a source of subtle bugs where CLI flags
could silently fall back to wrong defaults.
2026-05-06 15:49:48 +01:00
Šarūnas Nejus
86813678d7 Use pipeline.mutator_stage instead of a Generator 2026-05-06 15:30:51 +01:00
Šarūnas Nejus
ec940e8b61 Remove redundant param provision to encode 2026-05-06 15:30:51 +01:00
Šarūnas Nejus
dd33fef52e Remove redundant param provision to should_transcode 2026-05-06 15:30:51 +01:00