Alex
Alex

Reputation: 315

How can I use Python to time how long a mp3 takes to download from website?

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)

Upvotes: 0

Views: 93

Answers (2)

Pranav
Pranav

Reputation: 1

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!

Upvotes: 0

crookedleaf
crookedleaf

Reputation: 2198

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

Upvotes: 2

Related Questions