0

A mp3 is accessible via two different URLs. I'm trying to use Python to figure out which URL is fastest to download from...?

For example, I want to time how long https://cpx.podbean.com/mf/download/a6bxxa/LAF_15min_044_mindfulness.mp3 takes to download and compare that to how long http://cpx.podbean.com/mf/play/a6bxxa/LAF_15min_044_mindfulness.mp3 takes to download.

To download the mp3 I'm currently using: urllib.request.urlretrieve(mp3_url, mp3_filename)

Alex
  • 305
  • 3
  • 8

2 Answers2

2

you could essentially do something like:

from datetime import datetime
starttime = datetime.now()
urllib.request.urlretrieve(mp3_url, mp3_filename)  # Whatever code you're using...
finishtime = datetime.now()

runtime = finishtime - starttime
print str(runtime)

this will print a timestamp like 0:03:19.356798 in the format of [hours]:[minutes]:[seconds.micro seconds]

My bad... i didn't realize you're trying to figure out which link was the fastest. I have no clue how you're storing the your mp3_url and mp3_filename elements, but try something like this (adjust accordingly):

from datetime import datetime

mp3_list = {
    'file1.mp3': 'http://www.url1.com',
    'file2.mp3': 'http://www.url2.com',
    'file3.mp3': 'http://www.url3.com',
}

runtimes = []

for mp3_url, mp3_filename in mp3_list.items():  # i'm not sure how or where you are storing mp3_url or mp3_filename, so you'll have to modify this line accordingly...
    starttime = datetime.now()
    urllib.request.urlretrieve(mp3_url, mp3_filename)  # Whatever code you're using...
    finishtime = datetime.now()
    runtime = finishtime - starttime
    runtimes.append({'runtime': runtime, 'url': mp3_url, 'filename': mp3_filename})

fastest_mp3_url = sorted(runtimes, key=lambda k: k['runtime'])[0]['url']
fastest_mp3_filename = sorted(runtimes, key=lambda k: k['runtime'])[0]['filename']

print fastest_mp3_url
print fastest_mp3_filename
crookedleaf
  • 2,118
  • 4
  • 16
  • 38
  • 1
    or just `time.time`. Or better yet, use the `timeit` module. – juanpa.arrivillaga Mar 04 '17 at 00:33
  • @juanpa.arrivillaga I've tried to do it with the timeit module but I'm having no luck... any chance you could give me an example of how to use timeit in this situation? – Alex Mar 04 '17 at 00:55
0

It's simple there are plenty of methods to do so (python3x)

  1. using win64pyinstaller with progress
from win64pyinstaller import install
install("your_url", "destination_folder_with_file_name")
  1. using urllib3 with progress modifying [PabloG's] solution which is in python 2x How to download a file over HTTP?
import urllib3
from sys import stdout
from urllib.request import urlopen

def _restart_line():
    stdout.write('\r')
    stdout.flush()
url = "your_url"

file_name = url.split('/')[-1]
u = urlopen(url)
f = open(file_name, 'wb')
meta = u.info()
file_size = int(meta.get("Content-Length"))
print(f"Downloading: {file_name} Bytes: {file_size}")

file_size_dl = 0
block_sz = 8192
while True:
    buffer = u.read(block_sz)
    if not buffer:
        break

    file_size_dl += len(buffer)
    f.write(buffer)
    status = f"done - {(file_size_dl/1000000):.2f}, {(file_size_dl * 100 / file_size):.2f} %"
    status = status + chr(8)*(len(status)+1)
    stdout.write(status)
    stdout.flush()
    _restart_line()

f.close()

there are more ways to do it, hope you got your answer thankyou!

Pranav
  • 1
  • 2