title: Downloading Multiple torrent files with Libtorrent in Python
body: <p>I'm trying to write a torrent application that can take in a list of magnet links and then download them all together. I've been trying to read and understand the documentation at <a href="https://libtorrent.org/manual.html" rel="nofollow noreferrer">Libtorrent</a> but I haven't been able to tell if what I try works or not. I've managed to be able to apply a SOCKS5 proxy to a Libtorrent session and download a single magnet link using this code:</p>
  
  <pre><code>import libtorrent as lt
  import time
  import os
  
  ses = lt.session()
  r = lt.proxy_settings()
  r.hostname = "proxy_info"
  r.username = "proxy_info"
  r.password = "proxy_info"
  r.port = 1080
  r.type = lt.proxy_type_t.socks5_pw
  ses.set_peer_proxy(r)
  ses.set_web_seed_proxy(r)
  ses.set_proxy(r)
  t = ses.settings()
  t.force_proxy = True
  t.proxy_peer_connections = True
  t.anonymous_mode = True
  ses.set_settings(t)
  print(ses.get_settings())
  ses.peer_proxy()
  ses.web_seed_proxy()
  ses.set_settings(t)
  
  magnet_link = "magnet"
  
  params = {
  "save_path": os.getcwd() + r"\torrents",
  "storage_mode": lt.storage_mode_t.storage_mode_sparse,
  "url": magnet_link
  }
  
  handle = lt.add_magnet_uri(ses, magnet_link, params)
  ses.start_dht()
  
  print('downloading metadata...')
  while not handle.has_metadata():
      time.sleep(1)
      print('got metadata, starting torrent download...')
  while handle.status().state != lt.torrent_status.seeding:
      s = handle.status()
      state_str = ['queued', 'checking', 'downloading metadata', 'downloading', 'finished', 'seeding', 'allocating']
      print('%.2f%% complete (down: %.1f kb/s up: %.1f kB/s peers: %d) %s' % (s.progress * 100, s.download_rate / 1000, s.upload_rate / 1000, s.num_peers, state_str[s.state]))
      time.sleep(5)
  </code></pre>
  
  <p>This is great and all for runing on its own with a single link. What I want to do is something like this:</p>
  
  <pre><code>def torrent_download(magnetic_link_list):
      for mag in range(len(magnetic_link_list)):
          handle = lt.add_magnet_uri(ses, magnetic_link_list[mag], params)
  
      #Then download all the files
      #Once all files complete, stop the torrents so they dont seed.
  
      return torrent_name_list
  </code></pre>
  
  <p>I'm not sure if this is even on the right track or not, but some pointers would be helpful.</p>
  
  <p>UPDATE: This is what I now have and it works fine in my case</p>
  
  <pre><code>def magnet2torrent(magnet_link):
      global LIBTORRENT_SESSION, TORRENT_HANDLES
      if LIBTORRENT_SESSION is None and TORRENT_HANDLES is None:
          TORRENT_HANDLES = []
          settings = lt.default_settings()
          settings['proxy_hostname'] = CONFIG_DATA["PROXY"]["HOST"]
          settings['proxy_username'] = CONFIG_DATA["PROXY"]["USERNAME"]
          settings['proxy_password'] = CONFIG_DATA["PROXY"]["PASSWORD"]
          settings['proxy_port'] = CONFIG_DATA["PROXY"]["PORT"]
          settings['proxy_type'] = CONFIG_DATA["PROXY"]["TYPE"]
          settings['force_proxy'] = True
          settings['anonymous_mode'] = True
  
          LIBTORRENT_SESSION = lt.session(settings)
  
      params = {
          "save_path": os.getcwd() + r"/torrents",
          "storage_mode": lt.storage_mode_t.storage_mode_sparse,
          "url": magnet_link
          }
  
      TORRENT_HANDLES.append(LIBTORRENT_SESSION.add_torrent(params))
  
  
  def check_torrents():
      global TORRENT_HANDLES
      for torrent in range(len(TORRENT_HANDLES)):
          print(TORRENT_HANDLES[torrent].status().is_seeding)
  </code></pre>