Google Books Downloader

Google Books Downloader

Si siempre quisiste descargarte algun libro de google books, para leerlo en otro computador sin internet, o solo para mas comodidad, pues aqui esta Google Books Downloader, y lo mejor de todo esta en JAVA. Desarrollado por Michael Manjarres en colaboracion con Java Zone.

Lo que tienen que hacer es coger el link de enlace del libro como se muestra en la imagen y pegarla en el programa y presionar el boton descargar y listo!!!

Algunas imagenes para ver su funcionamiento

Si deseas descargarlo puedes hacerlo directamente desde aqui.

Codigo

Clase Principal

package googlebooks;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.*;
import javax.swing.UnsupportedLookAndFeelException;

public class Principal extends JFrame{

    JDesktopPane escritorio;
    int nlibrosdescargando=0;
    int nlibrosdescargados=0;

    public Principal() {
     
     try {
      UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
      } catch (ClassNotFoundException e) {
       e.printStackTrace();
      } catch (InstantiationException e) {
       e.printStackTrace();
      } catch (IllegalAccessException e) {
       e.printStackTrace();
      } catch (UnsupportedLookAndFeelException e) {
       e.printStackTrace();
      }
     
     escritorio=new JDesktopPane();
     
     JMenuBar barra=new JMenuBar();
     JMenu archivo=new JMenu("Archivo");
     JMenuItem agregar=new JMenuItem("Agregar");
     agregar.addActionListener(new ActionListener(){

   @Override
   public void actionPerformed(ActionEvent e) {
    final HiloDescargador hd=new HiloDescargador();
    nlibrosdescargando++;
    JInternalFrame libro=new JInternalFrame("Libro "+nlibrosdescargando,true,true,true,true);
    final JProgressBar bar;
       JButton descargar,cancelar;
       final JTextField pagina;
       JPanel p=new JPanel();
       p.setLayout(new FlowLayout());
    bar = new JProgressBar();
          bar.setVisible(false);
          descargar = new JButton("Descargar");
          cancelar=new JButton("Cancelar");
          pagina = new JTextField(30);
          p.add(pagina);
          p.add(descargar);
          p.add(cancelar);
          p.add(bar);
          libro.add(p);

          descargar.addActionListener(new ActionListener() {

              public void actionPerformed(ActionEvent e) {
               JFileChooser selector=new JFileChooser();
               int r=selector.showSaveDialog(null);
               if(r==JFileChooser.APPROVE_OPTION){
                File f=selector.getSelectedFile();
                hd.inicializarDescarga(f.getAbsolutePath(),pagina.getText(), bar);
                hd.start();
               }
              }
          });
         
          cancelar.addActionListener(new ActionListener(){

     @Override
     public void actionPerformed(ActionEvent e) {
      hd.cancelarDescarga();
     }
           
          });
          libro.setBounds(0, 0, 350, 150);
          escritorio.add(libro);
          libro.setVisible(true);
   }
     
     });
     JMenuItem salir=new JMenuItem("Salir");
     salir.addActionListener(new ActionListener(){

   @Override
   public void actionPerformed(ActionEvent e) {
    System.exit(0);
   }
     
     });
     
     add(escritorio);
     
     archivo.add(agregar);
     archivo.add(salir);
     barra.add(archivo);
     setJMenuBar(barra);
    }

    public static void main(String arg[]){
     Principal p=new Principal();
     p.setVisible(true);
     p.setBounds(0,0,400,300);
     p.setLocationRelativeTo(null);
     p.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
}

Clase HiloDescargador

package googlebooks;

import com.itextpdf.text.*;
import com.itextpdf.text.pdf.*;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;
import javax.swing.JProgressBar;

public class HiloDescargador extends Thread{

   
    ArrayList<String> paginas;
    Document document;
    int p=1;
    boolean sw=false, sw2=false;
    String pag1="",pag2="";
    private String d;
    private JProgressBar bar;
    String ruta="";

    public HiloDescargador() {
    }
   
    public void inicializarDescarga(String ruta,String d,JProgressBar bar){
     paginas = new ArrayList<String>();
        this.d = d;
        this.bar = bar;
        this.ruta=ruta;
    }
   
    public void cancelarDescarga(){
     this.stop();
     bar.setString("Cancelado");
     JOptionPane.showMessageDialog(null, "Se ha cancelado la descarga del libro");
    }

    @Override
    public void run() {
        try {
            URL dir = new URL(d);
            URLConnection yc = connecion(dir);
            document = new Document(PageSize.A3);

            while(!sw || !sw2){
                if(yc!=null){
                    String texto = leer(yc);
                    if(!sw){
                        paginas(texto,dir);
                        bar.setMinimum(0);
                        bar.setMaximum(paginas.size());
                        bar.setStringPainted(true);
                        bar.setVisible(true);
                        PdfWriter.getInstance(document,new FileOutputStream(ruta));
                        document.open();
                        sw=true;
                    }
                    buscar(texto);
                    yc = SgtPagina();
                    bar.setValue(p);
                    p++;
                }
           }

            document.close();
            bar.setString("Descargado");

        } catch (MalformedURLException ex) {
            JOptionPane.showMessageDialog(null,"No parece ser una direccion web...");
        }catch(IOException ex){
            JOptionPane.showMessageDialog(null,"No parece ser un libro de Google...");
        }catch(DocumentException ex){
            JOptionPane.showMessageDialog(null,"Error en el documento...");
        }catch(Exception ex){
            JOptionPane.showMessageDialog(null,"A ocurrido un ERROR...");
        }
    }

    public String leer(URLConnection yc) throws IOException{
            BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream()));
            String inputLine;
            String retorno = "";
            while ((inputLine = in.readLine()) != null) {
                retorno += inputLine + "\n";
            }
            in.close();
            return retorno;
    }

    public void buscar(String texto){
        int i=0;
        int j=0;
        while(i!=texto.length()){
            if(i+18<texto.length() && !texto.substring(i, i+17).equals("preloadImg.src = ")){
                i++;
            }else{
                    i += 18;
                    j = i;
                    while (j < texto.length() && !texto.substring(j, j + 1).equals("'")) {
                        j++;
                    }
                    System.out.print(texto.substring(i, j)+"\n");
                    gFoto(texto.substring(i, j));
                    i = j;
                    break;
            }
        }
    }
   
    public URLConnection SgtPagina(){
        URL url=null;
        if(!paginas.isEmpty()){
            try {
                url = new URL(pag1 + (paginas.get(0)) + pag2);
                paginas.remove(0);
            } catch (MalformedURLException ex) {
                Logger.getLogger(HiloDescargador.class.getName()).log(Level.SEVERE, "", ex);
            }
        }else{
            sw2=true;
        }
        return connecion(url);
    }

    public void paginas(String texto,URL dir){
        String url = dir.toString();
        boolean sw=false;
        int i=0,j=0,k=0;
        while(i!=texto.length() && !texto.substring(i, i+5).equals("}],\"p")){
            if(i+9<texto.length() && !texto.substring(i, i+8).equals("\\{\"pid\":\"".substring(1, 9))){
                i++;
            }else{
                i+=8;
                j=i;
                while(j<texto.length() && !texto.substring(j, j+1).equals("\"")){
                    j++;
                }
                paginas.add(texto.substring(i, j));
                i=j;
            }
        }
        for(String w : paginas){
            System.out.print(w+"\n");
        }

        i=0;
        j=0;
       
        while (i != url.length()) {
            if (i + 21 < url.length() && !sw) {
                if (!url.substring(i, i + 20).equals("printsec=frontcover&")) {
                    i++;
                } else {
                    sw = true;
                }
            } else {
                if (sw) {
                    k = i+20;
                    j = i+19;
                    while (k != url.length()) {
                        if (k + 2 < url.length() && !url.substring(k, k + 1).equals("&")) {
                            k++;
                        } else {
                            break;
                        }
                    }
                }
                break;
            }
        }

        pag1=url.substring(0,i)+"lpg="+paginas.get(0)+url.substring(j,k+1)+"pg=";
        pag2="#v=onepage&q&f=false";
        paginas.remove(0);

        System.out.print(pag1 + (paginas.get(0)) + pag2 + "\n");
    }

    public URLConnection connecion(URL dir){
        URLConnection yc=null;
        if(dir!=null){
            try {
                yc = dir.openConnection();
                // Aquí agregamos unas cabeceras a la petición para "saltar" la seguridad de algunos sitios
                // así piensan que somos un navegador.
                yc.addRequestProperty("GET", dir.toString());
                yc.addRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.4 (KHTML, like Gecko) Chrome/5.0.375.70 Safari/533.4");
                yc.addRequestProperty("Accept", "application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5");
                yc.addRequestProperty("Accept-Charset", "ISO-8859-1,utf-8;q=0.7,*;q=0.7");
                yc.addRequestProperty("Accept-Language", "es-es,es;q=0.8,en-us;q=0.5,en;q=0.3");
                //yc.addRequestProperty("Cookie","PREF=ID=893be4845a4c5aec:TM=1271533549:LM=12715335 49:S=KCvKQcyJS2SjNm-5");
                yc.addRequestProperty("Cookie","PREF=ID=28face613556316e:TM=1184620070:LM=1184620070:S=DkEaab7_F7PtM3ZX");
                yc.addRequestProperty("Host", "books.google.com");
                yc.addRequestProperty("Connection", "keep-alive");
                //yc.setConnectTimeout(3000);

            } catch (IOException ex) {
                Logger.getLogger(HiloDescargador.class.getName()).log(Level.SEVERE, "", ex);
            }
        }
        return yc;
    }

    public void gFoto(String texto){
        try {
            URL foto = new URL(texto);
            URLConnection urlCon = connecion(foto);
            System.out.println(urlCon.getContentType());
            if(!urlCon.getContentType().toString().equals("text/html; charset=UTF-8"))
            {
                InputStream is = urlCon.getInputStream();
                ByteArrayOutputStream outputStream = new ByteArrayOutputStream(1024);
                byte [] array = new byte[1000];
                int leido = is.read(array);
                while (leido > 0) {
                   outputStream.write(array, 0, leido);
                   leido=is.read(array);
                }
                Image image2 = Image.getInstance(outputStream.toByteArray());
                PdfPTable tabla=new PdfPTable(1);
                tabla.setWidthPercentage(100);
                PdfPCell celda=new PdfPCell(image2);
                celda.setBorderColor(BaseColor.WHITE);
                celda.setHorizontalAlignment(tabla.ALIGN_CENTER);
                celda.setVerticalAlignment(tabla.ALIGN_MIDDLE);
                tabla.addCell(celda);
                document.add(tabla);
                is.close();
                outputStream.close();
            }
        } catch (Exception ex) {
            Logger.getLogger(HiloDescargador.class.getName()).log(Level.SEVERE, "", ex);
        }
    }
}

No olvides visitar

JAVA ZONE

Comentarios

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Worales se ve super bien. Y

Worales se ve super bien. Y además te deja el libro como PDF!

Preguntas:

He visto que pones tus descargas en megaupload, has considerado utilizar alguna herramienta como GitHub, BitBucket o code.google.com para alojar tus proyectos?

Este código que estas publicando no tiene una licencia explicita, lo quieres poner como open source? Deberías considerarlo.

Supongo que para correlo solo necesito este código y iText verdad? Pues a probarlo se ha dicho, antes de que Google cambie el formato en el que presenta los libros y el programa truene :) :)

¡Qué chido!

Excelente aporte

Imagen de Algus Dark

Ya no sirve?

Me pregunto si el código aun sigue funcionando. Siempre me marca "A ocurrido un error". Me tocará checarlo en casa.