예제 #1
0
def console_entry_point():
    """
    This is where all the console processing magic happens.
    Its super simple, rudimentary even but, it's dead simple & it works.
    """

    # If -v parameter is specified print version and exit
    if len(sys.argv) >= 2 and sys.argv[1] in ["-v", "--version"]:
        version = pkg_resources.require("spotdl")[0].version
        print(version)
        sys.exit(0)

    # Parser arguments
    arguments = parse_arguments()

    # Convert arguments to dict
    args_dict = vars(arguments)

    # Check if ffmpeg has correct version, if not exit
    if (ffmpeg.has_correct_version(arguments.ignore_ffmpeg_version,
                                   arguments.ffmpeg or "ffmpeg") is False):
        sys.exit(1)

    if "saved" in arguments.query and not arguments.user_auth:
        arguments.user_auth = True
        print(
            "Detected 'saved' in command line, but no --user-auth flag. Enabling Anyways."
        )
        print("Please Log In...")

    # Initialize spotify client
    SpotifyClient.init(
        client_id="5f573c9620494bae87890c0f08a60293",
        client_secret="212476d9b0f3472eaa762d90b19b0ba8",
        user_auth=arguments.user_auth,
    )

    # Change directory if user specified correct output path
    if arguments.output:
        if not os.path.isdir(arguments.output):
            sys.exit("The output directory doesn't exist.")
        print(f"Will download to: {os.path.abspath(arguments.output)}")
        os.chdir(arguments.output)

    # Start download manager
    with DownloadManager(args_dict) as downloader:
        if not arguments.debug_termination:

            def graceful_exit(signal, frame):
                downloader.display_manager.close()
                sys.exit(0)

            signal.signal(signal.SIGINT, graceful_exit)
            signal.signal(signal.SIGTERM, graceful_exit)

        # Find tracking files in queries
        tracking_files = [
            query for query in arguments.query
            if query.endswith(".spotdlTrackingFile")
        ]

        # Restart downloads
        for tracking_file in tracking_files:
            print("Preparing to resume download...")
            downloader.resume_download_from_tracking_file(tracking_file)

        # Get songs
        song_list = parse_query(
            arguments.query,
            arguments.output_format,
            arguments.use_youtube,
            arguments.generate_m3u,
            arguments.search_threads,
        )

        # Start downloading
        if len(song_list) > 0:
            downloader.download_multiple_songs(song_list)
예제 #2
0
import os
import platform
import re
from functools import partial
from pathlib import Path
from pprint import pprint
from typing import Callable, List, NamedTuple

import spotdl.download as spotdl
from spotdl.search import SpotifyClient, from_spotify_url

PLAYLIST_RE = re.compile("https?://open\.spotify\.com/playlist/*")

SpotifyClient.init(
    client_id="9fec59cd741a4692b5ae2ccb84a725af",
    client_secret="4e347cc3d2b74c93b20b57b6a5f75951",
    user_auth=False,
)

CLIENT = SpotifyClient()


class Song(NamedTuple):
    title: str
    artists: List[str]
    album: str
    url: str


class Diff(NamedTuple):
    to_delete: List[Path]