from delphi_api.bigtable import BigTableModel, ProtoAttribute, TextAttribute from delphi_api.v2.constants import ( AMAZON_DSP_SLUGS, APPLE_COUNTRY_CODES, SPOTIFY_COUNTRY_CODES, YOUTUBE_COUNTRY_CODES, ) from delphi_api.v3.constants import AMAZON_COUNTRY_CODES, DSP_AMAZON from delphi_api.v3.enums import ColumnFamily, ColumnName, TableName from delphi_api.v3.proto.gen.amazon_v3_pb2 import AmazonCountryStats from delphi_api.v3.proto.gen.apple_v3_pb2 import AppleCountryStats from delphi_api.v3.proto.gen.spotify_v3_pb2 import SpotifyCountryStats from delphi_api.v3.proto.gen.youtube_v3_pb2 import YouTubeTrackStreamStats class AppleTrackStream(BigTableModel): class Meta: table_name = TableName.apple_streams.value country_codes = APPLE_COUNTRY_CODES len_sub_dsps = 1 date = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.DATE.value) dsp = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.DSP.value) artist_id = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.ARTIST_ID.value) isrc = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.ISRC.value) playlist_id = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.PLAYLIST_ID.value) product_id = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.PRODUCT_ID.value) track_id = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.TRACK_ID.value) streams = ProtoAttribute( column_family=ColumnFamily.METRICS.value, attr_name=ColumnName.STREAMS.value, deserialize_class=AppleCountryStats) demographics = ProtoAttribute( column_family=ColumnFamily.METRICS.value, attr_name=ColumnName.DEMOGRAPHICS.value, deserialize_class=AppleCountryStats) class AmazonTrackStream(BigTableModel): class Meta: table_name = TableName.amazon_streams.value country_codes = AMAZON_COUNTRY_CODES len_sub_dsps = len(AMAZON_DSP_SLUGS) date = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.DATE.value) full_dsp = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.DSP.value) artist_id = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.ARTIST_ID.value) isrc = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.ISRC.value) playlist_id = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.PLAYLIST_ID.value) product_id = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.PRODUCT_ID.value) track_id = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.TRACK_ID.value) streams = ProtoAttribute( column_family=ColumnFamily.METRICS.value, attr_name=ColumnName.STREAMS.value, deserialize_class=AmazonCountryStats) demographics = ProtoAttribute( column_family=ColumnFamily.METRICS.value, attr_name=ColumnName.DEMOGRAPHICS.value, deserialize_class=AmazonCountryStats) @property def dsp(self): """ Amazon has multiple sub-DSPs not used by clients. This proxy will normalize the ``dsp`` field, while the canonical value can still be accessed via ``full_dsp`` """ return DSP_AMAZON @dsp.setter def dsp(self, value): self.full_dsp = value class SpotifyTrackStream(BigTableModel): class Meta: table_name = TableName.spotify_streams.value country_codes = SPOTIFY_COUNTRY_CODES len_sub_dsps = 1 date = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.DATE.value) dsp = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.DSP.value) artist_id = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.ARTIST_ID.value) isrc = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.ISRC.value) playlist_id = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.PLAYLIST_ID.value) product_id = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.PRODUCT_ID.value) track_id = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.TRACK_ID.value) streams = ProtoAttribute( column_family=ColumnFamily.METRICS.value, attr_name=ColumnName.STREAMS.value, deserialize_class=SpotifyCountryStats) demographics = ProtoAttribute( column_family=ColumnFamily.METRICS.value, attr_name=ColumnName.DEMOGRAPHICS.value, deserialize_class=SpotifyCountryStats) class YouTubeTrackStream(BigTableModel): class Meta: table_name = TableName.youtube_streams.value country_codes = YOUTUBE_COUNTRY_CODES len_sub_dsps = 1 date = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.DATE.value) dsp = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.DSP.value) artist_id = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.ARTIST_ID.value) isrc = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.ISRC.value) playlist_id = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.PLAYLIST_ID.value) product_id = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.PRODUCT_ID.value) track_id = TextAttribute( column_family=ColumnFamily.META.value, attr_name=ColumnName.TRACK_ID.value) streams = ProtoAttribute( column_family=ColumnFamily.METRICS.value, attr_name=ColumnName.STREAMS.value, deserialize_class=YouTubeTrackStreamStats) demographics = ProtoAttribute( column_family=ColumnFamily.METRICS.value, attr_name=ColumnName.DEMOGRAPHICS.value, deserialize_class=YouTubeTrackStreamStats)