Releases: linuxserver/docker-beets
nightly-b6d24ecc-ls108
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-b6d24ecc-ls108/index.html
LinuxServer Changes:
Rebase to Alpine 3.21, unpin beetcamp.
Remote Changes:
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.
nightly-810af1f8-ls109
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-810af1f8-ls109/index.html
LinuxServer Changes:
Rebase to Alpine 3.21, unpin beetcamp.
Remote Changes:
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
nightly-25ccb9fd-ls109
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-25ccb9fd-ls109/index.html
LinuxServer Changes:
Rebase to Alpine 3.21, unpin beetcamp.
Remote Changes:
Fix lyrics tests (#5618)
Adjust lyrics integration tests to make sure that expected lyrics from
musica
match what's actually returned.
2.2.0-ls257
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/2.2.0-ls257/index.html
LinuxServer Changes:
Rebase to Alpine 3.21.
Remote Changes:
Updating PIP version of beets to 2.2.0
nightly-731519b0-ls107
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-731519b0-ls107/index.html
LinuxServer Changes:
Rebase to Alpine 3.21, unpin beetcamp.
Remote Changes:
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
.
2.2.0-ls256
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/2.2.0-ls256/index.html
LinuxServer Changes:
Rebase to Alpine 3.21.
Remote Changes:
Updating PIP version of beets to 2.2.0
nightly-a1c0ebde-ls106
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-a1c0ebde-ls106/index.html
LinuxServer Changes:
Rebase to Alpine 3.21, unpin beetcamp.
Remote Changes:
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 configureddist_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.
- 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 configureddist_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 fromletras.mus.br
andmusica.com
. - Modified patterns to scrape missing lyrics text on
paroles.net
and
lacoccinelle.net
. See the diff intest/plugins/lyrics_page.py
.
nightly-731519b0-ls106
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-731519b0-ls106/index.html
LinuxServer Changes:
Rebase to Alpine 3.21, unpin beetcamp.
Remote Changes:
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
.
2.2.0-ls255
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/2.2.0-ls255/index.html
LinuxServer Changes:
Rebase to Alpine 3.21.
Remote Changes:
Updating PIP version of beets to 2.2.0
nightly-a1c0ebde-ls105
CI Report:
https://ci-tests.linuxserver.io/linuxserver/beets/nightly-a1c0ebde-ls105/index.html
LinuxServer Changes:
Rebase to Alpine 3.21, unpin beetcamp.
Remote Changes:
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 configureddist_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.
- 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 configureddist_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 fromletras.mus.br
andmusica.com
. - Modified patterns to scrape missing lyrics text on
paroles.net
and
lacoccinelle.net
. See the diff intest/plugins/lyrics_page.py
.