import argparse
import os
import sys
from dotenv import load_dotenv
from loguru import logger
load_dotenv()
def setup_logging(log_file: str | None = None) -> None:
logger.remove()
logger.add(
sys.stderr,
level="INFO",
format="{time:HH:mm:ss} | {level:<8} | {message}",
)
if log_file:
log_dir = os.getenv("LOGDIR")
if log_dir:
logger.add(
os.path.join(log_dir, log_file),
rotation="7 days",
retention="30 days",
level="DEBUG",
format="{time:YYYY-MM-DD HH:mm:ss} | {level:<8} | {message}",
)
def main() -> None:
parser = argparse.ArgumentParser(
prog="spotify-contribution",
description="Spotify market share contribution and breakdown pipelines",
)
parser.add_argument(
"mode",
choices=["contribution", "ms-breakdown", "all"],
help="Pipeline to run: contribution, ms-breakdown, or all (both)",
)
parser.add_argument(
"--log-file", "-l",
default="spotify-contribution-cea.log",
)
args = parser.parse_args()
setup_logging(args.log_file)
try:
if args.mode in ("contribution", "all"):
from .services.contribution import run_update as run_contrib
run_contrib()
if args.mode in ("ms-breakdown", "all"):
from .services.ms_breakdown import run_update as run_msb
run_msb()
except KeyboardInterrupt:
logger.info("Interrupted by user")
sys.exit(130)
except SystemExit:
raise
except Exception as e:
logger.exception(f"Fatal error: {e}")
sys.exit(1)
if __name__ == "__main__":
main()