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]')
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