2009-12-10 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>

Print Magnet URI in -S output.
	* src/AnnounceList.cc
	* src/bittorrent_helper.cc
	* src/bittorrent_helper.h
	* test/BittorrentHelperTest.cc
pull/1/head
Tatsuhiro Tsujikawa 2009-12-10 12:52:59 +00:00
parent e80079c9b6
commit 6c3a3fefa2
5 changed files with 70 additions and 5 deletions

View File

@ -1,3 +1,11 @@
2009-12-10 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Print Magnet URI in -S output.
* src/AnnounceList.cc
* src/bittorrent_helper.cc
* src/bittorrent_helper.h
* test/BittorrentHelperTest.cc
2009-12-10 Tatsuhiro Tsujikawa <t-tujikawa@users.sourceforge.net>
Added --bt-prioritize-piece option to aria2rpc.

View File

@ -73,7 +73,7 @@ void AnnounceList::reconfigure(const BDE& announceList)
elemItr != elemList.listEnd(); ++elemItr) {
const BDE& data = *elemItr;
if(data.isString()) {
urls.push_back(util::trim(data.s()));
urls.push_back(data.s());
}
}
if(!urls.empty()) {

View File

@ -304,12 +304,22 @@ static void extractAnnounce(BDE& torrent, const BDE& rootDict)
const BDE& announceList = rootDict[C_ANNOUNCE_LIST];
if(announceList.isList()) {
torrent[ANNOUNCE_LIST] = announceList;
BDE& tiers = torrent[ANNOUNCE_LIST];
for(BDE::List::iterator tieriter = tiers.listBegin();
tieriter != tiers.listEnd(); ++tieriter) {
for(BDE::List::iterator uriiter = (*tieriter).listBegin();
uriiter != (*tieriter).listEnd(); ++uriiter) {
if((*uriiter).isString()) {
*uriiter = util::trim((*uriiter).s());
}
}
}
} else {
const BDE& announce = rootDict[C_ANNOUNCE];
BDE announceList = BDE::list();
if(announce.isString()) {
announceList << BDE::list();
announceList[0] << announce;
announceList[0] << util::trim(announce.s());
}
torrent[ANNOUNCE_LIST] = announceList;
}
@ -582,6 +592,7 @@ void print(std::ostream& o, const SharedHandle<DownloadContext>& dctx)
}
}
o << "Name: " << torrentAttrs[NAME].s() << "\n";
o << "Magnet URI: " << torrent2Magnet(torrentAttrs) << "\n";
util::toStream(dctx->getFileEntries().begin(), dctx->getFileEntries().end(), o);
}
@ -925,6 +936,33 @@ std::string metadata2Torrent(const std::string& metadata, const BDE& attrs)
return torrent;
}
std::string torrent2Magnet(const BDE& attrs)
{
std::string uri = "magnet:?";
if(attrs.containsKey(INFO_HASH)) {
uri += "xt=urn:btih:";
uri += util::toHex(attrs[INFO_HASH].s());
} else {
return A2STR::NIL;
}
if(attrs.containsKey(NAME)) {
uri += "&dn=";
uri += util::urlencode(attrs[NAME].s());
}
if(attrs.containsKey(ANNOUNCE_LIST)) {
const BDE& tiers = attrs[ANNOUNCE_LIST];
for(BDE::List::const_iterator tieriter = tiers.listBegin();
tieriter != tiers.listEnd(); ++tieriter) {
for(BDE::List::const_iterator uriiter = (*tieriter).listBegin();
uriiter != (*tieriter).listEnd(); ++uriiter) {
uri += "&tr=";
uri += util::urlencode((*uriiter).s());
}
}
}
return uri;
}
} // namespace bittorrent
} // namespace aria2

View File

@ -235,6 +235,10 @@ void generateRandomKey(unsigned char* key);
// data.
std::string metadata2Torrent(const std::string& metadata, const BDE& attrs);
// Constructs BitTorrent Magnet URI using attrs. attrs must be a
// BDE::dict.
std::string torrent2Magnet(const BDE& attrs);
} // namespace bittorrent
} // namespace aria2

View File

@ -62,6 +62,7 @@ class BittorrentHelperTest:public CppUnit::TestFixture {
CPPUNIT_TEST(testParseMagnet);
CPPUNIT_TEST(testParseMagnet_base32);
CPPUNIT_TEST(testMetadata2Torrent);
CPPUNIT_TEST(testTorrent2Magnet);
CPPUNIT_TEST_SUITE_END();
public:
void setUp() {
@ -104,6 +105,7 @@ public:
void testParseMagnet();
void testParseMagnet_base32();
void testMetadata2Torrent();
void testTorrent2Magnet();
};
@ -252,7 +254,7 @@ void BittorrentHelperTest::testGetAnnounceTier() {
const BDE& tier = announceList[0];
CPPUNIT_ASSERT_EQUAL((size_t)1, tier.size());
CPPUNIT_ASSERT_EQUAL(std::string("http://aria.rednoah.com/announce.php"),
util::trim(tier[0].s()));
tier[0].s());
}
@ -267,8 +269,7 @@ void BittorrentHelperTest::testGetAnnounceTierAnnounceList() {
const BDE& tier1 = announceList[0];
CPPUNIT_ASSERT_EQUAL((size_t)1, tier1.size());
CPPUNIT_ASSERT_EQUAL(std::string("http://tracker1"),
util::trim(tier1[0].s()));
CPPUNIT_ASSERT_EQUAL(std::string("http://tracker1"), tier1[0].s());
const BDE& tier2 = announceList[1];
CPPUNIT_ASSERT_EQUAL((size_t)1, tier2.size());
@ -756,6 +757,20 @@ void BittorrentHelperTest::testMetadata2Torrent()
metadata2Torrent(metadata, attrs));
}
void BittorrentHelperTest::testTorrent2Magnet()
{
SharedHandle<DownloadContext> dctx(new DownloadContext());
load("test.torrent", dctx);
CPPUNIT_ASSERT_EQUAL
(std::string("magnet:?xt=urn:btih:248d0a1cd08284299de78d5c1ed359bb46717d8c"
"&dn=aria2-test"
"&tr=http%3A%2F%2Ftracker1"
"&tr=http%3A%2F%2Ftracker2"
"&tr=http%3A%2F%2Ftracker3"),
torrent2Magnet(dctx->getAttribute(BITTORRENT)));
}
} // namespace bittorrent
} // namespace aria2