Commit graph

13142 commits

Author SHA1 Message Date
Šarūnas Nejus
9aee0b1d79
Add Usage block to RequestHandler 2025-10-20 21:54:35 +01:00
Šarūnas Nejus
71b20ae6f6
Refactor HTTP request handling with RequestHandler base class
Introduce a new RequestHandler base class to introduce a shared session,
centralize HTTP request management and error handling across plugins.

Key changes:
- Add RequestHandler base class with a shared/cached session
- Convert TimeoutSession to use SingletonMeta for proper resource
  management
- Create LyricsRequestHandler subclass with lyrics-specific error
  handling
- Update MusicBrainzAPI to inherit from RequestHandler
2025-10-20 21:54:26 +01:00
Šarūnas Nejus
69dc06dff7
Make musicbrainzngs dependency optional and requests required 2025-10-20 08:13:35 +01:00
Šarūnas Nejus
d8f201e79c
musicbrainz: remove error handling 2025-10-20 08:13:35 +01:00
Šarūnas Nejus
87a074ee99
musicbrainz: access the custom server directly, if configured 2025-10-20 08:13:35 +01:00
Šarūnas Nejus
82a77f0f9c
musicbrainz: browse directly 2025-10-20 08:13:35 +01:00
Šarūnas Nejus
51810bfb45
musicbrainz: search directly 2025-10-20 08:13:35 +01:00
Šarūnas Nejus
2ef1722976
musicbrainz: lookup recordings directly 2025-10-20 08:13:35 +01:00
Šarūnas Nejus
15d72edb7a
musicbrainz: lookup release directly 2025-10-20 08:13:35 +01:00
Šarūnas Nejus
1912cad42f
Move pseudo release lookup under the plugin 2025-10-20 08:13:35 +01:00
Šarūnas Nejus
ee4e6e5ac3
Add missing blame ignore revs from musicbrainz plugin 2025-10-20 08:13:35 +01:00
Šarūnas Nejus
1e18b4d75c
Define MusicBrainzAPI class with rate limiting 2025-10-20 08:13:35 +01:00
Šarūnas Nejus
af7dbb87c7
Move TimeoutSession under beetsplug._utils 2025-10-20 08:13:34 +01:00
Šarūnas Nejus
b850516a88
Fix transaction context manager signature (#6112)
Pyrefly reported the contect manager signature of Transaction as
invalid, so I corrected it.
2025-10-20 00:20:01 +01:00
Konstantin
72d879cf82
Merge branch 'master' into fix-invalid-contextmanager 2025-10-19 19:05:35 +02:00
Šarūnas Nejus
59874c5734
Use Generic instead of Any for cached_class_property (#6110)
In a plugin, self.data_source currently returns Any instead of str. This
change allows `cached_classproperty` to retain the type returned by the
decorated method.
2025-10-19 14:34:59 +01:00
Konstantin
12f2a1f694 fix mypy error 2025-10-19 15:12:27 +02:00
Konstantin
d713806263 fix transaction context manager signature 2025-10-19 15:07:17 +02:00
Konstantin
b924dfcd8c
Merge branch 'master' into generic-cached-classproperty 2025-10-19 10:09:21 +02:00
Konstantin
8a24518c4c use Generic instead of Any for cached_classproperty 2025-10-19 10:06:16 +02:00
J0J0 Todos
39aadf7099
Remove duplicate changelog entry (play plugin) 2025-10-19 08:50:25 +02:00
cvx35isl
1275ccf8c1
play plugin: $playlist marker for precise control where the playlist … (#4728)
…file is placed in the command

## Description

see included doc; placing the playlist filename at the end of command
just isn't working for all players

I have this in use with `mpv`

Co-authored-by: cvx35isl <cvx35isl@users.noreply.github.com>
Co-authored-by: J0J0 Todos <2733783+JOJ0@users.noreply.github.com>
2025-10-19 08:38:20 +02:00
Šarūnas Nejus
909b9aade4
fix(github/workflows): update to checkout v5, and setup-python v6. (#6086)
* Update github/actions used by ci and lint and others to the latest
versions.
2025-10-19 02:00:05 +01:00
Martin Atukunda
3ccc91d4d4 Drop 3.13 from python-version for now. 2025-10-19 01:53:17 +01:00
Martin Atukunda
e61ecb4496 fix(github/workflows): update to checkout v5, and setup-python v6.
* also run ci against python 3.13, which is default in debian trixie.
2025-10-19 01:53:17 +01:00
Šarūnas Nejus
7742631207
Add a consistent way to document configuration (#6088)
This PR introduces a custom Sphinx extension for documenting
configuration values and updates autotagger plugins documentation to use
consistent cross-reference formatting.

The main reason I introduced it is that I found the default `confval`
directive too verbose for our use case.

**Key Changes:**

### New Sphinx Extension (`docs/extensions/conf.py`)

- Added custom `conf` domain and directive for documenting configuration
values
- Provides `.. conf::` directive for defining config options with
default value support
- Adds `:conf:` role for creating cross-references to configuration
values
- Enables standardized documentation format:
  ```
  :conf:`plugins.plugin_name:option_name`
  ```

### Documentation Updates

- Converted inline configuration references to use `:conf:` role
throughout:
- `docs/changelog.rst`: Updated references to config options across
multiple plugin sections
  - Updated configuration documentation format:
    - `docs/plugins/discogs.rst`
    - `docs/plugins/musicbrainz.rst`
    - `docs/plugins/spotify.rst`
    - `docs/plugins/deezer.rst`
- Created `docs/plugins/shared_metadata_source_config.rst` for common
metadata source plugin options (`data_source_mismatch_penalty`,
`search_limit`, `source_weight`)

**Benefits:**

- Consistent, cross-referenceable configuration documentation
- Improved navigation between related config options
- Better maintainability through shared documentation snippets
- Enhanced release notes formatting for config references


https://github.com/user-attachments/assets/f7ee29b6-577a-468d-be58-b0aa648f28d0
2025-10-19 01:51:32 +01:00
Šarūnas Nejus
d83402fc65
Add a changelog note 2025-10-19 01:46:32 +01:00
Šarūnas Nejus
9519d47d57
Convert Python 2 URLs to Python 3 2025-10-19 01:37:42 +01:00
Šarūnas Nejus
861504d5f6
Make sure conf references are converted properly in release notes 2025-10-19 01:37:41 +01:00
Šarūnas Nejus
e872351170
Add references to configuration values in the changelog 2025-10-19 01:34:33 +01:00
Šarūnas Nejus
498b14ee1d
Convert autotagger plugin docs to use conf role 2025-10-19 01:34:33 +01:00
Šarūnas Nejus
a938449b29
Add Sphinx extension for configuration value documentation
Create a custom Sphinx extension to document configuration values with
a simplified syntax. It is based on the `confval` but takes less space
when rendered. The extension provides:

- A `conf` directive for documenting individual configuration values
  with optional type and default parameters
- A `conf` role for cross-referencing configuration values
- Automatic formatting of default values in the signature
- A custom domain that handles indexing and cross-references

For example, if we have

.. conf:: search_limit
    :default: 5

We refer to this configuration option with :conf:`plugins.discogs:search_limit`.

The extension is loaded by adding the docs/extensions directory to the
Python path and registering it in the Sphinx extensions list.
2025-10-19 01:34:32 +01:00
Šarūnas Nejus
becb073aac
lastgenre: Refactor genre applying and pretend mode (#6021)
- Refactor and reduce the code required to log and apply the genre.
- Make the output a bit more user-friendly:
    - Use str(obj) to log the object using the user configured format_item / format_album values
    - Use ui.show_model_changes to show the change in genre with colors
2025-10-15 22:50:46 +01:00
Šarūnas Nejus
88011a7c65
Show genre change using show_model_changes 2025-10-15 11:14:26 +01:00
Šarūnas Nejus
0aac7315c3
lastgenre: refactor genre processing with singledispatch
Replace the log_and_pretend decorator with a more robust implementation
using singledispatchmethod. This simplifies the genre application logic
by consolidating logging and processing into dedicated methods.

Key changes:
- Remove log_and_pretend decorator in favor of explicit dispatch
- Add _fetch_and_log_genre method to centralize genre fetching and logging
- Log user-configured full object representation instead of specific
attributes
- Introduce _process singledispatchmethod with type-specific handlers
- Use LibModel type hint for broader compatibility
- Simplify command handler by removing duplicate album/item logic
- Replace manual genre application with try_sync for consistency
2025-10-15 09:55:52 +01:00
Šarūnas Nejus
ee289844ed
Add _process_album and _process_item methods 2025-10-15 09:55:52 +01:00
Šarūnas Nejus
c2d5c1f17c
Update test 2025-10-15 09:55:51 +01:00
J0J0 Todos
65f5dd579b
Add pytest-mock to poetry test dependencies group 2025-10-15 09:55:33 +01:00
J0J0 Todos
654c14490e
lastgenre: Refactor test_pretend to pytest 2025-10-15 09:54:41 +01:00
J0J0 Todos
d617e67199
lastgenre: Fix test_pretend_option
only one arg is passed to the info log anymore.
2025-10-15 09:52:32 +01:00
J0J0 Todos
1acec39525
lastgenre: Use apply methods during import 2025-10-15 09:52:32 +01:00
J0J0 Todos
8613b3573c
lastgenre: Refactor final genre apply
- Move item and genre apply to separate helper functions. Have one
  function for each to not overcomplicate implementation!
- Use a decorator log_and_pretend that logs and does the right thing
  depending on wheter --pretend was passed or not.
- Sets --force (internally) automatically if --pretend is given (this is
  a behavirol change needing discussion)
2025-10-15 09:52:32 +01:00
henry
0bf248d355
Add custom feat words for ftintitle (#6090)
## Description

For non English tracks (Swedish in my case) feat. words might be
something that ftintitle doesn't pick up.
Eg. for the song `Promoe med Afasi - Inflation`
[https://musicbrainz.org/recording/8e236347-61d6-4e11-9980-52f4cc6b905f](https://musicbrainz.org/recording/8e236347-61d6-4e11-9980-52f4cc6b905f)
the word `med` is `feat.` in Swedish.
With this PR you can add what ever word you wish to match as feat. so it
should cover any kind of language.

The config.yaml could look like this:
ftintitle:
  custom_feat_words: ["med"]

## 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.)
- [x] Tests. (Very much encouraged but not strictly required.)
2025-10-14 20:38:02 -07:00
snejus
c1877b7cf5 Increment version to 2.5.1 2025-10-14 22:51:15 +00:00
Šarūnas Nejus
61cbc39c4a
Revert "Add git commit suffix to __version__ for development installs (#5967)" 2025-10-14 23:39:27 +01:00
Šarūnas Nejus
efe1a67e84
Revert "Fix dynamic versioning plugin not correctly installed in workflow (#6094)"
This reverts commit dc9b498ee8, reversing
changes made to 77842b72d7.
2025-10-14 23:38:01 +01:00
Sebastian Mohr
af022683fe
Legacy plugin copy not copying properties. (#6101)
The recently introduces `data_source_mismatch_penalty` property in the MetadataPlugin
class was not copied in the backwards compatibility layer. This PR
introduces a fixes this such that `cached_properties` are copied to
legacy metadata plugins.

This also includes a test for the expected behavior.

See also [beetcamp
issue](https://github.com/snejus/beetcamp/issues/85#issuecomment-3399273892).
2025-10-14 20:41:31 +02:00
Sebastian Mohr
391ca4ca26 Yet some more simplification. 2025-10-14 20:25:07 +02:00
Sebastian Mohr
365ff6b030 Added test additions 2025-10-14 19:55:50 +02:00
Sebastian Mohr
f339d8a4d3 slight simplification. 2025-10-14 19:55:50 +02:00