Een torrent van 16 GB downloaden via een tablet met 4 GB vrije ruimte

Een torrent van 16 GB downloaden via een tablet met 4 GB vrije ruimte

doelstelling:

Er is een pc zonder internet, maar het is mogelijk om het bestand via USB over te zetten. Er is een tablet met internet waarvandaan dit bestand kan worden overgedragen. Je kunt de benodigde torrent downloaden op je tablet, maar er is niet genoeg vrije ruimte. Het bestand in de torrent is één en groot.

Pad naar oplossing:

Ik startte de torrent om te downloaden. Toen de vrije ruimte bijna verdwenen was, heb ik de download gepauzeerd. Ik heb de tablet op de pc aangesloten en het bestand van de tablet naar de pc verplaatst. Ik pauzeerde even en tot mijn verbazing werd het bestand opnieuw aangemaakt en ging de torrent verder met downloaden alsof er niets was gebeurd.

Vanwege het feit dat de torrent-client de sparse-vlag instelt op het bestand waarin het de ontvangen gegevens schrijft, probeert het systeem niet in één keer 16 GB te reserveren en zal er geen fout optreden bij het schrijven naar een bestand groter dan 4 GB.

Nadat ik de procedure vier keer had herhaald, ontving ik vier bestanden op mijn pc met verschillende delen van dezelfde torrent. Nu rest ons alleen nog om ze samen te voegen. De procedure is in wezen eenvoudig. U moet de nulbytes vervangen door een andere waarde als deze op een bepaalde positie in een van de vier bestanden voorkomt.

Het leek mij dat zo'n eenvoudig programma op internet zou moeten staan. Heeft niemand ooit zo'n probleem ondervonden? Maar ik realiseerde me dat ik niet eens weet op welke trefwoorden ik moet zoeken. Daarom heb ik snel een Lua-script voor deze taak gemaakt en nu heb ik het geoptimaliseerd. Dit is wat ik wil delen.

Download de torrent in delen

  1. begin met het downloaden van de torrent op het eerste apparaat
  2. wacht tot het ROM gevuld is
  3. pauzeer het downloaden
  4. breng het bestand over naar het tweede apparaat en voeg een nummer toe aan de bestandsnaam
  5. we keren terug naar het eerste punt totdat het bestand volledig is gedownload

Onderdelen samenvoegen tot één bestand

Nadat het laatste deel is ontvangen, is het noodzakelijk om ze in één geheel bestand te verzamelen.

De taak is eenvoudig:

  1. Alle delen in één keer lezen
  2. Als de positie op een bepaald moment geen nulbyte is, schrijven we deze naar de uitvoer, anders schrijven we nul

Functie merge_part accepteert een reeks threads streams_in waarvan een gedeelte van de grootte wordt gelezen buffer_length en retourneert het resultaat van het samenvoegen van delen uit verschillende threads.

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

Functie string.gsub is geschikt voor de taak omdat het stukken met nullen zal vinden en zal afleveren wat hem wordt gegeven.

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

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

string.gsub geeft niet de positie weer waarop de match werd gevonden. Daarom zoeken we parallel naar de positie zero_string de functie gebruiken: string.find. Het is voldoende om de eerste nulbyte te vinden.

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

--[[

Als nu binnen in_part Er zijn gegevens voor out_part kopieer ze.

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

Knip uit in_part deel dat overeenkomt met de reeks nullen.

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

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

В part er zijn gegevens.

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

part bleek minder te zijn dan een reeks nullen. Laten we het met hen aanvullen.

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

Conclusie

Zo konden we dit bestand downloaden en op een pc samenstellen. Na de fusie haalde ik het torrent-bestand van de tablet. Ik heb een torrent-client op mijn pc geïnstalleerd en daarmee het bestand gecontroleerd.

Het laatst gedownloade onderdeel op de tablet kan op de distributie blijven staan, maar u moet het opnieuw controleren van de onderdelen daarvoor inschakelen en het bestand uitschakelen zodat het niet opnieuw wordt gedownload.

Gebruikt:

  1. Flud torrent-client op een tablet.
  2. Torrent-client qBittorent op pc.
  3. Lua-script

Bron: www.habr.com

Voeg een reactie