Télécharger 16 Go de torrent via tablette avec 4 Go d'espace libre


DĂ©fi:


Il y a 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é. Sur la tablette, vous pouvez télécharger le torrent souhaité mais pas assez d'espace libre. Le fichier dans le torrent est unique et volumineux.


Chemin vers la solution:


J'ai commencé le torrent à télécharger. Lorsque l'espace libre a presque pris fin, 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. Il marqua une pause et, à ma grande surprise, le fichier fut de nouveau créé et le torrent continua de se balancer plus loin comme si de rien n'était.


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


Répétant la procédure quatre fois, j'ai reçu quatre fichiers sur le PC dans lesquels différentes parties du même torrent. Reste maintenant à les assembler. La procédure est essentiellement simple. Il est nécessaire de remplacer zéro octet par une autre valeur s'il se trouve à cette position dans l'un des quatre fichiers.


Il me semblait qu'un programme aussi simple devrait être sur Internet. Vraiment personne n'a fait face à une telle tâche? Mais j'ai réalisé que je ne savais même pas quels mots clés rechercher. Par conséquent, j'ai rapidement lancé un script Lua pour cette tâche et maintenant je l'ai optimisé. Je veux le partager.


Télécharger torrent en plusieurs parties


  1. commencer à télécharger torrent sur le premier appareil
  2. attendez que la ROM soit remplie
  3. interrompre le téléchargement
  4. transférer le fichier vers le deuxième appareil et ajouter un chiffre au nom du fichier
  5. revenir 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 dans un fichier entier.


La tâche est simple:


  1. Lisez toutes les pièces en même temps
  2. Si dans une partie de la position, l'octet non nul est écrit dans la sortie, sinon nous écrivons zéro

La fonction merge_part prend un tableau de flux streams_in partir duquel elle lit une partie de la taille buffer_length et renvoie le résultat de la fusion de parties de différents flux.


 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("[^\0]") --    in_part and out_part:find("\0", 1, true) --     out_part then local find_index = 1 --[[ 

La fonction string.gsub convient à la tâche car elle trouvera des morceaux remplis de zéros et mettra ce qui lui est transmis.


 --]] out_part = out_part:gsub("\0+", function(zero_string) if #in_part < find_index then return --     end --[[ 

string.gsub ne passe pas la position à laquelle une correspondance a été trouvée. Par conséquent, nous faisons une recherche parallèle pour la position zero_string utilisant la fonction string.find . Il suffit de trouver le premier octet zéro.


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

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


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

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


 --]] local part = in_part:sub(start_index, end_index) if (part:byte(1) ~= 0) or part:find("[^\0]") then --[[ 

Il y a des données en part .


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

part s'est avérée inférieure à une séquence de zéros. Nous le complétons 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, il a été possible de télécharger et d'assembler ce fichier sur un PC. Après la fusion, j'ai sorti un fichier torrent de la tablette. J'ai installé le client torrent sur le PC et vérifié le fichier avec.


La dernière partie téléchargée sur la tablette peut être laissée sur la distribution, mais vous devez activer la vérification répétée des parties avant cela et décocher le fichier afin qu'il ne se télécharge plus.


Utilisé:


  1. Client Torrent Flud sur la tablette.
  2. Client torrent QBittorent sur PC.
  3. Script Lua

Source: https://habr.com/ru/post/fr473636/


All Articles