"""Models for tables related to Apple Music.""" from sqlalchemy import BigInteger, CHAR, Column, Date, DateTime, Integer, String, TIMESTAMP from sqlalchemy.dialects.mysql import BIT from sqlalchemy.orm import relationship from apollo_main_db.base import Base class AppleMusicArtist(Base): """Apple Music Artist. Attributes: storefront: Country code. id: Unique Apple Artist ID. name: Artist name. """ __tablename__ = 'tblAppleMusicArtist' storefront = Column('Storefront', CHAR(2), primary_key=True) id = Column('Id', BigInteger, primary_key=True) name = Column('Name', String(255)) def __str__(self) -> str: return 'Apple Music Artist {}'.format(self.id) class AppleMusicSongArtist(Base): """Apple Music Song Artist. Attributes: storefront: Country code. song_id: Apple Song ID. artist_id: Unique Apple Artist ID. artist_order: Artist order in a song authority. """ __tablename__ = 'tblAppleMusicSongArtist' storefront = Column('Storefront', CHAR(2), primary_key=True) song_id = Column('SongId', BigInteger, primary_key=True) artist_id = Column('ArtistId', Integer, primary_key=True) artist_order = Column('ArtistOrder', Integer) def __str__(self) -> str: return 'Apple Music song {} to artist {}'.format(self.song_id, self.artist_id) class AppleMusicSong(Base): """ Apple Music Song. Attributes: id: Unique Apple track ID. storefront: Country code. name: Track name. artist_id: ID of the artist. artist_name: Artist Name album_id: ID of the album artwork_url: Track image URL. isrc: International Standard Recording Code. This code is a unique identifier of a recording, but NOT of a track. The same recording can be released multiple times as tracks in different albums. Different tracks can share the same ISRC. release_date: Song release datetime """ __tablename__ = 'tblAppleMusicSong' id = Column('Id', BigInteger, primary_key=True) storefront = Column('Storefront', CHAR(2), primary_key=True) name = Column('Name', String(1024)) artist_id = Column('ArtistId', BigInteger) artist_name = Column('ArtistName', String(1024)) album_id = Column('AlbumId', BigInteger) artwork_url = Column('ArtworkUrl', String(255)) isrc = Column('ISRC', String(45)) release_date = Column('ReleaseDate', DateTime()) def __str__(self) -> str: return 'Apple Music song {}'.format(self.id) class AppleMusicAlbum(Base): """ Apple Music Album. Attributes: id: Unique Apple album ID. storefront: Country code. name: Album name. release_date: Album release datetime. release_year: Year of the release. track_count: Count of tracks on the album. artist_name: Artist Name artwork_url: Track image URL. upc: Album UPC. """ __tablename__ = 'tblAppleMusicAlbum' id = Column('Id', BigInteger, primary_key=True) storefront = Column('Storefront', CHAR(2), primary_key=True) name = Column('Name', String(255)) release_date = Column('ReleaseDate', DateTime()) release_year = Column('ReleaseYear', String(10)) artist_name = Column('ArtistName', String(255)) track_count = Column('TrackCount', Integer) artwork_url = Column('ArtworkUrl', String(255)) upc = Column('UPC', String(45)) def __str__(self) -> str: return 'Apple Music album {}'.format(self.id) class ApplePlaylist(Base): """ Apple Music playlist. Attributes: id: Playlist ID. name: Playlist name. """ __tablename__ = 'tblAppleMusicPlaylist' id = Column('Id', String(45), primary_key=True) name = Column('Name', String(1000)) removed = Column('Removed', BIT(1)) artwork = Column('Artwork', String(255)) curator_id = Column('CuratorId', BigInteger) latest_update = Column('LatestUpdate', TIMESTAMP) def __str__(self) -> str: return 'Apple Music playlist {}'.format(self.id) class ApplePlaylistStorefrontData(Base): """ Apple Music playlist storefront data. Attributes: playlist_id: Playlist ID. storefront: Country of listing. name: Playlist name. artwork: Image of playlist. """ __tablename__ = 'tblAppleMusicPlaylistStorefrontData' playlist_id = Column('PlaylistId', String(45), primary_key=True) storefront = Column('Storefront', String(2), primary_key=True) name = Column('Name', String(1000)) artwork = Column('Artwork', String(255)) def __str__(self) -> str: return 'Apple Music playlist {}'.format(self.id) class ApplePlaylistTrackList(Base): """ Apple Music Playlist Tracks. Attributes: playlist_id: Playlist ID. position: Order in playlist. storefront: Country of listing. song_id: Song ID. timestamp: Position of track by date. """ __tablename__ = 'tblAppleMusicPlaylistTracklist' playlist_id = Column('PlaylistId', String(100), primary_key=True) position = Column('Position', Integer, primary_key=True) previous_position = Column('PreviousPosition', Integer) storefront = Column('StoreFront', String(5), primary_key=True) song_id = Column('SongId', BigInteger) timestamp = Column('Timestamp', TIMESTAMP) latest_position_change = Column('LatestPositionChange', TIMESTAMP) added_datetime = Column('Added', DateTime()) added_earliest_datetime = Column('EarliestAdded', DateTime()) def __str__(self) -> str: return 'Apple Music playlist {} track {}'.format(self.id, self.song_id) class ApplePlaylistTracklistHistory(Base): """ Apple Music History. It shows rating (position) of track by date. Attributes: playlist_id: Playlist ID. storefront: Country of listing. date: Position of track by date. position: Order in playlist. song_id: Song ID. """ __tablename__ = 'tblAppleMusicPlaylistTracklistHistory' playlist_id = Column('PlaylistId', String(100), primary_key=True) storefront = Column('StoreFront', String(5), primary_key=True) date = Column('Date', Date(), primary_key=True) position = Column('Position', Integer, primary_key=True) song_id = Column('SongId', BigInteger) def __str__(self) -> str: return 'Apple Music History of Song {} on {}'.format(self.playlist_id, self.date) class ApplePlaylistTracklistHistoryReduced(Base): """ Apple Music History. It shows rating (position) of track by date. Attributes: playlist_id: Playlist ID. storefront: Country of listing. date: Position of track by date. position: Order in playlist. song_id: Song ID. """ __tablename__ = 'tblAppleMusicPlaylistTracklistHistoryReduced' playlist_id = Column('PlaylistId', String(100), primary_key=True) storefront = Column('StoreFront', String(5), primary_key=True) date = Column('Date', Date(), primary_key=True) position = Column('Position', Integer, primary_key=True) song_id = Column('SongId', BigInteger) def __str__(self) -> str: return 'Apple Music History of Song {} on {}'.format(self.playlist_id, self.date) class AppleMusicWeeklyTopPlaylistTrackHistory(Base): """ Apple Music track/playlist history for weekly top playlists. Attributes: playlist_id: Playlist ID. song_id: Song ID. storefront: Country code. entry_date: Track to playlist entry date. exit_date: Track from playlist exit date. """ __tablename__ = 'tblAppleMusicWeeklyTopPlaylistTrackHistory' playlist_id = Column('PlaylistId', String(40), primary_key=True) song_id = Column('SongId', BigInteger, primary_key=True) storefront = Column('StoreFront', String(2), primary_key=True) entry_date = Column('EntryDate', Date(), primary_key=True) exit_date = Column('ExitDate', Date()) def __str__(self) -> str: return 'Apple song {} / playlist {} history'.format(self.song_id, self.playlist_id) class AppleMusicWeeklyTopPlaylistTrackSummary(Base): """ Apple Music ISRC/playlist history summary for weekly top playlists. Attributes: playlist_id: Playlist ID. isrc: Song ISRC. storefront: Country code. entry_date: Track to playlist entry date. exit_date: Track from playlist exit date. """ __tablename__ = 'tblAppleMusicWeeklyTopPlaylistTrackSummary' id = Column('Id', BigInteger, primary_key=True) playlist_id = Column('PlaylistId', String(40)) isrc = Column('ISRC', String(45)) storefront = Column('StoreFront', String(2)) entry_date = Column('EntryDate', Date()) exit_date = Column('ExitDate', Date()) def __str__(self) -> str: return 'Apple song {} / playlist {} history'.format(self.isrc, self.playlist_id) class AppleMusicContainerStreamSummary(Base): """Apple Music Container Stream Summary. Attributes: container_id: Container ID. country_code: Country code. stream_7_days: Streams for last 7 days. latest_date: Latest date. """ __tablename__ = 'tblAppleMusicContainerStreamSummary' container_id = Column('ContainerId', String(100), primary_key=True) country_code = Column('CountryCode', String(10), primary_key=True) streams_7_days = Column('Streams7Days', Integer) streams_latest = Column('StreamsLatest', Integer) latest_date = Column('LatestDate', Date()) def __str__(self) -> str: return 'Apple Music Container Stream Summary {}-{}'.format(self.container_id, self.country_code) class AppleMusicContainerStreams(Base): """Apple Music Container Stream. Attributes: distributor_id: Distributor ID. date: Date. country_code: Country code. report_vendor_id: Report Vendor ID. container_id: Container ID. streams: Number of streams. """ __tablename__ = 'tblAppleMusicContainerStreams' distributor_id = Column('DistributerId', String(10), primary_key=True) date = Column('Date', Date(), primary_key=True) country_code = Column('CountryCode', String(10), primary_key=True) report_vendor_id = Column('ReportVendorId', String(10), primary_key=True) container_id = Column('ContainerId', String(100), primary_key=True) streams = Column('Streams', Integer) def __str__(self) -> str: return 'Apple Music Container Stream {}-{}'.format(self.container_id, self.country_code) class AppleWeeklyTopPlaylist(Base): """Apple Weekly Top Playlist. Attributes: date: Date of ranking. country_code: Country code. playlist_id: Playlist ID. rank: Rank of playlist. """ __tablename__ = 'tblAppleMusicWeeklyTopPlaylist' date = Column('Date', Date(), primary_key=True, index=True) country_code = Column('CountryCode', String(10), primary_key=True) playlist_id = Column('PlaylistId', String(100), primary_key=True) rank = Column('Rank', Integer) def __str__(self) -> str: return 'Apple Weekly Top Playlist {}-{}-{}'.format(self.playlist_id, self.country_code, self.rank) class AppleWeeklyTopPlaylistLatest(Base): """The latest weekly top playlists. Attributes: id: Table ID, primary key. playlist_id: Playlist ID. date: Report date. country_code: Country code. rank: Playlist rank. """ __tablename__ = "tblAppleMusicWeeklyTopPlaylistLatest" id = Column("Id", Integer, primary_key=True) playlist_id = Column("PlaylistId", String(45), nullable=False) date = Column("Date", Date, nullable=False) country_code = Column("CountryCode", String(10), nullable=False) rank = Column("Rank", Integer, nullable=False) def __str__(self) -> str: return f"Apple Weekly Top Playlist {self.country_code} {self.playlist_id}" class AppleMusicCurator(Base): """Apple Music curator. Attributes: id: ID. name: Name. type: Type. link: Link. """ __tablename__ = 'tblAppleMusicCurator' id = Column("Id", BigInteger, primary_key=True) name = Column("Name", String(255)) type = Column("CuratorType", String(100)) link = Column("CuratorLink", String(100)) def __str__(self) -> str: return "Apple Music curator {}".format(self.id) class AppleMusicPlaylistStatistics(Base): """Apple Music Playlist Statistics model. Keeps information about playlists tracklist update. Attributes: playlist_id: Playlist identifier. market: Market of playlist. tracklist_updated_at: Playlists tracklist update datetime. """ __tablename__ = "tblApplePlaylistStatistics" id = Column('Id', Integer, primary_key=True) playlist_id = Column('PlaylistId', String(45)) market = Column('Market', CHAR(2)) tracklist_updated_at = Column('TracklistLastUpdate', DateTime) def __str__(self) -> str: return f'Apple Music Playlists Statistics <{self.id}>: {self.playlist_id} - {self.market} - ' \ f'{self.tracklist_updated_at}'