Example #1
0
def main():
    if "--version" in sys.argv[1:] or "-v" in sys.argv[1:]:
        print(f"ytam version {version.version}")
        exit()

    if "--check" in sys.argv[1:] or "-k" in sys.argv[1:]:
        print("Initialising.")
        urls = Playlist(
            "https://www.youtube.com/playlist?list=PLOoPqX_q5JAVPMhHjYxcUc2bxTDMyGE-a"
        )
        playlist_title = urls.title
        start = 0
        end = len(urls)
        album = "Test Album"
        directory = f"music{SEP}"
        artist = "Test Artist"
        is_album = True
        proxies = None
        image = f"{BASE}{SEP}check{SEP}check.jpg"
        titles = f"{BASE}{SEP}check{SEP}check.txt"
        mp3 = True

    else:
        print("Initialising.")
        args = parse_args(sys.argv[1:])
        mp3 = args.mp3
        urls = Playlist(args.url)
        playlist_title = urls.title
        start = 0 if args.start is None else args.start - 1
        end = len(urls) if args.end is None else args.end
        directory = f"music{SEP}" if args.directory is None else args.directory
        proxies = None
        if args.proxy is not None:
            proxy_strings = [proxy.strip() for proxy in args.proxy.split(" ")]
            proxies = {}
            for proxy_string in proxy_strings:
                p = proxy_string.split("-")
                proxies[p[0]] = p[1]

        if args.discogs is not None:
            # do discogs error checks here
            try:
                d = Discogs(args.discogs)
                d.make_file(DEFAULT_TITLES)
                if (end - start) != d.num_tracks:
                    raise error.TracknumberMismatchError(
                        playlist_title, d.album)
                is_album = True
                album = d.album
                artist = d.artist
                image = d.image
                titles = DEFAULT_TITLES
            except (error.WrongMetadataLinkError, error.BrokenDiscogsLinkError,
                    error.TracknumberMismatchError) as e:
                print(f"Error: {e.message}")
                exit()

        else:
            album = playlist_title if args.album is None else args.album
            artist = "Unknown" if args.artist is None else args.artist
            is_album = False if args.album is None else True
            image = args.image
            titles = args.titles

    colorama.init()
    d = None
    try:
        if start >= len(urls):
            raise error.InvalidPlaylistIndexError(start, playlist_title)
        if end < start:
            raise error.IndicesOutOfOrderError()

        downloading_message = f"Downloading songs {font.apply('gb', start+1)} - {font.apply('gb', end)} from playlist {font.apply('gb', playlist_title)}"
        text_len = (len("Downloading songs ") + len(str(start)) + len(" - ") +
                    len(str(end)) + len(" from playlist ") +
                    len(playlist_title))
        print(downloading_message, f"\n{font.apply('gb', '─'*text_len)}")
        d = Downloader(
            list(enumerate(urls[start:end])),
            len(urls),
            album,
            directory,
            artist,
            is_album,
            titles,
            image,
            proxies,
            mp3,
        )
        d.start = start

        retry = True
        while retry:
            d.download()
            print(f"{font.apply('gb', '─'*text_len)}")
            print(
                f"{d.successful}/{len(urls[start:end])} downloaded successfully.\n"
            )
            if len(d.retry_urls) > 0:
                d.set_retries()
                urls_copy = d.urls.copy()
                user = input(
                    f"Retry {font.apply('fb', str(len(list(urls_copy))) + ' failed')} downloads? Y/N "
                )
                if not is_affirmative(user):
                    retry = False
                else:
                    print("\nRetrying.")
                    print(f"{font.apply('gb', '─'*len('Retrying.'))}")
            else:
                retry = False

    except (
            error.InvalidPlaylistIndexError,
            error.IndicesOutOfOrderError,
            error.TitlesNotFoundError,
            error.BadTitleFormatError,
    ) as e:
        print(f"Error: {e.message}")