#!/usr/bin/python3 ######################################################### # # This is the main module for calling pseo related functions. # This is the end user interface and is user driven. # TBD: argsparser and taking config file. For usuability, # no editing of code should be required. # ######################################################### import sys import os import argparse import json import traceback import requests from loguru import logger logger.remove() logger.add(sys.stdout, colorize=True, format="{level}|{file}:{line}:{function}| {message}" ) from lib.get_text_response import generate_detailed_blog, generate_youtube_blog def main(): """Parses user arguments and prints them to the console. Raises: TypeError: If the user input is not valid. ValueError: If the number of blogs is less than 1. """ parser = argparse.ArgumentParser( description="Accepts user input for the number of blogs, subtopics, keywords, and niche." ) parser.add_argument("--num_blogs", type=int, default=5, help="The number of blogs (default: 5).") parser.add_argument("--keywords", type=str, help="The keywords.A broad idea to write multiple blogs on.") parser.add_argument("--niche", type=bool, default=False, help="Written blogs on long tailed search topics (default: False).") parser.add_argument("--num_subtopics", type=int, default=6, help="The number of sub topics to write (default: 6).") parser.add_argument("--youtube_urls", type=str, help="Pass one or multiple comma separated urls.") args = parser.parse_args() # Check if the number of blogs is less than 1 if not args.keywords and not args.youtube_urls: raise ValueError("Error: Either --keyword Or --youtube_urls must be given.") if not args.youtube_urls: # Print the user input to the console logger.info(f"Number of blogs: {args.num_blogs}") logger.info(f"Keywords: {args.keywords}") logger.info(f"Niche blog: {args.niche}") else: logger.info(f"Starting to write blog for URL: {args.youtube_urls}") return args def check_openai_api_key(openai_api_key): """Checks if the given OpenAI API key is valid and works. Args: openai_api_key: The OpenAI API key to check. Returns: True if the OpenAI API key is valid and works, False otherwise. """ headers = { "Authorization": f"Bearer {openai_api_key}" } # Make a test request to the OpenAI API. response = requests.get( "https://api.openai.com/v1/engines", headers=headers ) # If the request was successful, the API key is valid and works. return response.status_code == 200 if __name__ == "__main__": # Check if we have everything, we need to start writing blogs. """Checks for the OPENAI_API_KEY environment variable, if it is not exported or if it is not valid.""" openai_api_key = os.environ.get("OPENAI_API_KEY") if not openai_api_key: logger.error("Error: Please export OPENAI_API_KEY='' - before running this script.") exit(1) # Check if the OpenAI API key is valid. if not check_openai_api_key(openai_api_key): logger.error("The OPENAI_API_KEY not valid. Check your API key and make sure its correct.") exit(1) # The OpenAI API key is valid and works. logger.info("The OPENAI_API_KEY environment variable is valid and works.") try: args = main() except TypeError as e: logger.error(e) except ValueError as e: logger.error(e) else: # If youtube urls are given then we only generate blogs and quit. if args.youtube_urls: yt_url_list = args.youtube_urls.split(",") yt_url_list = [str(x) for x in yt_url_list] logger.info(f"Youtube urls to convert into blog:{yt_url_list}") generate_youtube_blog(yt_url_list) # Check if blogs need to be written from given keywords. elif args.keywords: logger.info(f"Writing {args.num_blogs} blogs on '{args.keywords}' with {args.num_subtopics} subtopics.") generate_detailed_blog(args.num_blogs, args.keywords, args.niche, args.num_subtopics)