Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions lyricsgenius/types/song.py
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,9 @@ def __init__(self, lyrics: str, body: dict[str, Any]) -> None:
self.title_with_featured: str | None = body.get("title_with_featured")
self.url: str | None = body.get("url")
self.featured_artists: list[dict[str, Any]] = body.get("featured_artists", [])
self.primary_artists: list[dict[str, Any]] = body.get("primary_artists", [])
self.writer_artists: list[dict[str, Any]] = body.get("writer_artists", [])
self.producer_artists: list[dict[str, Any]] = body.get("producer_artists", [])

@property
def _text_data(self) -> str:
Expand Down
16 changes: 16 additions & 0 deletions main.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
import lyricsgenius

genius = lyricsgenius.Genius()

song = genius.search_song("Dr Hansjakobli und ds Babettli", "Mani Matter")

song = genius.search_song("Dr Hansjakobli u ds Babettli", "Mani Matter")


if song is not None:
print(song.lyrics)
song.save_lyrics("/Users/john/Downloads/song.txt", extension="txt", overwrite=True)

song = genius.search_song("dua lipa", "new rules", False, False)
if song is not None:
print(song.lyrics)
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ build-backend = "hatchling.build"

[project]
name = "lyricsgenius"
version = "3.9.0"
version = "3.10.0"
dependencies = ["beautifulsoup4>=4.12.3", "requests>=2.27.1"]
requires-python = ">=3.11"
authors = [{ name = "John W. R. Miller", email = "john.w.millr+lg@gmail.com" }]
Expand Down
49 changes: 48 additions & 1 deletion tests/fixtures/song_info_mocked.json
Original file line number Diff line number Diff line change
Expand Up @@ -156,6 +156,53 @@
"unreviewed_annotations": 3,
"hot": false
},
"featured_artists": []
"featured_artists": [
{
"id": 555555,
"name": "Mock Feature",
"api_path": "/artists/555555",
"header_image_url": "https://images.genius.com/mockfeature.jpg",
"image_url": "https://images.genius.com/mockfeature.jpg",
"is_meme_verified": false,
"is_verified": false,
"url": "https://genius.com/artists/Mock-feature"
}
],
"primary_artists": [
{
"id": 424242,
"name": "Py Testerson",
"api_path": "/artists/424242",
"header_image_url": "https://images.genius.com/fakepythonartist.jpg",
"image_url": "https://images.genius.com/fakepythonartist.jpg",
"is_meme_verified": true,
"is_verified": false,
"url": "https://genius.com/artists/Py-testerson"
}
],
"writer_artists": [
{
"id": 666666,
"name": "Test Writer",
"api_path": "/artists/666666",
"header_image_url": "https://images.genius.com/testwriter.jpg",
"image_url": "https://images.genius.com/testwriter.jpg",
"is_meme_verified": false,
"is_verified": false,
"url": "https://genius.com/artists/Test-writer"
}
],
"producer_artists": [
{
"id": 777777,
"name": "Test Producer",
"api_path": "/artists/777777",
"header_image_url": "https://images.genius.com/testproducer.jpg",
"image_url": "https://images.genius.com/testproducer.jpg",
"is_meme_verified": false,
"is_verified": false,
"url": "https://genius.com/artists/Test-producer"
}
]
}
]
52 changes: 52 additions & 0 deletions tests/test_song.py
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,58 @@ def test_song_artist(song_object: Song, mock_song_data: dict[str, Any]) -> None:
assert song_object.artist == mock_song_data["primary_artist"]["name"]


def test_song_primary_artists(
song_object: Song, mock_song_data: dict[str, Any]
) -> None:
"""Test if primary_artists is populated correctly."""
assert song_object.primary_artists == mock_song_data["primary_artists"]
assert song_object.primary_artists[0]["name"] == "Py Testerson"


def test_song_writer_artists(song_object: Song, mock_song_data: dict[str, Any]) -> None:
"""Test if writer_artists is populated correctly."""
assert song_object.writer_artists == mock_song_data["writer_artists"]
assert song_object.writer_artists[0]["name"] == "Test Writer"


def test_song_producer_artists(
song_object: Song, mock_song_data: dict[str, Any]
) -> None:
"""Test if producer_artists is populated correctly."""
assert song_object.producer_artists == mock_song_data["producer_artists"]
assert song_object.producer_artists[0]["name"] == "Test Producer"


def test_song_featured_artists(
song_object: Song, mock_song_data: dict[str, Any]
) -> None:
"""Test if featured_artists is populated correctly."""
assert song_object.featured_artists == mock_song_data["featured_artists"]
assert song_object.featured_artists[0]["name"] == "Mock Feature"


def test_song_artist_fields_default_empty(
mock_song_data: dict[str, Any], mock_lyrics: str
) -> None:
"""Test that artist list fields default to empty lists when absent from body."""
body = {
k: v
for k, v in mock_song_data.items()
if k
not in (
"primary_artists",
"writer_artists",
"producer_artists",
"featured_artists",
)
}
song = Song(mock_lyrics, body)
assert song.primary_artists == []
assert song.writer_artists == []
assert song.producer_artists == []
assert song.featured_artists == []


def test_to_dict(
song_object: Song, mock_song_data: dict[str, Any], mock_lyrics: str
) -> None:
Expand Down
2 changes: 1 addition & 1 deletion uv.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.