예제 #1
0
def packt_cli(cfgpath, grab, grabd, dall, sgd, mail, status_mail, folder, jwt,
              cookiejwt, noauth_local_webserver, product):
    config_file_path = cfgpath
    into_folder = folder

    try:
        cfg = ConfigurationModel(config_file_path)
        product_data = None
        if jwt or cookiejwt:
            recaptcha_solution = ''
        else:
            recaptcha_solution = solve_recaptcha(cfg.anticaptcha_api_key,
                                                 PACKT_URL,
                                                 PACKT_RECAPTCHA_SITE_KEY)

        cj = None
        if cookiejwt:
            logger.info("Fetching packtpub.com cookie")
            cj = browser_cookie3.load(domain_name='.packtpub.com')

        api_client = PacktAPIClient(
            {
                'recaptcha': recaptcha_solution,
                **cfg.packt_login_credentials
            }, cj)

        if product != '':
            download_one = True
        else:
            download_one = False

        # Grab the newest book
        if grab or grabd or sgd or mail:
            product_data = claim_product(api_client, recaptcha_solution)

            # Send email about successful book grab. Do it only when book
            # isn't going to be emailed as we don't want to send email twice.
            if status_mail and not mail:
                from utils.mail import MailBook
                mb = MailBook(config_file_path)
                mb.send_info(subject=SUCCESS_EMAIL_SUBJECT.format(
                    dt.datetime.now().strftime(DATE_FORMAT),
                    product_data['title']),
                             body=SUCCESS_EMAIL_BODY.format(
                                 product_data['title']))

        # Download book(s) into proper location.
        if grabd or dall or sgd or mail or download_one:
            download_directory, formats = cfg.config_download_data
            download_directory = download_directory if (
                dall or grabd) else os.getcwd()  # cwd for temporary downloads
            formats = formats or AVAILABLE_DOWNLOAD_FORMATS

            # Download one book into proper location.
            if download_one:
                product_data = get_book_data(api_client, product)
                if product_data is not None:
                    # get_product_download_urls
                    download_products(api_client,
                                      download_directory,
                                      formats, [product_data],
                                      into_folder=into_folder)
            elif dall:
                download_products(api_client,
                                  download_directory,
                                  formats,
                                  get_all_books_data(api_client),
                                  into_folder=into_folder)
            elif grabd:
                download_products(api_client,
                                  download_directory,
                                  formats, [product_data],
                                  into_folder=into_folder)
            else:  # sgd or mail
                download_products(api_client,
                                  download_directory,
                                  formats, [product_data],
                                  into_folder=False)

        # Send downloaded book(s) by mail or to Google Drive.
        if sgd or mail:
            paths = [
                os.path.join(download_directory, path)
                for path in os.listdir(download_directory)
                if os.path.isfile(path)
                and slugify_product_name(product_data['title']) in path
            ]
            if sgd:
                from utils.google_drive import GoogleDriveManager
                google_drive = GoogleDriveManager(config_file_path)
                google_drive.send_files(paths)
            else:
                from utils.mail import MailBook
                mb = MailBook(config_file_path)
                pdf_path = None
                mobi_path = None
                try:
                    pdf_path = [
                        path for path in paths if path.endswith('.pdf')
                    ][-1]
                    mobi_path = [
                        path for path in paths if path.endswith('.mobi')
                    ][-1]
                except IndexError:
                    pass
                if pdf_path:
                    mb.send_book(pdf_path)
                if mobi_path:
                    mb.send_kindle(mobi_path)
            for path in paths:
                os.remove(path)

        logger.success("Good, looks like all went well! :-)")
    except Exception as e:
        logger.error("Exception occurred {}".format(e))
        if status_mail:
            from utils.mail import MailBook
            mb = MailBook(config_file_path)
            mb.send_info(subject=FAILURE_EMAIL_SUBJECT.format(
                dt.datetime.now().strftime(DATE_FORMAT)),
                         body=FAILURE_EMAIL_BODY.format(str(e)))
        sys.exit(2)
예제 #2
0
def packt_cli(cfgpath, grab, grabd, dall, sgd, oc, ocall, mail, status_mail,
              folder, cli, noauth_local_webserver):
    config_file_path = cfgpath
    into_folder = folder

    try:
        cfg = ConfigurationModel(config_file_path)
        product_data = None
        api_client = PacktAPIClient(*cfg.packt_login_credentials)

        # Grab the newest book
        if grab or grabd or sgd or mail or oc:
            product_data = claim_product(api_client, cfg.anticaptcha_api_key)

            # Send email about successful book grab. Do it only when book
            # isn't going to be emailed as we don't want to send email twice.
            if status_mail and not mail:
                from utils.mail import MailBook
                mb = MailBook(config_file_path)
                mb.send_info(subject=SUCCESS_EMAIL_SUBJECT.format(
                    dt.datetime.now().strftime(DATE_FORMAT),
                    product_data['title']),
                             body=SUCCESS_EMAIL_BODY.format(
                                 product_data['title']))

        # Download book(s) into proper location.
        if grabd or dall or sgd or mail or oc or ocall or cli:
            download_directory, formats = cfg.config_download_data
            download_directory = download_directory if (
                dall or grabd
                or cli) else os.getcwd()  # cwd for temporary downloads
            formats = formats or AVAILABLE_DOWNLOAD_FORMATS

            if cli:
                from cli import Prompt
                all_books = get_all_books_data(api_client)
                cli = Prompt("tab",
                             None,
                             None,
                             all_books,
                             api_client,
                             download_directory,
                             formats,
                             into_folder=into_folder)
                cli.cmdloop()

            if dall or ocall:
                download_products(api_client,
                                  download_directory,
                                  formats,
                                  get_all_books_data(api_client),
                                  into_folder=into_folder)
            elif grabd:
                download_products(api_client,
                                  download_directory,
                                  formats, [product_data],
                                  into_folder=into_folder)
            else:  # sgd or mail or oc
                download_products(api_client,
                                  download_directory,
                                  formats, [product_data],
                                  into_folder=False)

        # Send downloaded book(s) by mail, owncloud, nextcloud or to Google Drive.
        if sgd or mail or oc or ocall:
            if ocall:
                formats = ['.pdf', '.mobi', '.epub', '.zip']
                # This is not that good but works for me - needs refactor
                paths = [
                    os.path.join(download_directory, path)
                    for path in os.listdir(download_directory)
                    if os.path.isfile(path)
                    and os.path.splitext(path)[1] in formats
                ]
            else:
                paths = [
                    os.path.join(download_directory, path)
                    for path in os.listdir(download_directory)
                    if os.path.isfile(path)
                    and slugify_product_name(product_data['title']) in path
                ]
            if sgd:
                from utils.google_drive import GoogleDriveManager
                google_drive = GoogleDriveManager(config_file_path)
                google_drive.send_files(paths)
            elif oc or ocall:
                from utils.occloud import OwncloudManager
                oc = OwncloudManager(config_file_path)
                oc.send_files(paths)
            else:
                from utils.mail import MailBook
                mb = MailBook(config_file_path)
                pdf_path = None
                mobi_path = None
                try:
                    pdf_path = [
                        path for path in paths if path.endswith('.pdf')
                    ][-1]
                    mobi_path = [
                        path for path in paths if path.endswith('.mobi')
                    ][-1]
                except IndexError:
                    pass
                if pdf_path:
                    mb.send_book(pdf_path)
                if mobi_path:
                    mb.send_kindle(mobi_path)
            for path in paths:
                os.remove(path)

        logger.success("Good, looks like all went well! :-)")
    except Exception as e:
        logger.error("Exception occurred {}".format(e))
        if status_mail:
            from utils.mail import MailBook
            mb = MailBook(config_file_path)
            mb.send_info(subject=FAILURE_EMAIL_SUBJECT.format(
                dt.datetime.now().strftime(DATE_FORMAT)),
                         body=FAILURE_EMAIL_BODY.format(str(e)))
        sys.exit(2)