Preuzimanje torrenta od 16 GB putem tableta sa 4 GB slobodnog prostora

Preuzimanje torrenta od 16 GB putem tableta sa 4 GB slobodnog prostora

Zadatak:

Postoji PC bez interneta, ali je moguće prenijeti fajl preko USB-a. Postoji tablet sa internetom sa kojeg se ovaj fajl može prenijeti. Možete preuzeti potreban torrent na svoj tablet, ali nema dovoljno slobodnog prostora. Fajl u torentu je jedan i veliki.

Put do rješenja:

Pokrenuo sam torrent za preuzimanje. Kada je slobodan prostor skoro nestao, pauzirao sam preuzimanje. Povezao sam tablet sa računarom i premestio fajl sa tableta na računar. Zastao sam i na moje iznenađenje fajl je ponovo kreiran, a torrent je nastavio da se preuzima kao da se ništa nije dogodilo.

Zbog činjenice da torrent klijent postavlja oznaku sparse na fajl u koji upisuje primljene podatke, sistem ne pokušava da rezerviše 16GB odjednom i neće doći do greške kada pokušate da upišete u fajl veći od 4GB.

Nakon što sam četiri puta ponovio proceduru, dobio sam četiri fajla na svom računaru koji sadrže različite delove istog torrenta. Sada ostaje samo da ih spojite. Procedura je u suštini jednostavna. Morate zamijeniti nulte bajtove drugom vrijednošću ako postoji na datoj poziciji u jednoj od četiri datoteke.

Činilo mi se da bi tako jednostavan program trebao biti na internetu. Zar se niko nikada nije susreo sa takvim problemom? Ali shvatio sam da čak ni ne znam koje ključne riječi da tražim. Stoga sam brzo kreirao Lua skriptu za ovaj zadatak i sada sam je optimizovao. Ovo je ono što želim podijeliti.

Preuzimanje torrenta u dijelovima

  1. počnite da preuzimate torrent na prvom uređaju
  2. sačekajte da se ROM popuni
  3. pauzirajte preuzimanje
  4. prenesite datoteku na drugi uređaj i dodajte broj imenu datoteke
  5. vraćamo se na prvu tačku dok se datoteka ne preuzme u potpunosti

Spajanje delova u jedan fajl

Nakon što je zadnji dio primljen, potrebno ih je sakupiti u jedan cijeli fajl.

Zadatak je jednostavan:

  1. Čitanje svih dijelova odjednom
  2. Ako u nekom dijelu pozicija nije nula bajt, onda je upisujemo na izlaz, u suprotnom pišemo nulu

funkcija merge_part prihvata niz niti streams_in od kojih glasi dio veličine buffer_length i vraća rezultat spajanja dijelova iz različitih niti.

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

funkcija string.gsub je pogodan za zadatak jer će pronaći komade ispunjene nulama i isporučiti ono što mu je dato.

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

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

string.gsub ne prenosi poziciju na kojoj je pronađena utakmica. Stoga radimo paralelnu pretragu pozicije zero_string koristeći funkciju string.find. Dovoljno je pronaći prvi nulti bajt.

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

--[[

Sada ako uđete in_part postoje podaci za out_part kopirajte ih.

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

Cut from in_part dio koji odgovara nizu nula.

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

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

В part postoje podaci.

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

part pokazalo se da je manji od niza nula. Hajde da to dopunimo njima.

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

zaključak

Tako smo uspjeli preuzeti i sastaviti ovu datoteku na PC. Nakon spajanja, izvukao sam torrent fajl sa tableta. Instalirao sam torrent klijent na svoj PC i provjerio fajl sa njim.

Zadnji preuzeti dio na tabletu možete ostaviti na distribuciji, ali prije toga morate omogućiti ponovnu provjeru dijelova i poništiti oznaku datoteke kako se ne bi ponovo preuzimala.

Korišteno:

  1. Flud torrent klijent na tabletu.
  2. Torrent klijent qBittorent na PC-u.
  3. Lua skripta

izvor: www.habr.com

Dodajte komentar