Compare commits
	
		
			3 Commits
		
	
	
		
			130f5edcfe
			...
			feature/mu
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 265c9f462f | |||
| 780daac0ef | |||
| 465af49057 | 
| @@ -30,7 +30,7 @@ from ..utils.exception import MKMissingNameException | |||||||
| from ..utils.exception.download import UrlNotFoundException | from ..utils.exception.download import UrlNotFoundException | ||||||
| from ..utils.shared import DEBUG_PAGES | from ..utils.shared import DEBUG_PAGES | ||||||
|  |  | ||||||
| from ..pages import Page, EncyclopaediaMetallum, Musify, YouTube, YoutubeMusic, Bandcamp, Genius, INDEPENDENT_DB_OBJECTS | from ..pages import Page, EncyclopaediaMetallum, Musify, YouTube, YoutubeMusic, Bandcamp, Musicbrainz, Genius, INDEPENDENT_DB_OBJECTS | ||||||
|  |  | ||||||
|  |  | ||||||
| ALL_PAGES: Set[Type[Page]] = { | ALL_PAGES: Set[Type[Page]] = { | ||||||
| @@ -38,7 +38,8 @@ ALL_PAGES: Set[Type[Page]] = { | |||||||
|     Genius, |     Genius, | ||||||
|     Musify, |     Musify, | ||||||
|     YoutubeMusic, |     YoutubeMusic, | ||||||
|     Bandcamp |     Bandcamp, | ||||||
|  |     Musicbrainz | ||||||
| } | } | ||||||
|  |  | ||||||
| if youtube_settings["use_youtube_alongside_youtube_music"]: | if youtube_settings["use_youtube_alongside_youtube_music"]: | ||||||
|   | |||||||
| @@ -1,5 +1,6 @@ | |||||||
| from .encyclopaedia_metallum import EncyclopaediaMetallum | from .encyclopaedia_metallum import EncyclopaediaMetallum | ||||||
| from .musify import Musify | from .musify import Musify | ||||||
|  | from .musicbrainz import Musicbrainz | ||||||
| from .youtube import YouTube | from .youtube import YouTube | ||||||
| from .youtube_music import YoutubeMusic | from .youtube_music import YoutubeMusic | ||||||
| from .bandcamp import Bandcamp | from .bandcamp import Bandcamp | ||||||
|   | |||||||
| @@ -134,7 +134,7 @@ class Genius(Page): | |||||||
|                 source_list=[source], |                 source_list=[source], | ||||||
|                 artist_list=[self.parse_api_object(data.get("artist"))], |                 artist_list=[self.parse_api_object(data.get("artist"))], | ||||||
|                 artwork=artwork, |                 artwork=artwork, | ||||||
|                 date=ID3Timestamp(**data.get("release_date_components", {})), |                 date=ID3Timestamp(**(data.get("release_date_components") or {})), | ||||||
|             ) |             ) | ||||||
|  |  | ||||||
|         if object_type == "song": |         if object_type == "song": | ||||||
|   | |||||||
							
								
								
									
										145
									
								
								music_kraken/pages/musicbrainz.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										145
									
								
								music_kraken/pages/musicbrainz.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,145 @@ | |||||||
|  | from collections import defaultdict | ||||||
|  | from dataclasses import dataclass | ||||||
|  | from enum import Enum | ||||||
|  | from typing import List, Optional, Type, Union, Generator, Dict, Any | ||||||
|  | from urllib.parse import urlparse | ||||||
|  |  | ||||||
|  | import pycountry | ||||||
|  | import musicbrainzngs | ||||||
|  | from bs4 import BeautifulSoup | ||||||
|  |  | ||||||
|  | from ..connection import Connection | ||||||
|  | from .abstract import Page | ||||||
|  | from ..utils.enums import SourceType, ALL_SOURCE_TYPES | ||||||
|  | from ..utils.enums.album import AlbumType, AlbumStatus | ||||||
|  | from ..objects import ( | ||||||
|  |     Artist, | ||||||
|  |     Source, | ||||||
|  |     Song, | ||||||
|  |     Album, | ||||||
|  |     ID3Timestamp, | ||||||
|  |     FormattedText, | ||||||
|  |     Label, | ||||||
|  |     Target, | ||||||
|  |     DatabaseObject, | ||||||
|  |     Lyrics, | ||||||
|  |     Artwork | ||||||
|  | ) | ||||||
|  | from ..utils.config import logging_settings, main_settings | ||||||
|  | from ..utils import string_processing, shared | ||||||
|  | from ..utils.string_processing import clean_song_title | ||||||
|  | from ..utils.support_classes.query import Query | ||||||
|  | from ..utils.support_classes.download_result import DownloadResult | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  | class Musicbrainz(Page): | ||||||
|  |     SOURCE_TYPE = ALL_SOURCE_TYPES.MUSICBRAINZ | ||||||
|  |  | ||||||
|  |     HOST = "https://musicbrainz.org" | ||||||
|  |  | ||||||
|  |     def __init__(self, *args, **kwargs): | ||||||
|  |         musicbrainzngs.set_useragent("mk", "1") | ||||||
|  |  | ||||||
|  |         super().__init__(*args, **kwargs) | ||||||
|  |      | ||||||
|  |     def general_search(self, search_query: str) -> List[DatabaseObject]: | ||||||
|  |         search_results = [] | ||||||
|  |  | ||||||
|  |         #Artist | ||||||
|  |         search_results += self.artist_search(search_query).copy() | ||||||
|  |  | ||||||
|  |         #Album | ||||||
|  |         search_results += self.album_search(search_query).copy() | ||||||
|  |  | ||||||
|  |         #Song | ||||||
|  |         search_results += self.song_search(search_query).copy() | ||||||
|  |  | ||||||
|  |         return search_results | ||||||
|  |  | ||||||
|  |     def artist_search(self, search_query: str) -> List[Artist]: | ||||||
|  |         artist_list = [] | ||||||
|  |          | ||||||
|  |         #Artist | ||||||
|  |         artist_dict_list: list = musicbrainzngs.search_artists(search_query)['artist-list'] | ||||||
|  |         artist_source_list: List[Source] = [] | ||||||
|  |         for artist_dict in artist_dict_list: | ||||||
|  |             artist_source_list.append(Source(self.SOURCE_TYPE, self.HOST + "/artist/" + artist_dict['id'])) | ||||||
|  |             artist_list.append(Artist( | ||||||
|  |                 name=artist_dict['name'], | ||||||
|  |                 source_list=artist_source_list | ||||||
|  |             )) | ||||||
|  |    | ||||||
|  |         return artist_list | ||||||
|  |  | ||||||
|  |     def song_search(self, search_query: str) -> List[Song]: | ||||||
|  |         song_list = [] | ||||||
|  |  | ||||||
|  |         #Song | ||||||
|  |         song_dict_list: list = musicbrainzngs.search_recordings(search_query)['recording-list'] | ||||||
|  |         song_source_list: List[Source] = []  | ||||||
|  |         for song_dict in song_dict_list: | ||||||
|  |             song_source_list.append(Source(self.SOURCE_TYPE, self.HOST + "/recording/" + song_dict['id']))  | ||||||
|  |             song_list.append(Song( | ||||||
|  |                 title=song_dict['title'], | ||||||
|  |                 source_list=song_source_list | ||||||
|  |             ))  | ||||||
|  |  | ||||||
|  |         return song_list | ||||||
|  |      | ||||||
|  |     def album_search(self, search_query: str) -> List[Album]: | ||||||
|  |         album_list = [] | ||||||
|  |  | ||||||
|  |         #Album | ||||||
|  |         album_dict_list: list = musicbrainzngs.search_release_groups(search_query)['release-group-list'] | ||||||
|  |         album_source_list: List[Source] = [] | ||||||
|  |         for album_dict in album_dict_list: | ||||||
|  |             album_source_list.append(Source(self.SOURCE_TYPE, self.HOST + "/release-group/" + album_dict['id'])) | ||||||
|  |             album_list.append(Album( | ||||||
|  |                 title=album_dict['title'], | ||||||
|  |                 source_list=album_source_list | ||||||
|  |             )) | ||||||
|  |  | ||||||
|  |         return album_list | ||||||
|  |  | ||||||
|  |  | ||||||
|  |     def fetch_album(self, source: Source, stop_at_level: int = 1) -> Album: | ||||||
|  |         album_list = [] | ||||||
|  |  | ||||||
|  |         #Album | ||||||
|  |         album_dict_list: list = musicbrainzngs.search_release_groups(search_query)['release-group-list'] | ||||||
|  |         album_source_list: List[Source] = [] | ||||||
|  |         for album_dict in album_dict_list: | ||||||
|  |             album_source_list.append(Source(self.SOURCE_TYPE, self.HOST + "/release-group/" + album_dict['id'])) | ||||||
|  |             album_list.append(Album( | ||||||
|  |                 title=album_dict['title'], | ||||||
|  |                 source_list=album_source_list | ||||||
|  |             )) | ||||||
|  |  | ||||||
|  |     def fetch_artist(self, source: Source, stop_at_level: int = 1) -> Artist: | ||||||
|  |         artist_list = [] | ||||||
|  |          | ||||||
|  |         #Artist | ||||||
|  |         artist_dict_list: list = musicbrainzngs.search_artists(search_query)['artist-list'] | ||||||
|  |         artist_source_list: List[Source] = [] | ||||||
|  |         for artist_dict in artist_dict_list: | ||||||
|  |             artist_source_list.append(Source(self.SOURCE_TYPE, self.HOST + "/artist/" + artist_dict['id'])) | ||||||
|  |             artist_list.append(Artist( | ||||||
|  |                 name=artist_dict['name'], | ||||||
|  |                 source_list=artist_source_list, | ||||||
|  |             )) | ||||||
|  |  | ||||||
|  |     def fetch_song(self, source: Source, stop_at_level: int = 1) -> Song: | ||||||
|  |         song_list = [] | ||||||
|  |  | ||||||
|  |         #Song | ||||||
|  |         song_dict_list: list = musicbrainzngs.search_recordings(search_query)['recording-list'] | ||||||
|  |         song_source_list: List[Source] = []  | ||||||
|  |         for song_dict in song_dict_list: | ||||||
|  |             song_source_list.append(Source(self.SOURCE_TYPE, self.HOST + "/recording/" + song_dict['id']))  | ||||||
|  |             song_list.append(Song( | ||||||
|  |                 title=song_dict['title'], | ||||||
|  |                 source_list=song_source_list | ||||||
|  |             ))  | ||||||
|  |      | ||||||
|  |          | ||||||
| @@ -59,6 +59,11 @@ Reference for the logging formats: https://docs.python.org/3/library/logging.htm | |||||||
|         description="The logger for the musify scraper.", |         description="The logger for the musify scraper.", | ||||||
|         default_value="musify" |         default_value="musify" | ||||||
|     ), |     ), | ||||||
|  |     LoggerAttribute( | ||||||
|  |         name="musicbrainz_logger", | ||||||
|  |         description="The logger for the musicbrainz scraper.", | ||||||
|  |         default_value="musicbrainz" | ||||||
|  |     ), | ||||||
|     LoggerAttribute( |     LoggerAttribute( | ||||||
|         name="youtube_logger", |         name="youtube_logger", | ||||||
|         description="The logger for the youtube scraper.", |         description="The logger for the youtube scraper.", | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user