std::string make_magnet_uri(torrent_handle const& handle) { if (!handle.is_valid()) return ""; std::string ret; sha1_hash const& ih = handle.info_hash(); ret += "magnet:?xt=urn:btih:"; ret += to_hex(ih.to_string()); torrent_status st = handle.status(torrent_handle::query_name); if (!st.name.empty()) { ret += "&dn="; ret += escape_string(st.name.c_str(), st.name.length()); } std::vector<announce_entry> const& tr = handle.trackers(); for (std::vector<announce_entry>::const_iterator i = tr.begin(), end(tr.end()); i != end; ++i) { ret += "&tr="; ret += escape_string(i->url.c_str(), i->url.length()); } std::set<std::string> seeds = handle.url_seeds(); for (std::set<std::string>::iterator i = seeds.begin() , end(seeds.end()); i != end; ++i) { ret += "&ws="; ret += escape_string(i->c_str(), i->length()); } return ret; }
std::string make_magnet_uri(torrent_handle const& handle) { if (!handle.is_valid()) return ""; std::string ret; sha1_hash const& ih = handle.info_hash(); ret += "magnet:?xt=urn:btih:"; ret += aux::to_hex(ih); torrent_status st = handle.status(torrent_handle::query_name); if (!st.name.empty()) { ret += "&dn="; ret += escape_string(st.name); } for (auto const& tr : handle.trackers()) { ret += "&tr="; ret += escape_string(tr.url); } for (auto const& s : handle.url_seeds()) { ret += "&ws="; ret += escape_string(s); } return ret; }
std::string make_magnet_uri(torrent_handle const& handle) { if (!handle.is_valid()) return ""; char ret[1024]; sha1_hash const& ih = handle.info_hash(); int num_chars = snprintf(ret, sizeof(ret), "magnet:?xt=urn:btih:%s" , base32encode(std::string((char const*)&ih[0], 20)).c_str()); std::string name = handle.name(); if (!name.empty()) num_chars += snprintf(ret + num_chars, sizeof(ret) - num_chars, "&dn=%s" , escape_string(name.c_str(), name.length()).c_str()); std::string tracker; torrent_status st = handle.status(); if (!st.current_tracker.empty()) { tracker = st.current_tracker; } else { std::vector<announce_entry> const& tr = handle.trackers(); if (!tr.empty()) tracker = tr[0].url; } if (!tracker.empty()) num_chars += snprintf(ret + num_chars, sizeof(ret) - num_chars, "&tr=%s" , escape_string(tracker.c_str(), tracker.size()).c_str()); return ret; }
std::string make_magnet_uri(torrent_handle const& handle) { std::stringstream ret; if (!handle.is_valid()) return ret.str(); std::string name = handle.name(); ret << "magnet:?xt=urn:btih:" << base32encode( std::string((char*)handle.info_hash().begin(), 20)); if (!name.empty()) ret << "&dn=" << escape_string(name.c_str(), name.length()); torrent_status st = handle.status(); if (!st.current_tracker.empty()) { ret << "&tr=" << escape_string(st.current_tracker.c_str() , st.current_tracker.length()); } else { std::vector<announce_entry> const& tr = handle.trackers(); if (!tr.empty()) { ret << "&tr=" << escape_string(tr[0].url.c_str() , tr[0].url.length()); } } return ret.str(); }