Вопрос или проблема
Согласно Википедии:
“Файлы Metalink — это файлы, которые позволяют загружать файлы или папки с использованием нескольких протоколов.”
Существует много программ для загрузки с помощью metalink. Но в моем случае я хочу создать файл metalink для локальной папки, содержащей более 100,000 файлов. Получившийся metalink должен позволять загружать файлы через торрент или магнит, что означает, что магнитные ссылки должны генерироваться в процессе).
Я нашел только dir2ml
, который создает metalinks из FTP-адресов без поддержки P2P-протоколов для загрузки.
Поскольку существует много небольших инструментов, которые могут решить эту задачу, мой подход будет заключаться в использовании чего-то вроде aria2c
и transmission
или mktorrent
вместе. Я думал, что heredoc также может неплохо работать. xq
— это также удобная утилита командной строки для изменения XML-файлов и может также быть частью решения.
Часть 1
- сгенерировать все локальные мета-ссылки
aria2c --metalink-file=mymetalink.meta4 --dir=./myfiles/
Часть 2
- создать торрент и магнитную ссылку для каждого файла
Например, вы можете передать данные через конвейер или использовать это где-то еще
echo "magnet:?xt=urn:btih:$(mktorrent -p -o output.torrent input_file_or_directory | sed 's/Info hash: //') >> magnets.txt"
Часть 3
bash
скрипт или однострочник с использованиемxargs
илиfind --exec
Одна из реализаций
#!/bin/bash
# Установить каталог
files_dir="./myfiles"
# определить файл metalink
metalink_file="mymetalink.meta4"
# Записать заголовок metalink
cat << EOF > "$metalink_file"
<?xml version="1.0" encoding="UTF-8"?>
<metalink xmlns="urn:ietf:params:xml:ns:metalink">
<published>$(date +%Y-%m-%dT%H:%M:%S%z)</published>
<generator>bash script</generator>
EOF
# для каждого файла в каталоге
find "$files_dir" -type f -print0 | while IFS= read -r -d '' file; do
filename=$(basename "$file")
filesize=$(stat -c%s "$file")
sha256=$(sha256sum "$file" | awk '{print $1}')
# Создать магнитную ссылку
magnet=$(echo "magnet:?xt=urn:btih:$(mktorrent -p -q -o "${file}.torrent" "$file" | sed 's/Info hash: //')")
# Записать детали каждого файла в metalink
cat << EOF >> "$metalink_file"
<file name="$filename">
<size>$filesize</size>
<hash type="sha256">$sha256</hash>
<metaurl>$magnet</metaurl>
</file>
EOF
done
# добавить закрывающий тег в файл metalink
cat << EOF >> "$metalink_file"
</metalink>
EOF
Еще одно решение, но с использованием xq
# используйте aria для создания metalinks
aria2c --metalink-file=mymetalink.meta4 \
--dir=./myfiles/
# используйте xq для изменения metalinks с информацией о торрентах
xq -i \
'.metalink.file[] | \
( . += {"metaurl": \
{"__content": "magnet:?xt=urn:btih:$(mktorrent -p -q -o \""$PWD"/".@name".torrent "$PWD"/".@name" | sed "s/Info hash: //")" \
} } ; . )' \
your_metalink.meta4
Ответ или решение
Создание Metalink файлов для локальной папки с использованием P2P-ссылок, таких как торрент и магнитные ссылки, представляет собой интересную задачу. В этом ответе я представлю процесс, который позволит создать Metalink файл, включающий все необходимые ссылки для загрузки. Для этого мы будем использовать утилиты aria2
, mktorrent
и консольные инструменты на bash.
Шаг 1: Генерация Metalink файла
Вначале мы создадим Metalink файл, который будет содержать информацию о файлах в указанной директории. Мы используем aria2c
для этой задачи.
#!/bin/bash
# Устанавливаем директорию с файлами
files_dir="./myfiles"
# Определяем имя Metalink файла
metalink_file="mymetalink.meta4"
# Пишем заголовок Metalink файла
cat << EOF > "$metalink_file"
<?xml version="1.0" encoding="UTF-8"?>
<metalink xmlns="urn:ietf:params:xml:ns:metalink">
<published>$(date +%Y-%m-%dT%H:%M:%S%z)</published>
<generator>bash script</generator>
EOF
# Для каждого файла в директории
find "$files_dir" -type f -print0 | while IFS= read -r -d '' file; do
filename=$(basename "$file")
filesize=$(stat -c%s "$file")
sha256=$(sha256sum "$file" | awk '{print $1}')
# Создание магнитной ссылки
magnet=$(echo "magnet:?xt=urn:btih:$(mktorrent -p -q -o "${file}.torrent" "$file" | sed 's/Info hash: //')")
# Записываем детали каждого файла в Metalink
cat << EOF >> "$metalink_file"
<file name="$filename">
<size>$filesize</size>
<hash type="sha256">$sha256</hash>
<metaurl>$magnet</metaurl>
</file>
EOF
done
# Закрываем тег Metalink файла
cat << EOF >> "$metalink_file"
</metalink>
EOF
Шаг 2: Создание торрент-файлов и магнитных ссылок
В этом шаге мы генерируем магнитные ссылки при создании торрент-файлов. Убедитесь, что у вас установлен mktorrent
для возможности генерации торрентов.
echo "magnet:?xt=urn:btih:$(mktorrent -p -o output.torrent input_file_or_directory | sed 's/Info hash: //')" >> magnets.txt
Шаг 3: Использование xq для модификации Metalink файлов
Если вам нужно изменить уже существующий Metalink файл, вы можете воспользоваться xq
, чтобы добавить магнитные ссылки к каждому файлу.
xq -i \
'.metalink.file[] | \
( . += {"metaurl": \
{"__content": "magnet:?xt=urn:btih:$(mktorrent -p -q -o \""$PWD"/".@name".torrent "$PWD"/".@name" | sed "s/Info hash: //")" \
} } ; . )' \
your_metalink.meta4
Заключение
Данный скрипт обеспечивает создание Metalink файла, который содержит информацию о файлах, их размере и хэш-коде, а также магнитные ссылки для последующей загрузки через P2P-протоколы. Убедитесь, что все утилиты установлены и доступны в вашей системе, прежде чем запускать скрипт.