Scaricare un torrent da 16 GB tramite un tablet con 4 GB di spazio libero

Scaricare un torrent da 16 GB tramite un tablet con 4 GB di spazio libero

obiettivo:

C'è un PC senza Internet, ma è possibile trasferire il file tramite USB. C'è un tablet con Internet da cui è possibile trasferire questo file. Puoi scaricare il torrent richiesto sul tuo tablet, ma non c'è abbastanza spazio libero. Il file nel torrent è uno e grande.

Percorso verso la soluzione:

Ho avviato il download del torrent. Quando lo spazio libero era quasi esaurito, ho messo in pausa il download. Ho collegato il tablet al PC e ho spostato il file dal tablet al PC. Ho fatto una pausa e con mia sorpresa il file è stato creato di nuovo e il torrent ha continuato a scaricarsi come se nulla fosse successo.

Poiché il client torrent imposta il flag sparse sul file in cui scrive i dati ricevuti, il sistema non tenta di riservare 16 GB contemporaneamente e non si verificherà un errore quando si tenta di scrivere su un file oltre i 4 GB.

Dopo aver ripetuto la procedura quattro volte, ho ricevuto sul mio PC quattro file contenenti parti diverse dello stesso torrent. Adesso non resta che metterli insieme. La procedura è essenzialmente semplice. È necessario sostituire gli zero byte con un altro valore se esiste in una determinata posizione in uno dei quattro file.

Mi è sembrato che un programma così semplice dovesse essere su Internet. Nessuno ha mai riscontrato un problema del genere? Ma mi sono reso conto che non so nemmeno con quali parole chiave cercarlo. Pertanto, ho creato rapidamente uno script Lua per questa attività e ora l'ho ottimizzato. Questo è ciò che voglio condividere.

Scaricare il torrent in parti

  1. inizia a scaricare il torrent sul primo dispositivo
  2. attendere fino al riempimento della ROM
  3. mettere in pausa il download
  4. trasferire il file sul secondo dispositivo e aggiungere un numero al nome del file
  5. torniamo al primo punto finché il file non viene scaricato completamente

Unione di parti in un unico file

Dopo aver ricevuto l'ultima parte, è necessario raccoglierli in un unico file.

Il compito è semplice:

  1. Leggere tutte le parti contemporaneamente
  2. Se in qualche parte la posizione non è un byte zero, lo scriviamo sull'output, altrimenti scriviamo zero

Funzione merge_part accetta una serie di thread streams_in di cui si legge una porzione di dimensione buffer_length e restituisce il risultato dell'unione di parti di thread diversi.

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("[^ ]")   -- есть данные в in_part
                and out_part:find(" ", 1, true) -- есть пустые места в out_part
            then 
                local find_index = 1
--[[

Funzione string.gsub è adatto al compito perché troverà i pezzi pieni di zeri e consegnerà ciò che gli viene dato.

--]]
                out_part = out_part:gsub(" +", function(zero_string)

                    if #in_part < find_index then
                        return -- не на что менять
                    end
--[[

string.gsub non indica la posizione in cui è stata trovata la corrispondenza. Pertanto, eseguiamo una ricerca parallela della posizione zero_string utilizzando la funzione string.find. È sufficiente trovare il primo byte zero.

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

--[[

Ora, se dentro in_part ci sono dati per out_part copiarli.

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

Taglia da in_part parte corrispondente alla sequenza di zeri.

--]]
                        local part = in_part:sub(start_index, end_index)

                        if (part:byte(1) ~= 0) or part:find("[^ ]") then
--[[

В part ci sono dati.

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

part risultò essere inferiore a una sequenza di zeri. Completiamolo con loro.

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

conclusione

Pertanto, abbiamo potuto scaricare e assemblare questo file su un PC. Dopo la fusione, ho estratto il file torrent dal tablet. Ho installato un client torrent sul mio PC e ho controllato il file con esso.

L'ultima parte scaricata sul tablet può essere lasciata nella distribuzione, ma è necessario abilitare il ricontrollo delle parti precedenti e deselezionare il file in modo che non venga scaricato nuovamente.

Usato:

  1. Client torrent flud su tablet.
  2. Client torrent qBittorent sul PC.
  3. La sceneggiatura di Lua

Fonte: habr.com

Aggiungi un commento