title: Save streaming audio from URL as MP3, or even just audio file from URL as MP3
body: <p>I am trying to have my server, in python 3, go grab files from URLs. Specifically, I would like to pass a URL into a function, I would like the function to go grab an audio file(of many varying formats) and save it as an MP3, probably using ffmpeg or ffmpy. If the URL also has a PDF, I would also like to save that, as a PDF. I haven't done much research on the PDF yet, but I have been working on the audio piece and wasn't sure if this was even possible.</p>
  
  <p>I have looked at several questions here, but most notably;
  <a href="https://stackoverflow.com/questions/22676/how-do-i-download-a-file-over-http-using-python">How do I download a file over HTTP using Python?</a></p>
  
  <p>It's a little old but I tried several methods in there and always get some sort of issue. I have tried using the requests library, urllib, streamripper, and maybe one other.</p>
  
  <p>Is there a way to do this and with a recommended library?</p>
  
  <p>For example, most of the ones I have tried do save something, like the html page, or an empty file called 'file.mp3' in this case. </p>
  
  <p>Streamripper received a try changing user agents error.</p>
  
  <p>I am not sure if this is possible, but I am sure there is something I'm not understanding here, could someone point me in the right direction?</p>
  
  <p>This isn't necessarily the code I'm trying to use, just an example of something I have used that doesn't work.</p>
  
  <pre><code>import requests
  
  url = "http://someurl.com/webcast/something"
  r = requests.get(url)
  
  with open('file.mp3', 'wb') as f:
      f.write(r.content)
  
  # Retrieve HTTP meta-data
  print(r.status_code)
  print(r.headers['content-type'])
  print(r.encoding)
  </code></pre>
  
  <p>**Edit</p>
  
  <pre><code>import requests
  import ffmpy
  import datetime
  import os
  
  ## THIS SCRIPT CAN BE PASSED A URL AND IF THE URL RETURNS
  ## HTTP HEADER FOR CONTENT TYPE AUDIO/MPEG, THE FILE WILL
  ## BE SAVED AS THE CURRENT-DATE-AND-TIME.MP3
  ##
  ## THIS SCRIPT CAN BE PASSED A URL AND IF THE URL RETURNS
  ## HTTP HEADER FOR CONTENT TYPE application/pdf, THE FILE WILL
  ## BE SAVED AS THE CURRENT-DATE-AND-TIME.PDF
  ##
  ## THIS SCRIPT CAN BE PASSED A URL AND IF THE URL RETURNS
  ## HTTP HEADER FOR CONTENT TYPE other than application/pdf, OR
  ## audio/mpeg, THE FILE WILL NOT BE SAVED
  
  def BordersPythonDownloader(url):
      print('Beginning file download requests')
      r = requests.get(url, stream=True)
      contype = r.headers['content-type']
      if contype == "audio/mpeg":        
      print("audio file")
          filename = '[{}].mp3'.format(str(datetime.datetime.now()))
          with open('file.mp3', 'wb+') as f:
              f.write(r.content)
          ff = ffmpy.FFmpeg(
              inputs={'file.mp3': None},
              outputs={filename: None}
          )
          ff.run()
          if os.path.exists('file.mp3'):
              os.remove('file.mp3')
      elif contype == "application/pdf":
          print("pdf file")
          filename = '[{}].pdf'.format(str(datetime.datetime.now()))
          with open(filename, 'wb+') as f:
              f.write(r.content)
      else:
          print("URL DID NOT RETURN AN AUDIO OR PDF FILE, IT RETURNED {}".format(contype))
  
  
  # INSERT YOUR URL FOR TESTING
  # OR CALL THIS SCRIPT FROM ELSEWHERE, PASSING IT THE URL
  
  #DEFINE YOUR URL
  #url = 'http://archive.org/download/testmp3testfile/mpthreetest.mp3'
  
  #CALL THE SCRIPT; PASSING IT YOUR URL
  #x = BordersPythonDownloader(url)
  
  #ANOTHER EXAMPLE WITH A PDF
  #url = 'https://www.cisco.com/c/en/us/td/docs/switches/lan/catalyst6500/ios/12-2SY/configuration/guide/sy_swcg/etherchannel.pdf'
  #x = BordersPythonDownloader(url)
  </code></pre>
  
  <p>Thanks Richard, this code works and helps me understand this better. Any suggestions for improving the above working example?</p>