mirror of https://github.com/aria2/aria2
2007-11-03 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
Added the ability to display the detailed torrent file information. Now -S option gives not only a file listing, but also total download length, info hash, announce URI, piece length, the number of pieces, and mode(single or multi-torrent). * src/DefaultBtContext.{h, cc} (operator<<): New function. * src/Util.cc (toStream): Show file length in a abbreviated form(like KiB) * test/UtilTest.cc * src/main.ccpull/1/head
parent
6b7df851d3
commit
f9f388af87
12
ChangeLog
12
ChangeLog
|
@ -1,3 +1,15 @@
|
||||||
|
2007-11-03 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
|
||||||
|
|
||||||
|
Added the ability to display the detailed torrent file information.
|
||||||
|
Now -S option gives not only a file listing, but also total download
|
||||||
|
length, info hash, announce URI, piece length, the number of pieces,
|
||||||
|
and mode(single or multi-torrent).
|
||||||
|
* src/DefaultBtContext.{h, cc} (operator<<): New function.
|
||||||
|
* src/Util.cc (toStream): Show file length in a abbreviated form(like
|
||||||
|
KiB)
|
||||||
|
* test/UtilTest.cc
|
||||||
|
* src/main.cc
|
||||||
|
|
||||||
2007-10-30 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
|
2007-10-30 Tatsuhiro Tsujikawa <tujikawa at rednoah dot com>
|
||||||
|
|
||||||
Added ftp://USER:PASSWD@Servername automatic parsing.
|
Added ftp://USER:PASSWD@Servername automatic parsing.
|
||||||
|
|
|
@ -317,3 +317,28 @@ Integers DefaultBtContext::computeFastSet(const string& ipaddr, int32_t fastSetS
|
||||||
}
|
}
|
||||||
return fastSet;
|
return fastSet;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ostream& operator<<(ostream& o, const DefaultBtContext& ctx)
|
||||||
|
{
|
||||||
|
o << "*** BitTorrent File Information ***" << "\n";
|
||||||
|
o << "Mode: " << (ctx.getFileMode() == DownloadContext::SINGLE ? "Single File Torrent":"Multi File Torrent") << "\n";
|
||||||
|
o << "Announce:" << "\n";
|
||||||
|
AnnounceTiers tiers = ctx.getAnnounceTiers();
|
||||||
|
for(AnnounceTiers::const_iterator itr = tiers.begin(); itr != tiers.end(); ++itr) {
|
||||||
|
const AnnounceTierHandle& tier = *itr;
|
||||||
|
for(Strings::const_iterator uriItr = tier->urls.begin(); uriItr != tier->urls.end(); ++uriItr) {
|
||||||
|
o << " " << *uriItr;
|
||||||
|
}
|
||||||
|
o << "\n";
|
||||||
|
}
|
||||||
|
o << "Info Hash: " << ctx.getInfoHashAsString() << "\n";
|
||||||
|
o << "Piece Length: " << Util::abbrevSize(ctx.getPieceLength()) << "B\n";
|
||||||
|
o << "The Number of Pieces: " << ctx.getNumPieces() << "\n";
|
||||||
|
o << "Total Length: " << Util::abbrevSize(ctx.getTotalLength()) << "B\n";
|
||||||
|
if(ctx.getFileMode() == DownloadContext::MULTI) {
|
||||||
|
o << "Name: " << ctx.getName() << "\n";
|
||||||
|
}
|
||||||
|
Util::toStream(o, ctx.getFileEntries());
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -149,6 +149,8 @@ private:
|
||||||
{
|
{
|
||||||
_ownerRequestGroup = owner;
|
_ownerRequestGroup = owner;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
friend ostream& operator<<(ostream& o, const DefaultBtContext& ctx);
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef SharedHandle<DefaultBtContext> DefaultBtContextHandle;
|
typedef SharedHandle<DefaultBtContext> DefaultBtContextHandle;
|
||||||
|
|
|
@ -653,7 +653,7 @@ void Util::toStream(ostream& os, const FileEntries& fileEntries)
|
||||||
for(FileEntries::const_iterator itr = fileEntries.begin();
|
for(FileEntries::const_iterator itr = fileEntries.begin();
|
||||||
itr != fileEntries.end(); count++, itr++) {
|
itr != fileEntries.end(); count++, itr++) {
|
||||||
os << setw(3) << count << "|" << (*itr)->getPath() << "\n";
|
os << setw(3) << count << "|" << (*itr)->getPath() << "\n";
|
||||||
os << " |" << Util::llitos((*itr)->getLength(), true) << " bytes" << "\n";
|
os << " |" << Util::abbrevSize((*itr)->getLength()) << "B" << "\n";
|
||||||
os << "---+---------------------------------------------------------------------------" << "\n";
|
os << "---+---------------------------------------------------------------------------" << "\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
197
src/main.cc
197
src/main.cc
|
@ -114,6 +114,104 @@ RequestGroupHandle createRequestGroup(const Option* op, const Strings& uris,
|
||||||
|
|
||||||
extern Option* option_processing(int argc, char* const argv[]);
|
extern Option* option_processing(int argc, char* const argv[]);
|
||||||
|
|
||||||
|
void downloadBitTorrent(Option* op, const Strings& uri)
|
||||||
|
{
|
||||||
|
Strings nargs;
|
||||||
|
if(op->get(PREF_PARAMETERIZED_URI) == V_TRUE) {
|
||||||
|
nargs = unfoldURI(uri);
|
||||||
|
} else {
|
||||||
|
nargs = uri;
|
||||||
|
}
|
||||||
|
Strings xargs;
|
||||||
|
ncopy(nargs.begin(), nargs.end(), op->getAsInt(PREF_SPLIT),
|
||||||
|
back_inserter(xargs));
|
||||||
|
|
||||||
|
RequestGroupHandle rg = new RequestGroup(op, xargs);
|
||||||
|
DefaultBtContextHandle btContext = new DefaultBtContext();
|
||||||
|
btContext->load(op->get(PREF_TORRENT_FILE));
|
||||||
|
if(op->defined(PREF_PEER_ID_PREFIX)) {
|
||||||
|
btContext->setPeerIdPrefix(op->get(PREF_PEER_ID_PREFIX));
|
||||||
|
}
|
||||||
|
btContext->setDir(op->get(PREF_DIR));
|
||||||
|
rg->setDownloadContext(btContext);
|
||||||
|
btContext->setOwnerRequestGroup(rg.get());
|
||||||
|
|
||||||
|
RequestGroups groups;
|
||||||
|
groups.push_back(rg);
|
||||||
|
MultiUrlRequestInfo(groups, op).execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
void downloadMetalink(Option* op)
|
||||||
|
{
|
||||||
|
RequestGroups groups = Metalink2RequestGroup(op).generate(op->get(PREF_METALINK_FILE));
|
||||||
|
if(groups.empty()) {
|
||||||
|
throw new FatalException("No files to download.");
|
||||||
|
}
|
||||||
|
MultiUrlRequestInfo(groups, op).execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
void downloadUriList(Option* op)
|
||||||
|
{
|
||||||
|
SharedHandle<UriListParser> flparser(0);
|
||||||
|
if(op->get(PREF_INPUT_FILE) == "-") {
|
||||||
|
flparser = new StreamUriListParser(cin);
|
||||||
|
} else {
|
||||||
|
if(!File(op->get(PREF_INPUT_FILE)).isFile()) {
|
||||||
|
throw new FatalException(EX_FILE_OPEN, op->get(PREF_INPUT_FILE).c_str(), "No such file");
|
||||||
|
}
|
||||||
|
flparser = new FileUriListParser(op->get(PREF_INPUT_FILE));
|
||||||
|
}
|
||||||
|
RequestGroups groups;
|
||||||
|
while(flparser->hasNext()) {
|
||||||
|
Strings uris = flparser->next();
|
||||||
|
if(uris.size() == 1 && op->get(PREF_PARAMETERIZED_URI) == V_TRUE) {
|
||||||
|
Strings unfoldedURIs = unfoldURI(uris);
|
||||||
|
for(Strings::const_iterator itr = unfoldedURIs.begin();
|
||||||
|
itr != unfoldedURIs.end(); ++itr) {
|
||||||
|
Strings xuris;
|
||||||
|
ncopy(itr, itr+1, op->getAsInt(PREF_SPLIT), back_inserter(xuris));
|
||||||
|
RequestGroupHandle rg = createRequestGroup(op, xuris);
|
||||||
|
groups.push_back(rg);
|
||||||
|
}
|
||||||
|
} else if(uris.size() > 0) {
|
||||||
|
Strings xuris;
|
||||||
|
ncopy(uris.begin(), uris.end(), op->getAsInt(PREF_SPLIT),
|
||||||
|
back_inserter(xuris));
|
||||||
|
RequestGroupHandle rg = createRequestGroup(op, xuris);
|
||||||
|
groups.push_back(rg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
MultiUrlRequestInfo(groups, op).execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
void downloadUri(Option* op, const Strings& uris)
|
||||||
|
{
|
||||||
|
Strings nargs;
|
||||||
|
if(op->get(PREF_PARAMETERIZED_URI) == V_TRUE) {
|
||||||
|
nargs = unfoldURI(uris);
|
||||||
|
} else {
|
||||||
|
nargs = uris;
|
||||||
|
}
|
||||||
|
RequestGroups groups;
|
||||||
|
if(op->get(PREF_FORCE_SEQUENTIAL) == V_TRUE) {
|
||||||
|
for(Strings::const_iterator itr = nargs.begin();
|
||||||
|
itr != nargs.end(); ++itr) {
|
||||||
|
Strings xuris;
|
||||||
|
ncopy(itr, itr+1, op->getAsInt(PREF_SPLIT),
|
||||||
|
back_inserter(xuris));
|
||||||
|
RequestGroupHandle rg = createRequestGroup(op, xuris);
|
||||||
|
groups.push_back(rg);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Strings xargs;
|
||||||
|
ncopy(nargs.begin(), nargs.end(), op->getAsInt(PREF_SPLIT),
|
||||||
|
back_inserter(xargs));
|
||||||
|
RequestGroupHandle rg = createRequestGroup(op, xargs, op->get(PREF_OUT));
|
||||||
|
groups.push_back(rg);
|
||||||
|
}
|
||||||
|
MultiUrlRequestInfo(groups, op).execute();
|
||||||
|
}
|
||||||
|
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char* argv[]) {
|
||||||
#ifdef HAVE_WINSOCK2_H
|
#ifdef HAVE_WINSOCK2_H
|
||||||
Platform platform;
|
Platform platform;
|
||||||
|
@ -188,110 +286,29 @@ int main(int argc, char* argv[]) {
|
||||||
Util::setGlobalSignalHandler(SIGPIPE, SIG_IGN, 0);
|
Util::setGlobalSignalHandler(SIGPIPE, SIG_IGN, 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
MultiUrlRequestInfo* firstReqInfo;
|
|
||||||
// TODO added _X for test. Please remove this later on.
|
|
||||||
#ifdef ENABLE_BITTORRENT
|
#ifdef ENABLE_BITTORRENT
|
||||||
if(op->defined(PREF_TORRENT_FILE)) {
|
if(op->defined(PREF_TORRENT_FILE)) {
|
||||||
Strings nargs;
|
if(op->get(PREF_SHOW_FILES) == V_TRUE) {
|
||||||
if(op->get(PREF_PARAMETERIZED_URI) == V_TRUE) {
|
DefaultBtContextHandle btContext = new DefaultBtContext();
|
||||||
nargs = unfoldURI(args);
|
btContext->load(op->get(PREF_TORRENT_FILE));
|
||||||
|
cout << btContext << endl;
|
||||||
} else {
|
} else {
|
||||||
nargs = args;
|
downloadBitTorrent(op, args);
|
||||||
}
|
}
|
||||||
Strings xargs;
|
|
||||||
ncopy(nargs.begin(), nargs.end(), op->getAsInt(PREF_SPLIT),
|
|
||||||
back_inserter(xargs));
|
|
||||||
|
|
||||||
RequestGroupHandle rg = new RequestGroup(op, xargs);
|
|
||||||
DefaultBtContextHandle btContext = new DefaultBtContext();
|
|
||||||
btContext->load(op->get(PREF_TORRENT_FILE));
|
|
||||||
if(op->defined(PREF_PEER_ID_PREFIX)) {
|
|
||||||
btContext->setPeerIdPrefix(op->get(PREF_PEER_ID_PREFIX));
|
|
||||||
}
|
|
||||||
btContext->setDir(op->get(PREF_DIR));
|
|
||||||
rg->setDownloadContext(btContext);
|
|
||||||
btContext->setOwnerRequestGroup(rg.get());
|
|
||||||
|
|
||||||
RequestGroups groups;
|
|
||||||
groups.push_back(rg);
|
|
||||||
firstReqInfo = new MultiUrlRequestInfo(groups, op);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif // ENABLE_BITTORRENT
|
#endif // ENABLE_BITTORRENT
|
||||||
#ifdef ENABLE_METALINK
|
#ifdef ENABLE_METALINK
|
||||||
if(op->defined(PREF_METALINK_FILE)) {
|
if(op->defined(PREF_METALINK_FILE)) {
|
||||||
RequestGroups groups = Metalink2RequestGroup(op).generate(op->get(PREF_METALINK_FILE));
|
downloadMetalink(op);
|
||||||
if(groups.empty()) {
|
|
||||||
throw new FatalException("No files to download.");
|
|
||||||
}
|
|
||||||
firstReqInfo = new MultiUrlRequestInfo(groups, op);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
#endif // ENABLE_METALINK
|
#endif // ENABLE_METALINK
|
||||||
if(op->defined(PREF_INPUT_FILE)) {
|
if(op->defined(PREF_INPUT_FILE)) {
|
||||||
SharedHandle<UriListParser> flparser(0);
|
downloadUriList(op);
|
||||||
if(op->get(PREF_INPUT_FILE) == "-") {
|
} else {
|
||||||
flparser = new StreamUriListParser(cin);
|
downloadUri(op, args);
|
||||||
} else {
|
|
||||||
if(!File(op->get(PREF_INPUT_FILE)).isFile()) {
|
|
||||||
throw new FatalException(EX_FILE_OPEN, op->get(PREF_INPUT_FILE).c_str(), "No such file");
|
|
||||||
}
|
|
||||||
flparser = new FileUriListParser(op->get(PREF_INPUT_FILE));
|
|
||||||
}
|
|
||||||
RequestGroups groups;
|
|
||||||
while(flparser->hasNext()) {
|
|
||||||
Strings uris = flparser->next();
|
|
||||||
if(uris.size() == 1 && op->get(PREF_PARAMETERIZED_URI) == V_TRUE) {
|
|
||||||
Strings unfoldedURIs = unfoldURI(uris);
|
|
||||||
for(Strings::const_iterator itr = unfoldedURIs.begin();
|
|
||||||
itr != unfoldedURIs.end(); ++itr) {
|
|
||||||
Strings xuris;
|
|
||||||
ncopy(itr, itr+1, op->getAsInt(PREF_SPLIT), back_inserter(xuris));
|
|
||||||
RequestGroupHandle rg = createRequestGroup(op, xuris);
|
|
||||||
groups.push_back(rg);
|
|
||||||
}
|
|
||||||
} else if(uris.size() > 0) {
|
|
||||||
Strings xuris;
|
|
||||||
ncopy(uris.begin(), uris.end(), op->getAsInt(PREF_SPLIT),
|
|
||||||
back_inserter(xuris));
|
|
||||||
RequestGroupHandle rg = createRequestGroup(op, xuris);
|
|
||||||
groups.push_back(rg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
firstReqInfo = new MultiUrlRequestInfo(groups, op);
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
Strings nargs;
|
|
||||||
if(op->get(PREF_PARAMETERIZED_URI) == V_TRUE) {
|
|
||||||
nargs = unfoldURI(args);
|
|
||||||
} else {
|
|
||||||
nargs = args;
|
|
||||||
}
|
|
||||||
if(op->get(PREF_FORCE_SEQUENTIAL) == V_TRUE) {
|
|
||||||
RequestGroups groups;
|
|
||||||
for(Strings::const_iterator itr = nargs.begin();
|
|
||||||
itr != nargs.end(); ++itr) {
|
|
||||||
Strings xuris;
|
|
||||||
ncopy(itr, itr+1, op->getAsInt(PREF_SPLIT),
|
|
||||||
back_inserter(xuris));
|
|
||||||
RequestGroupHandle rg = createRequestGroup(op, xuris);
|
|
||||||
groups.push_back(rg);
|
|
||||||
}
|
|
||||||
firstReqInfo = new MultiUrlRequestInfo(groups, op);
|
|
||||||
} else {
|
|
||||||
Strings xargs;
|
|
||||||
ncopy(nargs.begin(), nargs.end(), op->getAsInt(PREF_SPLIT),
|
|
||||||
back_inserter(xargs));
|
|
||||||
RequestGroupHandle rg = createRequestGroup(op, xargs, op->get(PREF_OUT));
|
|
||||||
RequestGroups groups;
|
|
||||||
groups.push_back(rg);
|
|
||||||
firstReqInfo = new MultiUrlRequestInfo(groups, op);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
firstReqInfo->execute();
|
|
||||||
|
|
||||||
} catch(Exception* ex) {
|
} catch(Exception* ex) {
|
||||||
cerr << EX_EXCEPTION_CAUGHT << "\n" << ex->getMsg() << endl;
|
cerr << EX_EXCEPTION_CAUGHT << "\n" << ex->getMsg() << endl;
|
||||||
delete ex;
|
delete ex;
|
||||||
|
|
|
@ -318,10 +318,10 @@ void UtilTest::testToStream()
|
||||||
"idx|path/length\n"
|
"idx|path/length\n"
|
||||||
"===+===========================================================================\n"
|
"===+===========================================================================\n"
|
||||||
" 1|aria2.tar.bz2\n"
|
" 1|aria2.tar.bz2\n"
|
||||||
" |12,300 bytes\n"
|
" |12.0KiB\n"
|
||||||
"---+---------------------------------------------------------------------------\n"
|
"---+---------------------------------------------------------------------------\n"
|
||||||
" 2|aria2.txt\n"
|
" 2|aria2.txt\n"
|
||||||
" |556 bytes\n"
|
" |556B\n"
|
||||||
"---+---------------------------------------------------------------------------\n"),
|
"---+---------------------------------------------------------------------------\n"),
|
||||||
os.str());
|
os.str());
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue