v4.1
This commit is contained in:
-130
@@ -1,130 +0,0 @@
|
|||||||
import nodriver as uc
|
|
||||||
import asyncio
|
|
||||||
|
|
||||||
async def download_deezer_track(deezer_link=None, initial_delay=7.5):
|
|
||||||
if deezer_link is None:
|
|
||||||
deezer_link = "https://www.deezer.com/us/track/2947516331"
|
|
||||||
|
|
||||||
browser = None
|
|
||||||
try:
|
|
||||||
browser = await uc.start(headless=False)
|
|
||||||
page = await browser.get("https://deezmate.com/en")
|
|
||||||
|
|
||||||
print("Loading...")
|
|
||||||
await asyncio.sleep(initial_delay)
|
|
||||||
|
|
||||||
input_selector = 'input[placeholder="Paste your Deezer link here..."]'
|
|
||||||
await page.wait_for(input_selector, timeout=15)
|
|
||||||
input_element = await page.select(input_selector)
|
|
||||||
await input_element.clear_input()
|
|
||||||
await input_element.send_keys(deezer_link)
|
|
||||||
print("Link entered")
|
|
||||||
|
|
||||||
await page.evaluate("""
|
|
||||||
window.apiResponse = null;
|
|
||||||
window.originalFetch = window.fetch;
|
|
||||||
window.fetch = function(...args) {
|
|
||||||
return window.originalFetch(...args).then(async response => {
|
|
||||||
if (response.url.includes('api.deezmate.com/dl/')) {
|
|
||||||
try {
|
|
||||||
const data = await response.clone().json();
|
|
||||||
window.apiResponse = data;
|
|
||||||
console.log('Captured API response:', data);
|
|
||||||
} catch (e) {
|
|
||||||
console.log('Error parsing API response:', e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return response;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
""")
|
|
||||||
|
|
||||||
max_retries = 3
|
|
||||||
download_button_clicked = False
|
|
||||||
|
|
||||||
for attempt in range(max_retries):
|
|
||||||
try:
|
|
||||||
download_button_selector = 'button.bg-purple.hover\\:bg-purple-dark.cursor-pointer.transition.text-white.rounded-xl.p-2.mt-2.w-full.mb-5'
|
|
||||||
await page.wait_for(download_button_selector, timeout=15)
|
|
||||||
download_button = await page.select(download_button_selector)
|
|
||||||
await download_button.click()
|
|
||||||
print("Processing...")
|
|
||||||
download_button_clicked = True
|
|
||||||
break
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
if attempt < max_retries - 1:
|
|
||||||
print(f"Turnstile verification failed, retrying... ({attempt + 1}/{max_retries})")
|
|
||||||
await asyncio.sleep(0.5)
|
|
||||||
await page.evaluate("window.apiResponse = null;")
|
|
||||||
else:
|
|
||||||
print("Failed to pass Turnstile verification after all retries")
|
|
||||||
raise e
|
|
||||||
|
|
||||||
if not download_button_clicked:
|
|
||||||
return None
|
|
||||||
|
|
||||||
try:
|
|
||||||
track_download_selector = 'button.bg-purple.text-white.flex.items-center.gap-2.px-3.py-1.rounded-full.hover\\:bg-purple-dark.transition'
|
|
||||||
await page.wait_for(track_download_selector, timeout=15)
|
|
||||||
track_download_button = await page.select(track_download_selector)
|
|
||||||
await track_download_button.click()
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Failed to click track download button: {e}")
|
|
||||||
return None
|
|
||||||
|
|
||||||
print("Getting FLAC URL from API response...")
|
|
||||||
|
|
||||||
api_response = None
|
|
||||||
for i in range(30):
|
|
||||||
api_response = await page.evaluate("window.apiResponse")
|
|
||||||
if api_response:
|
|
||||||
break
|
|
||||||
await asyncio.sleep(0.2)
|
|
||||||
|
|
||||||
if not api_response:
|
|
||||||
return None
|
|
||||||
|
|
||||||
def parse_nodriver_response(data):
|
|
||||||
if isinstance(data, list):
|
|
||||||
result = {}
|
|
||||||
for item in data:
|
|
||||||
if isinstance(item, list) and len(item) == 2:
|
|
||||||
key = item[0]
|
|
||||||
value_obj = item[1]
|
|
||||||
if isinstance(value_obj, dict) and 'value' in value_obj:
|
|
||||||
if value_obj.get('type') == 'object':
|
|
||||||
result[key] = parse_nodriver_response(value_obj['value'])
|
|
||||||
else:
|
|
||||||
result[key] = value_obj['value']
|
|
||||||
return result
|
|
||||||
return data
|
|
||||||
|
|
||||||
parsed_response = parse_nodriver_response(api_response)
|
|
||||||
|
|
||||||
if parsed_response.get('success') and parsed_response.get('links'):
|
|
||||||
flac_url = parsed_response['links'].get('flac')
|
|
||||||
if flac_url:
|
|
||||||
print(f"Successfully obtained FLAC download URL: {flac_url}")
|
|
||||||
return flac_url
|
|
||||||
|
|
||||||
return None
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Error: {e}")
|
|
||||||
return None
|
|
||||||
finally:
|
|
||||||
if browser:
|
|
||||||
try:
|
|
||||||
await browser.stop()
|
|
||||||
except:
|
|
||||||
pass
|
|
||||||
|
|
||||||
async def main(deezer_link=None, initial_delay=7.5):
|
|
||||||
flac_url = await download_deezer_track(deezer_link, initial_delay)
|
|
||||||
if not flac_url:
|
|
||||||
print("Failed to download track")
|
|
||||||
return flac_url
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
uc.loop().run_until_complete(main())
|
|
||||||
Reference in New Issue
Block a user