Wikisource:Gallica/gallica.ml

La bibliothèque libre.
Sauter à la navigation Sauter à la recherche

Outil écrit par Pmx.

Description[modifier]

Télécharge dans la résolution la plus élevée disponible les images des livres numérisés par Gallica.

Prérequis[modifier]

Installez OCaml, Wget et ImageMagick.

Sous Windows, installez OCaml, ImageMagick et wget avec Cygwin : à l’étape select packages qui affiche une liste de programmes, tapez imagemagick dans la boîte de recherche et sélectionnez les résultats pour les installer (cochez tout dans les résultats qui s’affichent dans Graphics). De même pour OCaml (cochez tous les résultats dans le sous-menus de interpreters) et wget (une case à cocher dans les résultats, sous-menu Web).

Sous GNU/Linux, copiez le code ci-dessous dans un fichier texte que vous nommerez gallica.ml, dans le même dossier où vous lancerez le script.

Utilisation[modifier]

Pour une image :

ocaml gallica.ml <ark> <page>

Pour un livre entier :

for i in $(seq 1 dernièrepage); do ocaml gallica.ml ark $i; mv 'ark.jpg' `printf %04d $i`.jpg; done

Exemple d’ark :

Dans l’adresse : http://gallica.bnf.fr/ark:/12148/btv1b8610811c.r=.langFR, utilisez btv1b8610811c

Code[modifier]

  open Printf

  let file = Sys.argv.(1)
  let page = try int_of_string Sys.argv.(2) with _ -> 1

  let wget_address i j =
    sprintf "http://gallica.bnf.fr/proxy?method=R&ark=%s.f%i&l=7&r=%i,%i,1024,1024"
    file page (j * 1024) (i * 1024)

  let retrieve () =
    let x = ref 0 in
    let y = ref 0 in
    let break_x = ref true in
    let break_y = ref true in
    let max_x = ref 0 in
    let max_y = ref 0 in
    while !break_y do
      let test = ref false in
      let () = x := 0 in
      let () = break_x := true in
      while !break_x do
        let address = wget_address !x !y in
        let name = sprintf "%s-%02i-%02i.jpg" file !x !y in
        let command = sprintf "wget -U wikisource --quiet \"%s\" -O %s" address name in
        let ret = Sys.command command in
        if ret <> 0 then
          begin Sys.remove name; break_x := false end
        else
          begin
            max_x := max !x !max_x;
            printf "Downloaded %02i-%02i...\n%!" !x !y;
            incr x;
            test := true;
          end
      done;
      if !test then
        begin max_y := max !y !max_y; incr y end
      else
        begin break_y := false end
    done;
    (!max_x, !max_y)

  let append x y =
    printf "Appending files...\n%!";
    for j = 0 to y do
      let rec gen accu n =
        if n < 0 then accu
        else gen (sprintf "%s-%02i-%02i.jpg" file n j :: accu) (pred n)
      in
      let imgs = gen [] x in
      let cimg = String.concat " " imgs in
      let command = sprintf "convert %s +append %s-xx-%02i.jpg" cimg file j in
      if Sys.command command = 0 then List.iter Sys.remove imgs else exit 1
    done;
    let rec gen accu n =
      if n < 0 then accu
      else gen (sprintf "%s-xx-%02i.jpg" file n :: accu) (pred n)
    in
    let imgs = gen [] y in
    let cimg = String.concat " " imgs in
    let command = sprintf "convert %s -append %s.jpg" cimg file in
    if Sys.command command = 0 then List.iter Sys.remove imgs else exit 1;
    printf "Finished!\n%!";
    exit 0

  let _ =
    let (x, y) = retrieve () in
    append x y