Commit graph

13088 commits

Author SHA1 Message Date
Sebastian Mohr
0447df6510 Session args to kwargs in manipulate files 2025-02-15 13:27:45 +01:00
Sebastian Mohr
9acb2b4ca3 Added typehints to ImportTask init and reverted some initial changes. 2025-02-15 13:21:47 +01:00
Sebastian Mohr
0ee17c0b06 Removed unnecessary comments & raise same not implemented error for all
not implemented methods
2025-02-15 13:18:21 +01:00
Sebastian Mohr
d29ef500b9 Session path can't be None anymore. Empty list if none 2025-02-15 13:17:20 +01:00
Sebastian Mohr
803a0d1fcb
Apply suggestions from code review
Co-authored-by: Šarūnas Nejus <snejus@protonmail.com>
2025-02-15 13:17:00 +01:00
J0J0 Todos
459ca6498a Refactor musicbrainzngs fetch-includes sanity checks
in autotag.mb module.
2025-02-12 07:16:01 +01:00
Sebastian Mohr
ebe88885c5 Renamed to ignore_bytes and reverted typevar rename 2025-02-10 11:46:50 +01:00
Sebastian Mohr
10e52c68c9
Merge branch 'master' into importer-typehints-and-refactor 2025-02-10 11:43:05 +01:00
Sebastian Mohr
c17a774dd6 Removed Optional and Union and resolved a minor mypy shadowing issue. 2025-02-09 20:23:19 +01:00
Sebastian Mohr
fdf7afbfe3 Formatting 2025-02-09 11:23:22 +01:00
Sebastian Mohr
716720d2a5 Removed unnecessary cast even tho it now produces issues locally. 2025-02-09 11:23:01 +01:00
Sebastian Mohr
bbd92d97ab Removed optional type hints for pipe based optional with None 2025-02-09 11:05:09 +01:00
Šarūnas Nejus
810af1f87b
Close file descriptor generated from tempfile.mkstemp() (#5617)
Without explicitly closing this file descriptor, the temp file would be
kept open until the program exited and could not be deleted by the
fetchart plugin.

Fixes #5521
2025-02-09 00:58:44 +00:00
Sebastian Mohr
1a24e3f1d0 Formatting 2025-02-08 22:20:40 +01:00
Sebastian Mohr
44074d7464 Readded copyright and union. 2025-02-08 22:19:37 +01:00
Sebastian Mohr
bbe4fb454b Renamed ignore to _ignore to prevent mypy error 2025-02-08 22:12:55 +01:00
Sebastian Mohr
10c0aa3f6a Replaced pathlike with pathbytes and remove unnecessary type ignores 2025-02-08 22:03:03 +01:00
seth-milojevic
3dfb95eb69
Merge branch 'master' into patch-1 2025-02-08 12:41:59 -05:00
seth-milojevic
6205e19b74
Update docs/changelog.rst
Co-authored-by: Šarūnas Nejus <snejus@protonmail.com>
2025-02-08 12:41:37 -05:00
Sebastian Mohr
b46dbb93f7
Merge branch 'master' into importer-typehints-and-refactor 2025-02-08 17:43:31 +01:00
Šarūnas Nejus
25ccb9fdcd
Fix lyrics tests (#5618)
Adjust lyrics integration tests to make sure that expected lyrics from
`musica` match what's actually returned.
2025-02-08 16:00:37 +00:00
Šarūnas Nejus
5685cf43cf
Align musica lyrics source expected lyrics with whats returned 2025-02-08 09:09:24 +00:00
Šarūnas Nejus
b6d24ecc1f
Fix matcher typo (#5589)
Fixes a confusing typo when setting the MusicBrainz matcher in a few
tests. It looks like the matcher defaults to `IDENT` so change it to
that, since that would have been the value used in the tests with the
typo.
2025-02-08 09:00:13 +00:00
seth-milojevic
12fa3432a9 Close file descriptor generated from tempfile.mkstemp()
Without explicitly closing this file descriptor, the temp file would be kept open until the program exited and could not be deleted by the fetchart plugin.
2025-02-08 01:03:20 -05:00
Sebastian Mohr
12b21c48e9 Changelog addition 2025-02-07 16:55:26 +01:00
Sebastian Mohr
34101c2d13
Merge branch 'master' into importer-typehints-and-refactor 2025-02-07 16:22:34 +01:00
Sebastian Mohr
23f4f8261c Added some more typehints 2025-02-04 16:38:24 +01:00
valrus
99d2da66dc use actual value of matcher, not typo'd one 2025-02-03 19:32:27 -08:00
valrus
d298738612 add missing space in comment 2025-02-03 19:32:27 -08:00
valrus
f520790713 s/macthin/matching/ 2025-02-03 19:32:27 -08:00
Sebastian Mohr
ed92f9b997 Do not skip tests in ci.
The return type of the stage decorator should in theory be `T|None`
but the return of task types is not consistent in its usage. Would need
some bigger changes for which I'm not ready at the moment.
2025-02-03 11:37:33 +01:00
Šarūnas Nejus
731519b0a3
Use up-to-date namespace package setup for plugins (#5505)
Refactor `beetsplug` to use native namespace packages by removing
`__init__.py`. Update documentation and `setup.cfg` to support namespace
packages.

### Motivation

Adopt PEP 420 native namespace packages to simplify plugin management
and eliminate the need for `__init__.py`.

See https://realpython.com/python-namespace-package.

This setup is backwards-compatible, so plugins using the old
pkgutil-based setup will continue working fine.

The advantage with this setup is that external plugins will now be able
to import modules from 'beetsplug' package for typing purposes.
Previously, mypy could not resolve these modules due to presence of
`__init__.py`.
2025-02-02 16:32:53 +00:00
Sebastian Mohr
04aa1b8ddb Added last missing typehints in importer and fixed some typehint issues
in util. Also run poe format
2025-02-01 15:52:11 +01:00
Sebastian Mohr
09b15aaf52 Added type hints for pipeline stage decorators 2025-02-01 15:08:41 +01:00
Sebastian Mohr
c83f2e4e71 Recreating importstate class to imitate previous code, otherwise
we have slightly different behavior.
2025-02-01 13:45:18 +01:00
Sebastian Mohr
6f2ee5c614 Removed abc as the importer class is used directly sometimes... 2025-02-01 13:37:24 +01:00
Sebastian Mohr
a7ea60356b Init taghistory before loading 2025-02-01 13:26:23 +01:00
Sebastian Mohr
c81a2c9b18 Using 3.9 unions instead of new 3.10 style unions for typehints 2025-02-01 13:25:25 +01:00
Sebastian Mohr
435864cb50 Removed import state functions in favor of an import state dataclass.
Makes this more readable in my opinion, we also now have typehints for
the import state.
2025-02-01 13:16:04 +01:00
Max Goltzsche
5d96509cfe
smartplaylist: change encoding of additional field
URL-encode additional item `fields` within generated EXTM3U playlists instead of JSON-encoding them.
This is because JSON-encoding additional fields/attributes made it difficult to parse the `EXTINF` line but using URL-encoding for these values makes parsing easy (because URL-encoded values cannot contain commas, quotation marks and spaces).

I introduced the generation of additional EXTM3U item fields earlier this year and I want to correct that now.

**Design/definition background:**
Unfortunately, I didn't find a clear definition of how additional playlist item attributes should be encoded - apparently there is none.
Given that item URIs within an M3U playlist can be URL-encoded already, defining the values of additional attributes to be URL-encoded is consistent design.
I didn't find examples of additional EXTM3U item attributes in the web where the attribute value contains a comma, space or quotation mark but examples that specified numeric IDs and URLs as attribute values.
Because the URL attribute examples I found didn't contain URL-encoded characters and because it is more readable and unproblematic for parsing, I've let the attribute URL encoding treat `:` and `/` as safe characters.

**Breaking change:**
While this is a breaking change in theory, in practice it is not since afaik all integrations of the smartplaylist plugin's additional EXTM3U item attribute generation feature (beets-webm3u) work with simple attribute values such as the item ID (numeric) whose formatting/encoding is not affected when changing from JSON to URL-encoding.
In other words the change is backward-compatible with the beets-webm3u plugin (which I'll adjust correspondingly after this beets PR was merged).
2025-02-01 01:14:27 +01:00
J0J0 Todos
f4d41482e8 Fix musicbrainz genres fetching
- genres are now called tags
- tags needs to be in "mb fetch includes"
- release-group has them
- release has them
- and recording as well but we don't use them
- not sure what this outdated check was doing
- see musicbrainz.VALID_INCLUDES for reference
2025-01-31 23:27:17 +01:00
Šarūnas Nejus
89f1ef4d2f
Add documentation links 2025-01-30 12:20:11 +00:00
Šarūnas Nejus
916d40f86f
Remove outdated namespace package definition and update docs
See https://realpython.com/python-namespace-package.

This setup is backwards-compatible, so plugins using the old
pkgutil-based setup will continue working fine.

This setup has an advantage where external plugins will now be able to
import modules from 'beetsplug' package for typing purposes. Previously,
mypy could not resolve these modules due to presence of `__init__.py`.
2025-01-30 12:20:11 +00:00
Šarūnas Nejus
a1c0ebdeef
Lyrics: Refactor Genius, Google backends, and consolidate common functionality (#5474)
### Bug Fixes
- Fixed #4791: Resolved an issue with the Genius backend where it
couldn't match lyrics if there was a slight variation in the artist's
name.

### Plugin Enhancements
* **Session Management**: Introduced a `TimeoutSession` to enable
connection pooling and maintain consistent configuration across
requests.
* **Error Handling**: Centralized error handling logic in a new
`RequestsHandler` class, which includes methods for retrieving either
HTML text or JSON data.
* **Logging**: Added methods to ensure the backend name is included in
log messages.

### Configuration Changes
* Added a new `dist_thresh` field to the configuration, allowing users
to control the maximum tolerable mismatch between the artist and title
of the lyrics search result and their item. Interestingly, this field
was previously available (though undocumented) and used in the
`Tekstowo` backend. Now, this threshold has also been applied to
**Genius** and **Google** search logic.

### Backend Updates
* All backends that perform searches now validate each result against
the configured `dist_thresh`.

#### Genius
* Removed the need to scrape HTML tags for lyrics; instead, lyrics are
now parsed from the JSON data embedded in the HTML. This change should
reduce our vulnerability to Genius' frequent alterations in their HTML
structure.
* Documented the structure of their search JSON data.

#### Google
* Typed the response data returned by the Google Custom Search API.
* Excluded certain pages under **https://letras.mus.br** that do not
contain lyrics.
* Excluded all results from MusiXmatch, as we cannot access their pages.
* Improved parsing of URL titles (used for matching item/lyrics
artist/title):
- Handled results from long search queries where URL titles are
truncated with an ellipsis.
  - Enhanced URL title cleanup logic.
- Added functionality to determine (or rather, guess) not only the track
title but also the artist from the URL title.
* Similar to #5406, search results are now compared to the original item
and sorted by distance. Results exceeding the configured `dist_thresh`
value are discarded. The previous functionality simply selected the
first result containing the track's title in its URL, which often led to
returning lyrics for the wrong artist, particularly for short track
titles.
* Since we now fetch lyrics confidently, redundant checks for valid
lyrics and credits cleanup have been removed.

### HTML Cleanup
* Organized regex patterns into a new `Html` class.
* Adjusted patterns to ensure new lines between blocks of lyrics text
scraped from `letras.mus.br` and `musica.com`.
* Modified patterns to scrape missing lyrics text on `paroles.net` and
`lacoccinelle.net`. See the diff in `test/plugins/lyrics_page.py`.
2025-01-27 11:10:14 +00:00
Šarūnas Nejus
dab9a0d7c4
Bring back Tekstowo search
It was my mistake to remove search earlier - I found that in many cases
it works fine.
2025-01-27 10:56:54 +00:00
Šarūnas Nejus
7389f241f4
Do not search for Various Artists, split titles by ' / ' 2025-01-27 10:56:53 +00:00
Šarūnas Nejus
39c479fcab
Google: add support for dainuzodziai.lt 2025-01-27 10:56:53 +00:00
Šarūnas Nejus
858c13558c
Xfail Songlyrics source 2025-01-27 10:56:53 +00:00
Šarūnas Nejus
734bcc28a8
Append source to the lyrics 2025-01-27 10:56:53 +00:00
Šarūnas Nejus
bdc564a573
Tidy up handling of backends 2025-01-27 10:56:53 +00:00