Pull to refresh

Comments 77

Мне вообще кажется, что подобный функционал должен быть в самом клиенте.
Должна быть! Но мое кунгфу не настолько сильное, чтобы с ним лезть в исходники трансмиссии или рторрента.
Зато есть к чему стремиться.
Функционал вам ничего не должен. Берите и пишите.
Как альтернативный вариант — интегрировать в клиент примитивный файл-менеджер, при перемещении файла в котором линки обновляются ИЛИ написать плагин для тотал-коммандера который будет обновлять эти линки
Здорово! Чтобы форма не подвисала во время сканирования можно использовать BackgroundWorker
Чтобы форма не подвисала во время сканирования можно использовать BackgroundWorker

Я бы даже сказал нужно. Вообще делать работу в том же потоке, что работает UI — очень дурной тон и годиться только для «quick&dirty» прототипов. На крайняк, если лень писать нормально, но хочется придать поделке товарный вид, есть такая альтернатива как явный вызов обработки сообщений внутри тела рабочего цикла.
Совершенно верно. На месте автора я бы сделал консольное приложение, а эксперты по UI могут все написать сами, по своим вкусам и желаниям. Ссылка на репозиторий в самом посте.
По-хорошему, нужно делать не GUI-приложение и не консоль, а класс в библиотеке, который потом уже лентяи используют в пару строк в консольной программе, а эстеты напишут UI на каких-нибудь модных WPF и многопоточности.
Тогда бы автору пришлось еще писать консольный фронтенд
Зачем? Точно так же написал бы то, что написал.
Как минимум, весь софт пишется для себя любимого. Надо же как-то это дело запускать самому? А если это оформлять в виде либы, то нужно еще и пускалку делать. Нет, консольное приложение писать всяко проще.
самому — из под отладчика, как же ещё! ;)
Да, а еще хорошо бы прогресс-бар использовать.
явно не менял расширения файлов. Имя мог поменять, а вот расширение вряд ли

Если расширение было в верхнем регистре — поменяю его на нижний практически обязательно.
Хм… Виноват. Хотя мне кажется, что .net возвращает какой-то один вид. Проверю как будет возможность.
Вообще лично для себя я вижу эту задачу немного иначе.

Когда-то я имел отдельные папки по разным трекерам, хранил все torrent-файлы и не переименовывал и не перемещал сами файлы. Сейчас всё уже не так — практически всё скачанное переименовано, пересортировано, и расползлось по разным жёстким дискам. И я, разумеется, не помню сколько-нибудь полного списка того, что и откуда я качал.

Соответственно задача в идеальном случае (не знаю на сколько это возможно — может быть это заняло бы дохренища времени):

Скачать ВСЕ (ну или хотя бы из определённых разделов, исключив некоторые разделы по нехарактерным для меня темам) torrent-файлы с нескольких трэкеров и просканировать примерно 3 терабайта «файлопомойки» на предмет соответствия искомым хэшам.

При этом есть и вовсе нерешаемые проблемы: некоторые файлы шли в архивах и я их разархивировал, некоторые наоборот заархивировал, а в некоторых музыкальных файлах поменял теги так что хоть контент и имеется, это уже другие файлы с другими хэшами.
частичная проверка хешей поможет от измененных тегов, особенно если размер пайсов небольшой.
Умнó. Не подумал такой возможности. Спасибо.
На самом деле все очень натянуто. К примеру, если поменяется размер тега в начале файла, то будет сдвиг всех данных файла. В этом случае посчитать хеш конечно можно, но с какой позиции его считать? Что уже скорее невозможно.
А вот поменяется ли размер от изменения тегов — опять непонятно. Будет ли приложение добавлять паддинг тегу или сразу запишет данные — зависит только от него. Будет ли сохранен паддинг, или нет — опять не ясно. Все зависит от конкретных реализаций.
Я пришел к такому выводу — музыку не раздавать вообще. Ну, почти.
Т.е. есть две папки:
.../music — здесь музыкальная коллекция. Всё красиво, организованно
.../INBOX/music — сюда попадает новая музыка. Она лежит какое-то время, раздаётся, а потом, когда руки доходят и файлы меняются, с раздачи снимается.

Всё потому что крайне мало треков, где что-нибудь не изменено.
Размер поменяется, а вот раздавать все равно можно будет, но только те части файлов в которых находится непоследственно музыка. Те части, в которых находятся теги, будут, естественно, признаны негодными для раздавания.
Как будешь их искать?
Сейчас проверяется только первый кусок, и, если его хеш совпадает, то он считается нашим. Можно проверять все куски, которые есть в этом файле (это есть, отлажу и запилю), но тут возникает вопрос, как считать правильность? Можно считать подходящим только тот файл, у которого совпал хеш всех проверенных кусков. А можно выставить «порог доверия», то есть говорить, что файл наш, если совпали, скажем, 75% кусков, независимо от их положения в файле.
А если данные сдвинуты на 1 байт? Будешь считать 2м хешей?
Если данные сдвинуты на байт, то ни один хеш уже не совпадет. В этом и проблема, из-за которой я пока не хочу использовать этот «порог». Сейчас хочу сделать проверку всего файла, но при первом несовпадении считать «не тем» и поиск продолжать дальше.
«Найти в куче файлов тот, который соответствует описанному в .torrent, и переместить его в папку, соответствующую пути в .torrent.»
На мой взгляд, было бы логичнее оставить файл где есть, а изменить путь к нему в торренте. Например, если у меня расползется по папкам с кривыми путями та же тщательно отструктурированная и проименованная Бондиада (напр. Nekogda.ne.govori.nekogda, как написал недавно безызвестный автор), я буду недоволен.
Обязательно попробую поковырять в этом направлении. Создайте issue на github, а то могу забыть.
Меня на гитхабе нет ввиду отсутствия необходимости, извините.
О как. За отсутствие учетки на гитхабе нынче минусуют? А если у меня реально нет необходимости в его использовании — я недочеловек?
>За отсутствие учетки на гитхабе нынче минусуют?

А скоро вообще морду бить будут! Останавливают тебя на районе, и так «Есть учетка на Гитхабе? А ну ка дай по-быстрому одну issue зарепортить?»
«А если найду?» )
«Дай аккаунт на хабре, коммент написать, да не боись, я не про линукс»
Вами описанное скорее не «за отсутствие», а «за наличие», то есть в духе «до тех пор, пока не даст issue зарепортить, а заодно и учётку угнать».
— Ну зачем хамишь? У тебя просят на Github, а ты мне на Bitbucket пихаешь Нехорошо!
такое раздавать в прежней раздаче уже нельзя
Щито? Переместить файл в торрент-клиенте — это одно. Переместить его в торрент-файле — совершенно другое. Информация о имени/пути лежит внутри info-чанка. Идентификационный хеш считается на основе info-чанка. Поменяв 1 букву в имени, мы получим уже другой торрент, о прежней раздачи говорить уже нельзя.
В таком случае затея практически лишена смысла. Подозреваю, что мало кто хранит файлы в оригинальных названиях после завершения закачки, как правило они неудобоваримы или принципом наименования противоречат замыслу пользователя.
В таком случае предлагаю расстрелять автора за то, что написал никому не нужное изделие, создал никому не нужный тред, потратил время уважаемые посетителей уважаемого ресурса, да и вообще из-за него идет снижение ВВП.
Воля Ваша, Иосиф Виссарионыч :)
«Оригинальные названия» действительно в подавляющем большинстве случаев меня не устраивают. Приходится не лениться и изменять название в процессе добавления торрента в список закачек клиента. В «Мюторренте» (по-моему и в Делюге тоже такое делал) это приводит к тому, что в списке закачек клиента у раздачи остаётся «оригинальное название», а на винте — то, которое было указано при добавлении торрента.
Сори, сонный, пишется темно и вяло. Но думаю, всем понятно, что я подразумеваю.
Раздачу в процессе также можно переименовать, если планируется оставить ее надолго, чтобы глаз не резала. По крайней мере в мюторренте.
А так да, изменение названия в процессе выбора места закачки файла — крайне удобная и приятная возможность.
Так в клиенте перемещать и надо. У мюторрента в нутрях конфигов примерно тот же формат берётся за основу, что и у торрентов, вроде. Привязка к клиенту, конечно, но, думаю, его популярность очень высока.
Если бы все трекеры оперировали расширением BitTorrent, которое добавляет magnet-ссылку, всё было бы гораздо, гораздо прощею
Магнеты не имеют отношения к трекерам
Да… А ведь хотелось бы просто в клиенте указать — найди файлы этих раздач вон в той папке и раздавай… чтоб он сам все это сделал, никуда не копируя их.
Причина этого ограничения — использование при сканировании директорий параметра `SearchOption.AllDirectories`, что приводит к вылету при попытке прочитать закрытые директории типа корзины или `System Volume Information` (если знающие люди подскажут как это обойти, то буду весьма признателен).

Я не сильно знающий человек, но может просто проверять аттрибуты и не искать среди скрытых и системных файлов?
Параметр SearchOption есть либо AllDirectories, либо TopDirectoryOnly. Это можно обойти ручным перебором директорий. Мне этот вариант не нравится, поэтому если не найду ничего лучше, то сделаю его.
А зачем перемещать, может прости симлинк сделать на каждый фаил? Мне кажется это более логичным. На linux/osx лучше даже хардлинки сделать.
Хардлинки и на винде есть. Давно. :)
Хорошая работа, однако было бы хорошо добавить решим «кандидатов». К примеру, есть у нас торрент с мелкими файлами, части файлов нет, как следствие хеш проверить мы не можем. Однако, используя данные о размере файлов можно попробовать найти все файлы данного размера и поместить их в директорию «кандидаты», а что делать с ними дальше — пусть решает человек.

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

Еще фича: файлы «частично похожие», когда мы имеем сегменты для проверки хеша, но все хеши не совпадают. Такое может случиться из-за повреждения данных на диске/изначальной недокачанности.
Для каждого файла складывать кандидатов в отдельную папку — сильно затратно. К тому же если реальный файл поврежден, то его там может не быть.

Мелкие файлы, даже если их много, перекачать проще, чем искать кандидатов на их место.
Ну дело твое, я просто предложил. Можешь их просто проиндексировать и по размеру попробовать подобрать цепь, при каждой попытке считая хеш. Но это просто идея, а не призыв к действию.
Можно попробовать вместо перемещения и переименования файлов создавать для них симлинки с правильными именами в отдельной папке.
Григорий, выше уже поднималась несколько раз просьба. Повторю применительно к своей проблеме (думаю она есть у многих):
Есть библиотека электронных книг, скаченных из разных мест Интернета. С другой стороны эти книги присутствуют во многих раздачах на рутрекере и часто дублируются. Очень хочется встать со своим складом на все раздачи.
Переместить файлы, как Вы реализовали, не получиться по 2м причинам:
1. Они расположены на диске в порядке, удобным для работы
2. На рутрекере файлы многократно повторяются в раздачах, боюсь винчестера не хватит.

спасибо
Только писать/патчить торрент-клиент, достаточно интересная затея. Правда неприменимо для мелких файлов, так как фактически будут раздаваться только части этих самых файлов.

К примеру: есть книга размером в 5 мегабайт, эта же книга есть в 10 раздачах. Если раздача начинается с этой книги, то мы уверенно можем раздать ее начало. Конец — только при условии, что ее размер кратен размеру пайса, или у нас есть книга, которая лежит дальше в торренте. К примеру, пусть размер пайса будет равен 2 метрам, тогда мы сможем раздать 4 метра этой книги. Если книга внутри торрента расположена не в начале, то мы не можем раздать и начало, в первых 2 метрах (минус 1 байт) может быть что-то у нас отсутствующее, равно как и в конце. Следовательно, на такой раздаче мы можем раздать только кусочек в 2 метра, хотя у нас все 5 есть.

Еще недостаток — трекеры, которые не дают скачивать метадату в больших количествах (те самые торренты), вы просто не найдете все раздачи со своей книжкой, особенно если она переименована. Я нечто подобное просил сделать на рутрекере, но меня очень сильно замодерировали.

А так штука была бы интересной и полезной.
Я бы зашёл со стороны дедупликации в файловой системе.
дубли в файловой системе и в торрентах — две большие разницы. Дубли на ФС (и даже на уровне секторов) найти проще.
Скорее всего имеется в виду такая ситуация: есть два .torrent-файла раздач, в которых присутствует один или несколько одинаковых файлов. Если мы будем копировать найденные на диске файлы, то получится как раз избыточность данных на диске. Это можно решить с помощью хардлинков.
Ты можешь найти 2 одинаковых файла в разных торрентах? Как?
Нет. Пример того, что я имел в виду.

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

И вот тут-то хороша система хардлинков.

А про поиск двух одинаковых файлов в .torrent — не такая большая проблема, если немного изучить строение фалов и переосмыслить статью в контексеt поиска не файлов на диске, а описания файлов в другом файле.
«Нашли два .torrent-файла, в которых есть один одинаковый файл» — как нашли? Даже если они уже скачаны.
Виноват. Ошибся. «Нашли две раздачи».
Как нашли? Я могу повторять этот вопрос долго.
Когда ползали по трекеру. Нашли две раздачи. Скачали их .torrent-файлы. Закинули их (.torrent-файлы) в клиент, который вытянул раздачи. Каждую в свою папку. Мы, по завершению загрузки, эти две папки взяли и отсортировали как нам надо. НО. У нас в первой раздаче был файл, который есть и в другой (получилось после скачивания два одинаковых файла в разных папках). Мы это спалили и при сортировке один из них удалили.

Это предыстория. Теперь мы хотим вернуться на раздачу. Запускаем программу, речь о которой в статье. Она читает эти два .torrent-файла в папке, которую мы ей скормили. И копирует файл дважды — для первого и для второго прочитанных .torrent-файлов.

Получилось дублирование файлов, что нам очень не нравится — места много не бывает. Тут как раз на помощь приходит механизм хардлинков.

Так понятней?
У нас в первой раздаче был файл, который есть и в другой (получилось после скачивания два одинаковых файла в разных папках). Мы это спалили и при сортировке один из них удалили.
Как нашли, как палили, при пожаре никто не пострадал? Я могу представить, что идет индексация КАЖДОГО файла, сравнение хешей (и даже побайтное сравнение), но это несколько долго. Но это я представляю.

Она читает эти два .torrent-файла в папке, которую мы ей скормили. И копирует файл дважды — для первого и для второго прочитанных .torrent-файлов.
А вот этого я не понимаю, ибо файлы могут начинаться с разных позиций пайса, все хеши будут другими. Внимание, как найти, что вот этот вот файл есть в обеих раздачах? КАК?

Что такое симлинки/хардлинки я прекрасно знаю, про них писать не надо.
Глазками видимо нашли, своими… Или даже искалкой дублей в файловой системе…
Все движется в сторону создания хардлинков.
Ваше имя впишется золотыми буквами в книжные разделы на трекерах. И в каком то смысле добавит порядка (увеличит количество раздающих) в текущий хаос этих разделов.
С хардлинками есть проблема: я удалил файлы из коллекции (они мне больше не интересны), а место не освобождается. Может, лучше симлинки?
А висячий симлинк, это нормально? К тому же, в случае жесткой ссылки мы сможем продолжить раздачу.
симлинк получается даже хуже. при продолжении раздачи торрент-клиент создаст файл в папке коллекции, откуда файл удалили. значит, хардлинк — меньшее неудобство.
Хардлинк не меньшее неудобство, а нормальное решение. Надоело раздавать — удали раздачу. Надоело слушать/смотреть/читать — удали коллекцию. При таком подходе не надо думать, что удалив одно похеришь другое.
Для того, чтобы подобных проблем не возникало, существуют опциональные хеши и вроде бы можно иногда встретить пофайловый SHA1, хотя больше всего хотелось бы TTH.

Как видно в таблице на том же сайте, .torrent метафайлы, богатые TTH'ем, умеют создавать не все создавалки, но EAD TorrentBuild умеет. У TorrentBuild есть проблемы с иностранными символами в именах (он пишет их в ANSI), но есть open source версия, там это может быть исправлено.

Чтобы прекратить этот кошмар, желательно создавать только метафайлы, богатые TTH, а трекерам желательно ругаться на метафайлы, не богатые TTH, и предлагать пересоздать .torrent другой программой.
Sign up to leave a comment.

Articles