import logging from collections.abc import Sequence from dataclasses import asdict, dataclass from owsclient import OwsClient from pydantic import BaseModel, Field, TypeAdapter logger = logging.getLogger(__name__) class ArtistSocialsStats(BaseModel): chartmetric_artist_id: int = Field(alias="chartmetricArtistId") spotify_monthly_listeners: int | None = Field(alias="spotifyMonthlyListeners") instagram_followers: int | None = Field(alias="instagramFollowers") tiktok_followers: int | None = Field(alias="tiktokFollowers") spotify_followers: int | None = Field(alias="spotifyFollowers") facebook_followers: int | None = Field(alias="facebookFollowers") youtube_followers: int | None = Field(alias="youtubeFollowers") twitter_followers: int | None = Field(alias="twitterFollowers") soundcloud_followers: int | None = Field(alias="soundcloudFollowers") deezer_followers: int | None = Field(alias="deezerFollowers") ArtistSocialStatsList = TypeAdapter(list[ArtistSocialsStats]) @dataclass class ArtistSocialsStatsArgs: artists_ids: Sequence[int] @dataclass class OwsSocialsClient: ows_client: OwsClient service_name = "ows-socials" def get_stats_by_artists_ids( self, args: ArtistSocialsStatsArgs, ) -> list[ArtistSocialsStats]: """ Get artist stats by artists IDs. """ response = self.ows_client.post( self.service_name, "/socials/artists/stats-by-artists-ids", json=asdict(args), ) response.raise_for_status() return ArtistSocialStatsList.validate_json(response.content)