コード例 #1
0
def downloadFile(kID,
                 vID,
                 mp3Convert=False,
                 useCurrentDir=False,
                 fileName='',
                 format=None,
                 quality=None,
                 debug=False,
                 verbose=False):
    '''
    Download a file from youtube with y2mate.com API
    Parameters:
    - kID:           Security ID generated by y2mate on their JavaScript Code.
    - vID:           Youtube video ID
    - useCurrentDir: Let you download files on current directory
    - fileName:      FileName name
    - format:        Selected format with -f
    - quality:       Selected quality with -q
    - debug:         Show debug info
    - verbose:       Show status info
    '''

    if fileName == '':
        return None

    if format == None or quality == None:
        return None

    # GET DOWNLOAD LINK
    ###########################################################################
    if mp3Convert:
        print('This may take a while, please be patient!\n')

        getLinkURL = 'https://www.y2mate.com/mates/mp3Convert'
    else:
        getLinkURL = 'https://www.y2mate.com/mates/es/convert'

    data = {
        'type': 'youtube',
        '_id': kID,
        'v_id': vID,
        'ajax': 1,
        'token': '',
        'ftype': format,
        'fquality': quality
    }

    headers = {
        'authority': urlGetNetloc(getLinkURL),
        'method': 'POST',
        'path': urlGetPath(getLinkURL),
        'scheme': urlGetScheme(getLinkURL),
        'content-type': getContentType('form'),
        'origin': urlGetPath(getLinkURL),
        'pragma': 'no-cache',
        'referer': 'https://y2mate.com/es/youtube/' + vID,
        'user-agent': getChromeAgent(),
        'x-request-with': 'XMLHttpRequest'
    }

    req = Request(
        url = getLinkURL, method = 'POST', headers = headers, data = data, \
        debug = debug
    )

    _verbose(verbose, 'Status: Getting file download link...', end='')

    res = req.do()
    if res.status_code == 200:
        parser = AdvancedHTMLParser.AdvancedHTMLParser()
        parser.parseStr(res.json()['result'])

        # GET DOWNLOAD LINK
        if len(parser.getElementsByTagName('a')) == 0:
            exit('[Error] something is wrong with download... try again!')

        fileLink = parser.getElementsByTagName('a')[0].href

        _verbose(verbose, '[OK]')

        # DOWNLOAD FILE
        # ---------------------------------------------------------------------
        _verbose(verbose, 'Status: Downloading file...', end='')

        # REMOVE CHARACTERS
        fileName = fileName.replace( '/', '' ) \
                .replace( '[', '' ) \
                .replace( ']', '' ) \
                .replace( "'", '' )
        fileName = fileName.split('.')
        ext = fileName.pop()
        name = '.'.join(fileName).strip()
        fileName = name + '.' + ext

        # SET FILE PATH TO CURRENT DIRECTORY
        if useCurrentDir:
            filePath = './' + fileName
        # CHOSE FILE PATH FROM ENVIROMENT VARIABLES
        else:
            # AUDIO FILES
            if format in ['mp3', 'm4a']:
                saveDir = getAudioFolderPath()
            # VIDEO FILES
            else:
                saveDir = getVideoFolderPath()
            filePath = saveDir + fileName

        chunk = 1024

        res = requests.get(fileLink, stream=True)

        # FILE NOT FOUND. SERVER ERROR
        if res.status_code == 404:
            _verbose(verbose, '[ERROR]')
            exit('[Server Error]: File not found!')

        # ASK FOR FILE OVERWRITE
        # ---------------------------------------------------------------------
        if path.exists(filePath) and path.isfile(filePath):
            while True:
                answer = input(
                    'File \'{}\' already exists, overwride? [y/n]: '.format(
                        filePath)).lower()

                if not answer in ['y', 'n']:
                    continue
                else:
                    break

            if answer == 'y':
                remove(filePath)
                print('File \'{}\' deleted!'.format(filePath))
            # CHANGE FILE NAME FOR NOT OVERWRITE
            else:
                _fileName = fileName
                _path = filePath.split('/')
                filePath = '/'.join(_path[:-1]) + '/2_' + _path[-1]
                fileName = '2_' + fileName
                print('File \'{}\' renamed to \'{}\''.format(
                    _fileName, fileName))
        # ---------------------------------------------------------------------

        # SAVE FILE STREAM
        # ---------------------------------------------------------------------
        filePath = path.normpath(filePath)
        fileSize = int(res.headers.get('content-length', 0))
        with open(filePath, 'wb') as f, tqdm(desc=fileName,
                                             total=fileSize,
                                             unit='iB',
                                             unit_scale=True,
                                             unit_divisor=chunk) as bar:
            for data in res.iter_content(chunk_size=chunk):
                size = f.write(data)
                bar.update(size)

        print('Saved at \'{}\'...'.format(filePath))
        # ---------------------------------------------------------------------

        _verbose(verbose, '[OK]')
        # ---------------------------------------------------------------------
    else:
        _verbose(verbose, '[error]')
コード例 #2
0
def getOptions(vID, verbose=False, debug=False, mp3Convert=False):
    '''
    Get available options from API.
    - vID:        Youtube video ID.
    - verbose:    Show info about process status.
    - debug:      Show debug info about HTTP requests.
    - mp3Convert: Get Options from Y2mate Youtube MP3 Converter
    '''

    if mp3Convert:
        optionsURL = 'https://www.y2mate.com/mates/en31/mp3/ajax'
    else:
        optionsURL = 'https://www.y2mate.com/mates/es19/analyze/ajax'

    data = {
        'url': 'https://youtube.com/watch?v=' + vID,
        'q_auto': 0,
        'ajax': 1
    }
    headers = {
        'authority': urlGetNetloc(optionsURL),
        'content-type': getContentType('form'),
        'method': 'POST',
        'path': urlGetPath(optionsURL),
        'referer': 'https://www.y2mate.com/es/youtube/' + vID,
        'scheme': urlGetScheme(optionsURL),
        'user-agent': getChromeAgent()
    }
    req = Request(
        url = optionsURL, method = 'POST', headers = headers, data = data, \
        debug = debug
    )
    res = req.do()
    _verbose(verbose, 'Status: Getting download available options...', end='')

    if res.status_code == 200:
        # GET AVAILABLE OPTIONS
        if res.headers['Content-Type'] == 'application/json':
            parser = AdvancedHTMLParser.AdvancedHTMLParser()
            parser.parseStr(res.json()['result'])

            # GET KID FROM SCRIPT CONTENT
            kID = res.json()['result'].split('k__id = "')[1].split('"')[0]

            # GET VIDEO TITLE
            title = parser.getElementsByClassName('caption')[0] \
                .children[0] \
                .innerText

            if mp3Convert:
                data = parseYoutubeMp3ConverterOptions(parser, verbose)
            else:
                data = parseYoutubeDownloaderOptions(parser, verbose)

            data['kID'] = kID
            data['title'] = title
            return data
        else:
            _verbose(verbose, '[Error]')
            return None

    else:
        return None