Descargue 16GB torrent a través de una tableta con 4GB de espacio libre


Desafío:


Hay una PC sin Internet, pero es posible transferir el archivo a través de USB. Hay una tableta con Internet desde la cual se puede transferir este archivo. En la tableta puedes descargar el torrent deseado pero no hay suficiente espacio libre. El archivo en el torrent es único y grande.


Camino a la solución:


Empecé el torrent para descargar. Cuando el espacio libre casi llegó a su fin, detuve la descarga. Conecté la tableta a la PC y moví el archivo de la tableta a la PC. Hizo una pausa y, para mi sorpresa, el archivo se creó de nuevo y el torrente continuó oscilando aún más como si nada hubiera pasado.


Debido al hecho de que el cliente torrent establece el indicador disperso en un archivo en el que escribe los datos recibidos, el sistema no intenta reservar inmediatamente 16 GB y no habrá ningún error al intentar escribir en un archivo más allá de 4 GB.


Repitiendo el procedimiento cuatro veces, recibí cuatro archivos en la PC en los que diferentes partes del mismo torrente. Ahora queda reunirlos. El procedimiento es esencialmente simple. Es necesario reemplazar cero bytes con otro valor si está en esta posición en uno de los cuatro archivos.


Me pareció que un programa tan simple debería estar en Internet. ¿Realmente nadie enfrentó tal tarea? Pero me di cuenta de que ni siquiera sé qué palabras clave buscarla. Por lo tanto, rápidamente lancé un script Lua para esta tarea y ahora lo he optimizado. Quiero compartirlo


Descargar torrent en partes


  1. comenzar a descargar torrent en el primer dispositivo
  2. espere hasta que se llene la ROM
  3. pausa la descarga
  4. transfiera el archivo al segundo dispositivo y agregue un dígito al nombre del archivo
  5. regrese al primer punto hasta que el archivo se descargue completamente

Combinar partes en un archivo


Después de recibir la última parte, es necesario recopilarlos en un archivo completo.


La tarea es simple:


  1. Lee todas las partes a la vez
  2. Si en alguna parte en la posición el byte distinto de cero se escribe en la salida, de lo contrario, escribimos cero

La función merge_part toma una matriz de streams_in streams de la que lee una parte del tamaño buffer_length y devuelve el resultado de fusionar partes de diferentes streams.


 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 --[[ 

La función string.gsub adecuada para la tarea, ya que encontrará piezas llenas de ceros y pondrá lo que se le pasa.


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

string.gsub no pasa la posición en la que se encontró una coincidencia. Por lo tanto, hacemos una búsqueda paralela de la posición zero_string usando la función string.find . Es suficiente para encontrar el primer byte cero.


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

Ahora, si in_part tiene datos para out_part cópielo.


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

Cortamos la parte correspondiente a la secuencia de ceros de in_part .


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

Hay datos en part .


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

part resultó ser menos que una secuencia de ceros. Lo complementamos con ellos.


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

Conclusión


Por lo tanto, fue posible descargar y ensamblar este archivo en una PC. Después de la fusión, saqué un archivo torrent de la tableta. Instalé el cliente torrent en la PC y verifiqué el archivo con él.


La última parte descargada en la tableta se puede dejar en la distribución, pero debe activar la verificación repetida de las partes antes de esto y desmarcar el archivo para que no se descargue nuevamente.


Utilizado:


  1. Cliente Torrent Flud en la tableta.
  2. QBittorent torrent client en PC.
  3. Lua script

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


All Articles