Reescreva os argumentos antes de passá-los para um comando

3

Eu uso rtorrent . Ao usar links magnéticos, ele cria um arquivo "meta" (.meta). Isto obtém a forma de um longo número hexadecimal (0-9, A-F). Por exemplo:

0123456789ABCDEF0123456.meta

Para "usar" um meta-arquivo existente para iniciar rtorrent , primeiro você pode "isolar" o nome do arquivo sem o sufixo (sem ".meta").

0123456789ABCDEF0123456

Esta parte de número hexadecimal tem, na verdade, (sempre?) 41 caracteres de comprimento.

Em seguida, você deve adicionar o protocolo antes dele e uma lista de rastreadores depois.

magnet:?xt=urn:btih:0123456789ABCDEF0123456&tr=http://tracker1.com:80&tr=udp://tracker2.net:8080

Seria ótimo se fosse possível alterar a lista de rastreadores. Idealmente, as URLs dos rastreadores devem ser lidas de um arquivo com um rastreador por linha - adicionando &tr= quando necessário. Os rastreadores usam os protocolos http: // ou udp: // as e, geralmente, o número da porta deve ser especificado (com :port no final).

Um exemplo de um "rastreador" real (a parte depois do número hexadecimal) poderia ser:

&tr=udp%3A%2F%2Ftracker.coppersurfer.tk%3A80&tr=udp%3A%2F%2Fglotorrents.pw%3A6969%2Fannounce&tr=udp%3A%2F%2Ftracker.leechers-paradise.org%3A6969&tr=udp%3A%2F%2Ftracker.opentrackr.org%3A1337%2Fannounce&tr=udp%3A%2F%2Fexodus.desync.com%3A6969

No entanto, deve ser possível alterá-los e, idealmente, eles devem ser listados em um arquivo separado.

Esse arquivo pode conter, por exemplo:

trackers.txt :

udp://tracker.coppersurfer.tk:80
udp://glotorrents.pw:6969/announce
udp://tracker.leechers-paradise.org:6969
udp://tracker.opentrackr.org:1337/announce
udp://exodus.desync.com:6969

(Nota: os rastreadores também usam http: // como protocolo)

O resultado, depois de remover .meta"= e adicionar magnet:... e &tr=... - nas cotações para garantir que & não confunda bash - pode então ser passado para o rtorrent como argumento.

O que eu gostaria é de um script que possa automatizar esse processo de conversão e passar o resultado para rtorrent . De preferência, um que poderia ter vários meta-arquivos como argumento (por exemplo, expandido por bash de * .meta) e passá-los todos - convertidos - como argumentos para um rtorrent instance (que o script inicia).

rtorrent "magnet:...12345..." "magnet:...6789..." "magnet:...ABCD..."

Infelizmente, eu sou realmente horrível em escrever bash -scripts, então alguém aqui sabe como algo assim poderia ser feito?

    
por Baard Kopperud 16.03.2016 / 11:54

1 resposta

4

Aqui está um trecho de fazer a conversão no bash.

#!/bin/bash

# The array of results passed to rtorrent in the end
results=()

# The file listing the trackers is the first argument
trackers="$1"
shift
# create the tracker list url part.
# sed reads the file and puts '&tr=' before each line,
# then it replaces all : and / with the percent escaped version for urls.
# tr deletes all newlines (turning the text into one long line)
tracker_list_for_url="$(sed 's/^/&tr=/;s/:/%3A/g;s#/#%2F#g' < "$trackers" \
                        | tr -d '\n')"

# loop over arguments and add them to $results
for arg in "$@"; do
  # remove the extension
  hex_part="${arg%.meta}"
  # append to results array
  results+="magnet:?xt=urn:btih:$hex_part$tracker_list_for_url"
done
exec rtorrent "${results[@]}"

Ainda não entendo qual programa em seu cenário chama qual programa e quando e como os argumentos são criados e passados para outros programas. Então eu fiz estas suposições:

  1. você chama seu script com o arquivo da lista de rastreadores como primeiro argumento e os arquivos meta como o restante dos argumentos
  2. seu script deve começar a rtorrent

Se essas suposições estiverem erradas, por favor, esclareça ou use o roteiro acima e o adote de acordo com sua necessidade.

    
por 16.03.2016 / 13:14