Как создать файлы metalinks для P2P?

Вопрос или проблема

Согласно Википедии:

“Файлы 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.

Вначале мы создадим 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-протоколы. Убедитесь, что все утилиты установлены и доступны в вашей системе, прежде чем запускать скрипт.

Оцените материал
Добавить комментарий

Капча загружается...