mirror of
https://github.com/beetbox/beets.git
synced 2025-12-06 08:39:17 +01:00
* Type the response data that Google Custom Search API return.
* Exclude some 'letras.mus.br' pages that do not contain lyric.
* Exclude results from Musixmatch as we cannot access their pages.
* Improve parsing of the URL title:
- Handle long URL titles that get truncated (end with ellipsis) for
long searches
- Remove domains starting with 'www'
- Parse the title AND the artist. Previously this would only parse the
title, and fetch lyrics even when the artist did not match.
* Remove now redundant credits cleanup and checks for valid lyrics.
115 lines
3.1 KiB
Python
115 lines
3.1 KiB
Python
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from typing_extensions import NotRequired, TypedDict
|
|
|
|
JSONDict = dict[str, Any]
|
|
|
|
|
|
class LRCLibAPI:
|
|
class Item(TypedDict):
|
|
"""Lyrics data item returned by the LRCLib API."""
|
|
|
|
id: int
|
|
name: str
|
|
trackName: str
|
|
artistName: str
|
|
albumName: str
|
|
duration: float | None
|
|
instrumental: bool
|
|
plainLyrics: str
|
|
syncedLyrics: str | None
|
|
|
|
|
|
class GeniusAPI:
|
|
"""Genius API data types.
|
|
|
|
This documents *only* the fields that are used in the plugin.
|
|
:attr:`SearchResult` is an exception, since I thought some of the other
|
|
fields might be useful in the future.
|
|
"""
|
|
|
|
class DateComponents(TypedDict):
|
|
year: int
|
|
month: int
|
|
day: int
|
|
|
|
class Artist(TypedDict):
|
|
api_path: str
|
|
header_image_url: str
|
|
id: int
|
|
image_url: str
|
|
is_meme_verified: bool
|
|
is_verified: bool
|
|
name: str
|
|
url: str
|
|
|
|
class Stats(TypedDict):
|
|
unreviewed_annotations: int
|
|
hot: bool
|
|
|
|
class SearchResult(TypedDict):
|
|
annotation_count: int
|
|
api_path: str
|
|
artist_names: str
|
|
full_title: str
|
|
header_image_thumbnail_url: str
|
|
header_image_url: str
|
|
id: int
|
|
lyrics_owner_id: int
|
|
lyrics_state: str
|
|
path: str
|
|
primary_artist_names: str
|
|
pyongs_count: int | None
|
|
relationships_index_url: str
|
|
release_date_components: GeniusAPI.DateComponents
|
|
release_date_for_display: str
|
|
release_date_with_abbreviated_month_for_display: str
|
|
song_art_image_thumbnail_url: str
|
|
song_art_image_url: str
|
|
stats: GeniusAPI.Stats
|
|
title: str
|
|
title_with_featured: str
|
|
url: str
|
|
featured_artists: list[GeniusAPI.Artist]
|
|
primary_artist: GeniusAPI.Artist
|
|
primary_artists: list[GeniusAPI.Artist]
|
|
|
|
class SearchHit(TypedDict):
|
|
result: GeniusAPI.SearchResult
|
|
|
|
class SearchResponse(TypedDict):
|
|
hits: list[GeniusAPI.SearchHit]
|
|
|
|
class Search(TypedDict):
|
|
response: GeniusAPI.SearchResponse
|
|
|
|
|
|
class GoogleCustomSearchAPI:
|
|
class Response(TypedDict):
|
|
"""Search response from the Google Custom Search API.
|
|
|
|
If the search returns no results, the :attr:`items` field is not found.
|
|
"""
|
|
|
|
items: NotRequired[list[GoogleCustomSearchAPI.Item]]
|
|
|
|
class Item(TypedDict):
|
|
"""A Google Custom Search API result item.
|
|
|
|
:attr:`title` field is shown to the user in the search interface, thus
|
|
it gets truncated with an ellipsis for longer queries. For most
|
|
results, the full title is available as ``og:title`` metatag found
|
|
under the :attr:`pagemap` field. Note neither this metatag nor the
|
|
``pagemap`` field is guaranteed to be present in the data.
|
|
"""
|
|
|
|
title: str
|
|
link: str
|
|
pagemap: NotRequired[GoogleCustomSearchAPI.Pagemap]
|
|
|
|
class Pagemap(TypedDict):
|
|
"""Pagemap data with a single meta tags dict in a list."""
|
|
|
|
metatags: list[JSONDict]
|