mirror of https://github.com/aria2/aria2
				
				
				
			
		
			
				
	
	
		
			145 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C++
		
	
	
			
		
		
	
	
			145 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			C++
		
	
	
/* <!-- copyright */
 | 
						|
/*
 | 
						|
 * aria2 - The high speed download utility
 | 
						|
 *
 | 
						|
 * Copyright (C) 2013 Tatsuhiro Tsujikawa
 | 
						|
 *
 | 
						|
 * This program is free software; you can redistribute it and/or modify
 | 
						|
 * it under the terms of the GNU General Public License as published by
 | 
						|
 * the Free Software Foundation; either version 2 of the License, or
 | 
						|
 * (at your option) any later version.
 | 
						|
 *
 | 
						|
 * This program is distributed in the hope that it will be useful,
 | 
						|
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 | 
						|
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | 
						|
 * GNU General Public License for more details.
 | 
						|
 *
 | 
						|
 * You should have received a copy of the GNU General Public License
 | 
						|
 * along with this program; if not, write to the Free Software
 | 
						|
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 | 
						|
 *
 | 
						|
 * In addition, as a special exception, the copyright holders give
 | 
						|
 * permission to link the code of portions of this program with the
 | 
						|
 * OpenSSL library under certain conditions as described in each
 | 
						|
 * individual source file, and distribute linked combinations
 | 
						|
 * including the two.
 | 
						|
 * You must obey the GNU General Public License in all respects
 | 
						|
 * for all of the code used other than OpenSSL.  If you modify
 | 
						|
 * file(s) with this exception, you may extend this exception to your
 | 
						|
 * version of the file(s), but you are not obligated to do so.  If you
 | 
						|
 * do not wish to do so, delete this exception statement from your
 | 
						|
 * version.  If you delete this exception statement from all source
 | 
						|
 * files in the program, then also delete it here.
 | 
						|
 */
 | 
						|
/* copyright --> */
 | 
						|
//
 | 
						|
// Compile and link like this:
 | 
						|
// $ g++ -Wall -O2 -g -std=c++11 -o libaria2ex libaria2ex.cc -laria2
 | 
						|
#include <iostream>
 | 
						|
#include <chrono>
 | 
						|
 | 
						|
#include <aria2/aria2.h>
 | 
						|
 | 
						|
int downloadEventCallback(aria2::Session* session, aria2::DownloadEvent event,
 | 
						|
                          aria2::A2Gid gid, void* userData)
 | 
						|
{
 | 
						|
  switch(event) {
 | 
						|
  case aria2::EVENT_ON_DOWNLOAD_COMPLETE:
 | 
						|
    std::cerr << "COMPLETE";
 | 
						|
    break;
 | 
						|
  case aria2::EVENT_ON_DOWNLOAD_ERROR:
 | 
						|
    std::cerr << "ERROR";
 | 
						|
    break;
 | 
						|
  default:
 | 
						|
    return 0;
 | 
						|
  }
 | 
						|
  std::cerr << " [" << aria2::gidToHex(gid) << "] ";
 | 
						|
  aria2::DownloadHandle* dh = aria2::getDownloadHandle(session, gid);
 | 
						|
  if(!dh) return 0;
 | 
						|
  if(dh->getNumFiles() > 0) {
 | 
						|
    aria2::FileData f = dh->getFile(1);
 | 
						|
    // Path may be empty if the file name has not been determined yet.
 | 
						|
    if(f.path.empty()) {
 | 
						|
      if(!f.uris.empty()) {
 | 
						|
        std::cerr << f.uris[0].uri;
 | 
						|
      }
 | 
						|
    } else {
 | 
						|
      std::cerr << f.path;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  aria2::deleteDownloadHandle(dh);
 | 
						|
  std::cerr << std::endl;
 | 
						|
  return 0;
 | 
						|
}
 | 
						|
 | 
						|
int main(int argc, char** argv)
 | 
						|
{
 | 
						|
  int rv;
 | 
						|
  if(argc < 2) {
 | 
						|
    std::cerr << "Usage: libaria2ex URI [URI...]\n"
 | 
						|
              << "\n"
 | 
						|
              << "  Download given URIs in parallel in the current directory."
 | 
						|
              << std::endl;
 | 
						|
    exit(EXIT_SUCCESS);
 | 
						|
  }
 | 
						|
  aria2::libraryInit();
 | 
						|
  // session is actually singleton: 1 session per process
 | 
						|
  aria2::Session* session;
 | 
						|
  // Create default configuration. The libaria2 takes care of signal
 | 
						|
  // handling.
 | 
						|
  aria2::SessionConfig config;
 | 
						|
  // Add event callback
 | 
						|
  config.downloadEventCallback = downloadEventCallback;
 | 
						|
  session = aria2::sessionNew(aria2::KeyVals(), config);
 | 
						|
  // Add download item to session
 | 
						|
  for(int i = 1; i < argc; ++i) {
 | 
						|
    std::vector<std::string> uris = {argv[i]};
 | 
						|
    aria2::KeyVals options;
 | 
						|
    rv = aria2::addUri(session, nullptr, uris, options);
 | 
						|
    if(rv < 0) {
 | 
						|
      std::cerr << "Failed to add download " << uris[0] << std::endl;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  auto start = std::chrono::steady_clock::now();
 | 
						|
  for(;;) {
 | 
						|
    rv = aria2::run(session, aria2::RUN_ONCE);
 | 
						|
    if(rv != 1) {
 | 
						|
      break;
 | 
						|
    }
 | 
						|
    // the application can call aria2 API to add URI or query progress
 | 
						|
    // here
 | 
						|
    auto now = std::chrono::steady_clock::now();
 | 
						|
    auto count = std::chrono::duration_cast<std::chrono::milliseconds>
 | 
						|
      (now - start).count();
 | 
						|
    // Print progress information once per 500ms
 | 
						|
    if(count >= 500) {
 | 
						|
      start = now;
 | 
						|
      aria2::GlobalStat gstat = aria2::getGlobalStat(session);
 | 
						|
      std::cerr << "Overall #Active:" << gstat.numActive
 | 
						|
                << " #waiting:" << gstat.numWaiting
 | 
						|
                << " D:" << gstat.downloadSpeed/1024 << "KiB/s"
 | 
						|
                << " U:"<< gstat.uploadSpeed/1024 << "KiB/s " << std::endl;
 | 
						|
      std::vector<aria2::A2Gid> gids = aria2::getActiveDownload(session);
 | 
						|
      for(const auto& gid : gids) {
 | 
						|
        aria2::DownloadHandle* dh = aria2::getDownloadHandle(session, gid);
 | 
						|
        if(dh) {
 | 
						|
          std::cerr << "    [" << aria2::gidToHex(gid) << "] "
 | 
						|
                    << dh->getCompletedLength() << "/"
 | 
						|
                    << dh->getTotalLength() << "("
 | 
						|
                    << (dh->getTotalLength() > 0 ?
 | 
						|
                        (100*dh->getCompletedLength()/dh->getTotalLength())
 | 
						|
                        : 0) << "%)"
 | 
						|
                    << " D:"
 | 
						|
                    << dh->getDownloadSpeed()/1024 << "KiB/s, U:"
 | 
						|
                    << dh->getUploadSpeed()/1024 << "KiB/s"
 | 
						|
                    << std::endl;
 | 
						|
          aria2::deleteDownloadHandle(dh);
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
  }
 | 
						|
  rv = aria2::sessionFinal(session);
 | 
						|
  aria2::libraryDeinit();
 | 
						|
  return rv;
 | 
						|
}
 |