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

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

cilj:

Postoji računalo bez interneta, ali je moguće prenijeti datoteku putem USB-a. Postoji tablet s internetom s kojeg se može prenijeti ova datoteka. Možete preuzeti traženi torrent na svom tabletu, ali nema dovoljno slobodnog prostora. Datoteka u torentu je jedna i velika.

Put do rješenja:

Pokrenuo sam torrent za preuzimanje. Kad je gotovo nestalo slobodnog prostora, pauzirao sam preuzimanje. Spojio sam tablet na računalo i premjestio datoteku s tableta na računalo. Zastao sam i na moje iznenađenje datoteka se ponovno stvorila, a torrent se nastavio preuzimati kao da se ništa nije dogodilo.

Zbog činjenice da torrent klijent postavlja sparse oznaku na datoteku u koju upisuje primljene podatke, sustav ne pokušava rezervirati 16 GB odjednom i neće se pojaviti pogreška pri pokušaju pisanja u datoteku veću od 4 GB.

Nakon što sam postupak ponovio četiri puta, dobio sam četiri datoteke na računalu koje sadrže različite dijelove istog torrenta. Sada samo preostaje da ih sastavite. Postupak je u biti jednostavan. Morate zamijeniti nulte bajtove drugom vrijednošću ako postoji na danom mjestu u jednoj od četiri datoteke.

Činilo mi se da bi takav jednostavan program trebao biti na Internetu. Zar se nitko nikada nije susreo s takvim problemom? Ali shvatio sam da ne znam ni koje ključne riječi da tražim. Stoga sam brzo izradio Lua skriptu za ovaj zadatak i sada sam je optimizirao. Ovo je ono što želim podijeliti.

Skidanje torrenta u dijelovima

  1. počnite preuzimati torrent na prvom uređaju
  2. pričekajte dok se ROM ne napuni
  3. pauzirajte preuzimanje
  4. prenesite datoteku na drugi uređaj i dodajte broj nazivu datoteke
  5. vraćamo se na prvu točku dok se datoteka u potpunosti ne preuzme

Spajanje dijelova u jednu datoteku

Nakon što je zadnji dio primljen, potrebno ih je prikupiti u jednu cijelu datoteku.

Zadatak je jednostavan:

  1. Čitanje svih dijelova odjednom
  2. Ako u nekom dijelu pozicija nije nulti bajt, tada to ispisujemo na izlazu, u suprotnom ispisujemo nulu

Funkcija merge_part prihvaća 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 prikladan je za zadatak jer će pronaći dijelove ispunjene nulama i isporučiti ono što mu se da.

--]]
                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đeno podudaranje. Stoga paralelno tražimo poziciju 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 in_part postoje podaci za out_part kopirajte ih.

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

Izrezano iz 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 ima podataka.

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

part ispostavilo se da je manji od niza nula. Dopunimo ga 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 mogli preuzeti i sastaviti ovu datoteku na računalu. Nakon spajanja, izvukao sam torrent datoteku s tableta. Instalirao sam torrent klijent na svoje računalo i pomoću njega provjerio datoteku.

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 ponovno preuzimala.

Koristi se:

  1. Flud torrent klijent na tabletu.
  2. Torrent klijent qBittorent na računalu.
  3. Lua skripta

Izvor: www.habr.com

Dodajte komentar