Сохранить отдельные торренты с помощью Libtorrent save_state()?

В настоящее время я работаю с Ragnar, который является оболочкой CLI Libtorrent.

Я наткнулся на кирпичную стену. Возможно, это недостаток реализации оболочки, которую я использую, или я просто неправильно понял документацию Libtorrent API, но я не могу понять, как правильно сохранить/загрузить текущие данные состояния сеанса.

Моя текущая цель, как я могу лучше всего сказать, состоит в том, чтобы сохранить все torrent_handles в текущем сеансе, чтобы при следующем запуске торрент-клиента, над которым я работаю, я мог загрузить их автоматически при запуске и возобновить загрузку/раздачу.

Я все еще не уверен, должен ли я сделать это, сохранив состояние сеанса или нет. Согласно документации по API:

Аргументы flags, переданные в save_state, можно использовать для фильтрации частей состояния сеанса, которые необходимо сохранить. По умолчанию сохраняется все состояние (кроме отдельных торрентов).

Но я не вижу флага, относящегося к individual torrents:

enum save_state_flags_t
{
        save_settings =     0x001,
        save_dht_settings = 0x002,
        save_dht_state =    0x004,
        save_proxy =        0x008,
        save_i2p_proxy =    0x010,
        save_encryption_settings = 0x020,
        save_as_map =       0x040,
        save_feeds =        0x080
};

Кроме того, оболочка в настоящее время жестко закодирована, чтобы не принимать эти флаги:

cli::array<byte>^ Session::SaveState()
{
    libtorrent::entry entry;
    this->_session->save_state(entry);

    return Utils::GetByteArrayFromLibtorrentEntry(entry);
}

Это должно быть легко исправить, но я что-то упустил? Я пытаюсь сохранить через неправильный механизм?


person DanteTheEgregore    schedule 28.10.2014    source источник


Ответы (1)


libtorrent не предоставляет механизма для сохранения списка торрентов. Ожидается, что вы (клиент) сохраните файлы .torrent на диске (поскольку они неизменяемы) и просто повторно добавите их при первом запуске.

Единственным исключением является добавление магнет-ссылки, тогда вам нужно иметь возможность превратить torrent_handle в реальный файл .torrent. Вот фрагмент, чтобы сделать это:

boost::intrusive_ptr<torrent_info const> ti = h.torrent_file();
create_torrent new_torrent(*ti);
std::vector<char> out;
bencode(std::back_inserter(out), new_torrent.generate());
save_file("mytorrent.torrent", out);

Однако, возможно, даже лучше сохранить файл .torrent (или info-dict) как часть данных возобновления. При вызове save_resume_data(), если вы передаете save_info_dict, данные возобновления будут содержать все необходимое для перезапуска торрента. то есть фактическая копия файла .torrent будет сохранена внутри файла возобновления.

Пример, поставляемый с libtorrent, просто хранит файлы .torrent в каталоге и сканирует каталог при запуске (и периодически), поэтому файловая система хранит список торрентов. Более эффективный способ сделать это — хранить фактические файлы .torrent вместе с данными возобновления в базе данных (скажем, sqlite).

Вот пример сохранения данных резюме в комплекте с файлом .torrent в базе данных sqlite.

save_resume.cpp, save_resume.hpp

База данных обеспечивает более эффективный запуск при загрузке их всех. Объединение данных возобновления вместе с торрентом также экономит вам один поиск по диску для каждого загружаемого торрента).

person Arvid    schedule 29.10.2014