Как полностью пропустить запись файлов на диск при загрузке libtorrent?

У меня есть следующий код для загрузки торрента с магнитного URI.

#python
#lt.storage_mode_t(0) ## tried this, didnt work
ses = lt.session()
params = { 'save_path': "/save/here"}

ses.listen_on(6881,6891)
ses.add_dht_router("router.utorrent.com", 6881)

#ses = lt.session()
link = "magnet:?xt=urn:btih:395603fa..hash..."
handle = lt.add_magnet_uri(ses, link, params)
while (not handle.has_metadata()):
    time.sleep(1)
handle.pause () # got meta data paused, and set priority
handle.file_priority(0, 1)
handle.file_priority(1,0)
handle.file_priority(2,0)
print handle.file_priorities()
#output is [1,0,0]
#i checked no files written into disk yet.
handle.resume()
while (not handle.is_finished()):
    time.sleep(1) #wait until download 

Это работает, однако в этом конкретном торренте есть 3 файла, файл 0 - 2 КБ, файл 1 - 300 МБ, файл 3 - 2 КБ.

Как видно из кода, файл 0 имеет приоритет 1, а остальные имеют приоритет 0 (т.е. не скачивать).

Проблема в том, что когда файл 0 заканчивает загрузку, я хочу, чтобы он остановился и больше не загружался. но иногда он загружает 1 файл - частично, иногда 100 МБ или 200 МБ, иногда пару килобайт, а иногда и весь файл.

Итак, мой вопрос: как я могу убедиться, что загружается только файл 0, а не 1 и 2.

РЕДАКТИРОВАТЬ: я добавил проверку того, получил ли я метаданные, затем установил приоритет, а затем возобновил его, однако это по-прежнему частично загружает второй файл.


person mur    schedule 14.08.2017    source источник


Ответы (1)


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

Чтобы избежать этого, вы можете установить приоритеты файлов вместе с добавлением торрента, примерно так:

p = parse_magnet_uri(link)
p['file_priorities'] = [1, 0, 0]
handle = ses.add_torrent(p)

ОБНОВЛЕНИЕ:

Вам не нужно знать количество файлов, можно указать приоритеты файлов для большего количества файлов, чем в конечном итоге будет в торрент-файле. Остальные будут просто игнорироваться. Однако, если вы не хотите ничего скачивать (кроме метаданных/.torrent) из роя, лучше установить флаг flag_upload_mode. См. документацию.

p = parse_magnet_uri(link)
p['flags'] |= add_torrent_params_flags_t.flag_upload_mode
handle = ses.add_torrent(p)
person Arvid    schedule 15.08.2017
comment
мне нужны метаданные о торренте, количестве файлов + размере и количестве пиров, прежде чем я начну скачивать торрент, поэтому могу ли я получить метаданные, а затем установить приоритеты? или мне нужно будет установить приоритеты перед получением метаданных? - person mur; 15.08.2017
comment
Я обновил код, я жду загрузки метаданных, приостанавливаю торрент и устанавливаю приоритет, затем возобновляю его, затем повторяю, пока handle.is_finished не станет истинным. но это все равно создает эту гонку, т.е. скачивает второй файл - person mur; 15.08.2017