from loguru import logger import os import sys from dotenv import load_dotenv import data import mailing import config load_dotenv() def main(): logger.add( f"{os.getenv('LOGDIR')}/{config.LogParams.log_file}", # file path rotation=config.LogParams.log_rotation, # new file every 7 days retention=config.LogParams.log_retention, # keep files for 30 days compression=config.LogParams.log_compression, # compress old files level=config.LogParams.log_level # minimum level to write ) logger.info("Starting WHATS-NEW-CEA...") logger.info(f"Arguments: {sys.argv[1:]}") # Check if too many arguments if len(sys.argv) > 3: logger.error(f"Too many arguments: {sys.argv[1:]}") sys.exit(1) # Check if draft argument is provided is_draft = False if len(sys.argv) > 2: arg = sys.argv[2].lower() if arg == 'draft': is_draft = True else: logger.error(f"Invalid argument '{arg}'. Use 'draft' if you want to send a draft email or nothing if you want to send the real email.") sys.exit(1) # Default freq is 'daily' mode = 'daily' if len(sys.argv) > 1: arg = sys.argv[1].lower() if arg in {'daily', 'd'}: mode = 'daily' elif arg in {'weekly', 'w'}: mode = 'weekly' elif arg in {'weekend', 'we'}: mode = 'weekend' else: logger.error(f"Invalid argument '{arg}'. Use one of: 'daily', 'weekly', 'weekend', 'd', 'w', 'we'.") sys.exit(1) logger.info("Starting data extraction...") tracks_df, playlists_df, distro_df = data.get_raw_data(mode) logger.success("Data extraction completed.") if tracks_df.empty: logger.info("No new tracks found.") else: logger.info("Fetching Spotify metadata...") spotify_metadata_df = data.get_spotify_metadata(tracks_df) logger.success("Spotify metadata fetched.") logger.info("Enriching tracks dataframe...") tracks_df = data.enrich_tracks_df(tracks_df, spotify_metadata_df) logger.success("Tracks dataframe enriched.") logger.info("Splitting playlists dataframe...") updated_playlists_df, no_news_df = data.split_playlists_df(playlists_df, tracks_df) logger.success("Playlists dataframes split.") logger.info("Preparing to send emails...") for email in distro_df['email'].drop_duplicates(): logger.info(f"Building email for {email}...") try: html = mailing.build_email(email, distro_df, updated_playlists_df, tracks_df, no_news_df, mode, is_draft) logger.info(f"Sending email to {email}...") status = mailing.send_email(email, html, mode) if status=={}: logger.success(f"Email sent to {email}.") else: logger.error(f"Failed to send email to {email}: {status}") except Exception as e: logger.error(f"Failed to build email for {email}: {e}") logger.info("WHATS-NEW-CEA completed.") if __name__ == "__main__": main()