Faça o download do torrent de 16 GB via tablet com 4 GB de espaço livre


Desafio:


Há um PC sem a Internet, mas é possível transferir o arquivo via USB. Há um tablet com a Internet a partir do qual esse arquivo pode ser transferido. No tablet, você pode baixar o torrent desejado, mas não há espaço livre suficiente. O arquivo no torrent é único e grande.


Caminho para a solução:


Comecei o torrent para baixar. Quando o espaço livre quase chegou ao fim, pausei o download. Conectei o tablet ao PC e movi o arquivo do tablet para o PC. Ele parou e, para minha surpresa, o arquivo foi criado novamente e o torrent continuou a balançar ainda mais como se nada tivesse acontecido.


Devido ao fato de o cliente torrent definir o sinalizador esparso para um arquivo no qual grava os dados recebidos, o sistema não tenta reservar imediatamente 16 GB e não haverá erro ao tentar gravar em um arquivo além de 4 GB.


Repetindo o procedimento quatro vezes, recebi quatro arquivos no PC em que partes diferentes do mesmo torrent. Agora resta montá-los juntos. O procedimento é essencialmente simples. É necessário substituir zero bytes por outro valor se ele estiver nessa posição em um dos quatro arquivos.


Pareceu-me que um programa tão simples deveria estar na Internet. Realmente ninguém enfrentou essa tarefa? Mas percebi que nem sabia quais palavras-chave procurar por ela. Portanto, joguei rapidamente um script Lua para esta tarefa e agora o otimizei. Eu quero compartilhar


Download torrent em partes


  1. comece a baixar torrent no primeiro dispositivo
  2. aguarde até a ROM estar cheia
  3. pausar o download
  4. transfira o arquivo para o segundo dispositivo e adicione um dígito ao nome do arquivo
  5. volte ao primeiro ponto até que o arquivo seja baixado completamente

Mesclar peças em um arquivo


Depois que a última parte é recebida, é necessário coletá-las em um arquivo inteiro.


A tarefa é simples:


  1. Leia todas as peças de uma só vez
  2. Se em alguma parte da posição o byte diferente de zero for gravado na saída, caso contrário, escreveremos zero

A função merge_part pega uma matriz de streams_in fluxos a partir da qual lê uma parte do tamanho buffer_length e retorna o resultado da mesclagem de partes de diferentes fluxos.


 function merge_part(streams_in, buffer_length) local out_part for _, stream in ipairs(streams_in) do local in_part = stream:read(buffer_length) if not out_part then out_part = in_part --       elseif in_part and #in_part > 0 then if #out_part < #in_part then out_part, in_part = in_part, out_part end if out_part ~= in_part --   and in_part:find("[^\0]") --    in_part and out_part:find("\0", 1, true) --     out_part then local find_index = 1 --[[ 

A função string.gsub adequada para a tarefa, pois encontra peças preenchidas com zeros e coloca o que é passado para ela.


 --]] out_part = out_part:gsub("\0+", function(zero_string) if #in_part < find_index then return --     end --[[ 

string.gsub não passa na posição em que uma correspondência foi encontrada. Portanto, fazemos uma pesquisa paralela para a posição zero_string usando a função string.find . Basta encontrar o primeiro byte zero.


 --]] local start_index = out_part:find("\0", find_index, true) find_index = start_index + #zero_string --[[ 

Agora, se in_part tiver dados para out_part copie-os.


 --]] if #in_part >= start_index then local end_index = start_index + #zero_string - 1 --[[ 

in_part a parte correspondente à sequência de zeros de in_part .


 --]] local part = in_part:sub(start_index, end_index) if (part:byte(1) ~= 0) or part:find("[^\0]") then --[[ 

Existem dados em part .


 --]] if #part == #zero_string then return part else --[[ 

part acabou sendo menor que uma sequência de zeros. Nós complementamos com eles.


 --]] return part..zero_string:sub(1, end_index - #in_part) end end end end) end end end return out_part end 

Conclusão


Assim, foi possível baixar e montar esse arquivo em um PC. Após a fusão, peguei um arquivo torrent do tablet. Instalei o cliente de torrent no PC e verifiquei o arquivo com ele.


A última parte baixada no tablet pode ser deixada na distribuição, mas você precisa ativar a verificação repetida das peças antes disso e desmarcar o arquivo para que ele não faça o download novamente.


Usado:


  1. Cliente de torrent Flud no tablet.
  2. Cliente de torrent QBittorent no PC.
  3. Script Lua

Source: https://habr.com/ru/post/pt473636/


All Articles