Téléchargement d'un torrent de 16 Go via une tablette avec 4 Go d'espace libre

Téléchargement d'un torrent de 16 Go via une tablette avec 4 Go d'espace libre

Tâche

Il existe un PC sans Internet, mais il est possible de transférer le fichier via USB. Il existe une tablette avec Internet à partir de laquelle ce fichier peut être transféré. Vous pouvez télécharger le torrent requis sur votre tablette, mais il n'y a pas assez d'espace libre. Le fichier du torrent est unique et volumineux.

Chemin vers la solution :

J'ai lancé le torrent pour télécharger. Lorsque l’espace libre a presque disparu, j’ai interrompu le téléchargement. J'ai connecté la tablette au PC et déplacé le fichier de la tablette vers le PC. J'ai fait une pause et, à ma grande surprise, le fichier a été créé à nouveau et le torrent a continué à se télécharger comme si de rien n'était.

Étant donné que le client torrent définit l'indicateur clairsemé sur le fichier dans lequel il écrit les données reçues, le système n'essaie pas de réserver 16 Go à la fois et aucune erreur ne se produira lors de la tentative d'écriture dans un fichier au-delà de 4 Go.

Après avoir répété la procédure quatre fois, j'ai reçu quatre fichiers sur mon PC contenant différentes parties du même torrent. Il ne reste plus qu'à les assembler. La procédure est essentiellement simple. Vous devez remplacer les zéros octets par une autre valeur si elle existe à une position donnée dans l'un des quatre fichiers.

Il m'a semblé qu'un programme aussi simple devrait être sur Internet. Personne n'a jamais rencontré un tel problème ? Mais j’ai réalisé que je ne savais même pas sur quels mots-clés rechercher. Par conséquent, j'ai rapidement créé un script Lua pour cette tâche et je l'ai maintenant optimisé. C'est ce que je veux partager.

Télécharger le torrent en plusieurs parties

  1. commencez à télécharger le torrent sur le premier appareil
  2. attends que la ROM soit remplie
  3. suspendre le téléchargement
  4. transférer le fichier sur le deuxième appareil et ajouter un numéro au nom du fichier
  5. on revient au premier point jusqu'à ce que le fichier soit complètement téléchargé

Fusionner des pièces en un seul fichier

Une fois la dernière partie reçue, il est nécessaire de les rassembler en un seul fichier.

La tâche est simple :

  1. Lire toutes les parties en même temps
  2. Si dans une partie la position n'est pas un octet zéro, alors nous l'écrivons sur la sortie, sinon nous écrivons zéro

Fonction merge_part accepte un tableau de threads streams_in dont lit une partie de la taille buffer_length et renvoie le résultat de la fusion de parties de différents 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
--[[

Fonction string.gsub est adapté à la tâche car il trouvera des pièces remplies de zéros et fournira ce qui lui est donné.

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

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

string.gsub ne transmet pas la position à laquelle la correspondance a été trouvée. Nous effectuons donc une recherche parallèle du poste zero_string en utilisant la fonction string.find. Il suffit de trouver le premier octet zéro.

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

--[[

Maintenant, si dans in_part il y a des données pour out_part copiez-les.

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

Couper de in_part partie correspondant à la séquence de zéros.

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

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

В part il y a des données.

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

part s'est avéré être inférieur à une séquence de zéros. Complétons-le avec eux.

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

Conclusion

Ainsi, nous avons pu télécharger et assembler ce fichier sur un PC. Après la fusion, j'ai retiré le fichier torrent de la tablette. J'ai installé un client torrent sur mon PC et vérifié le fichier avec.

La dernière partie téléchargée sur la tablette peut être laissée en distribution, mais vous devez activer la revérification des parties avant cela et décocher le fichier afin qu'il ne soit pas téléchargé à nouveau.

Utilisé:

  1. Client torrent Flud sur tablette.
  2. Client torrent qBittorent sur PC.
  3. Script Lua

Source: habr.com

Ajouter un commentaire