import logging import time from datetime import timedelta import sentry_sdk from apollo_main_db.apollo.models import StarredContent from dsp import DigitalServiceProvider from sentry_sdk.integrations.aws_lambda import AwsLambdaIntegration from sentry_sdk.utils import BadDsn from config import Config from db import session_scope from redis_db import get_redis_lock logging.basicConfig(level=logging.INFO) logger = logging.getLogger(__name__) config = Config() try: sentry_sdk.init(dsn=config.SENTRY_DSN, integrations=[AwsLambdaIntegration()]) except BadDsn: pass def main() -> None: """Save users starred tracks streams values for all markets.""" lock = None try: if config.REDIS_LOCK_ENABLED: lock = get_redis_lock() if not lock.acquire(blocking=False): logger.info("Can not get lock") return """Script entry point.""" logger.info('Start') start_time = time.time() dsp = DigitalServiceProvider(config=config, logger=logger) end_date = dsp.get_streams_latest_date() start_date = end_date - timedelta(6) vendors = ["apple", "spotify"] with session_scope(config) as session: isrc_query = session.query(StarredContent.isrc).filter(StarredContent.isrc.isnot(None)).distinct() isrc_len = isrc_query.count() succeeded = 0 for index in range(0, isrc_len, config.ISRC_BATCH_SIZE): isrc_batch = [i.isrc for i in isrc_query[index:index + config.ISRC_BATCH_SIZE] if len(i.isrc) == 12] status = "FAILED" response = dsp.get_streams_per_country_bulk_2(isrc_batch, vendors, start_date, end_date) if response is not None: succeeded += len(isrc_batch) status = "SUCCESS" logger.info(f"{index}-{index + len(isrc_batch)} finished with status {status}.") time.sleep(config.DELAY) logger.info(f"Updated {succeeded}/{isrc_len * len(vendors)} in {time.time() - start_time} sec.") except Exception as e: sentry_sdk.capture_exception(e) raise finally: if config.REDIS_LOCK_ENABLED and lock and lock.locked(): lock.release() if __name__ == '__main__': main()