16 GB torrenta lejupielāde, izmantojot planšetdatoru ar 4 GB brīvas vietas

16 GB torrenta lejupielāde, izmantojot planšetdatoru ar 4 GB brīvas vietas

Uzdevums:

Ir dators bez interneta, bet ir iespēja pārsūtīt failu caur USB. Ir planšetdators ar internetu, no kura var pārsūtīt šo failu. Planšetdatorā varat lejupielādēt nepieciešamo torrentu, taču nav pietiekami daudz brīvas vietas. Torrentā esošais fails ir viens un liels.

Ceļš uz risinājumu:

Es sāku lejupielādēt torrentu. Kad brīvās vietas gandrīz vairs nebija, es apturēju lejupielādi. Es savienoju planšetdatoru ar datoru un pārvietoju failu no planšetdatora uz datoru. Es apstājos, un man par pārsteigumu fails tika izveidots vēlreiz, un torrents turpināja lejupielādi, it kā nekas nebūtu noticis.

Sakarā ar to, ka torrent klients failam, kurā ieraksta saņemtos datus, iestata retu karogu, sistēma nemēģina rezervēt 16 GB uzreiz un, mēģinot rakstīt failā, kas pārsniedz 4 GB, kļūda neradīsies.

Atkārtojot procedūru četras reizes, es savā datorā saņēmu četrus failus, kas satur dažādas viena un tā paša torrenta daļas. Tagad atliek tikai tos salikt kopā. Procedūra būtībā ir vienkārša. Nulles baiti ir jāaizstāj ar citu vērtību, ja tā atrodas noteiktā pozīcijā vienā no četriem failiem.

Man šķita, ka tik vienkāršai programmai vajadzētu būt internetā. Vai neviens ar šādu problēmu nav saskāries? Bet es sapratu, ka pat nezinu, pēc kādiem atslēgvārdiem to meklēt. Tāpēc es ātri izveidoju Lua skriptu šim uzdevumam un tagad esmu to optimizējis. Tas ir tas, ko es vēlos dalīties.

Torrenta lejupielāde pa daļām

  1. sāciet lejupielādēt torrentu pirmajā ierīcē
  2. pagaidiet, līdz ROM ir pilna
  3. apturēt lejupielādi
  4. pārsūtiet failu uz otru ierīci un pievienojiet faila nosaukumam numuru
  5. mēs atgriežamies pie pirmā punkta, līdz fails ir pilnībā lejupielādēts

Daļu apvienošana vienā failā

Pēc pēdējās daļas saņemšanas tās jāsavāc vienā veselā failā.

Uzdevums ir vienkāršs:

  1. Visu daļu lasīšana vienlaikus
  2. Ja kādā daļā pozīcija nav nulles baits, tad ierakstām to izvadā, pretējā gadījumā rakstām nulli

Funkcija merge_part pieņem virkni pavedienu streams_in no kuriem nolasa lieluma daļu buffer_length un atgriež dažādu pavedienu daļu sapludināšanas rezultātu.

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 ir piemērots uzdevumam, jo ​​tas atradīs gabalus, kas piepildīti ar nullēm, un nogādās to, kas tam ir dots.

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

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

string.gsub nenorāda pozīciju, kurā tika atrasta atbilstība. Tāpēc veicam paralēlu pozīcijas meklēšanu zero_string izmantojot funkciju string.find. Pietiek, lai atrastu pirmo nulles baitu.

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

--[[

Tagad, ja iekšā in_part ir dati par out_part kopēt tos.

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

Izgriezt no in_part daļu, kas atbilst nulles secībai.

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

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

В part ir dati.

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

part izrādījās mazāks par nulles secību. Papildināsim to ar tiem.

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

Secinājums

Tādējādi mēs varējām lejupielādēt un apkopot šo failu datorā. Pēc apvienošanas es izvilku torrent failu no planšetdatora. Es savā datorā instalēju torrent klientu un pārbaudīju failu ar to.

Pēdējo planšetdatorā lejupielādēto daļu var atstāt izplatīšanā, taču pirms šīs daļas ir jāiespējo atkārtota daļu pārbaude un jānoņem atzīme failam, lai tas vairs netiktu lejupielādēts.

Lietots:

  1. Flud torrent klients planšetdatorā.
  2. Torrent klients qBittorent datorā.
  3. Lua skripts

Avots: www.habr.com

Pievieno komentāru