calendarioSeries.modelos.Serie.java Source code

Java tutorial

Introduction

Here is the source code for calendarioSeries.modelos.Serie.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package calendarioSeries.modelos;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Serializable;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
import javafx.beans.property.BooleanProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

/**
 * Modelo SERIE
 *
 * @author Cotel
 */
public class Serie implements Serializable {

    private static final String BASE = "https://www.omdbapi.com/?";

    private String titulo;
    private String id;
    private String description;
    private Capitulo[][] capitulos;
    //    private String[][] capitulos;
    //    private boolean[][] vistos;
    private int temporadas;
    //private JSONObject json;
    private String urlImagen;
    private String year;

    //private StringProperty tituloProperty;

    /**
     * Constructor Serie
     * @param id = id de Imdb de la serie a instanciar
     */
    public Serie(String id) {
        this.id = id;
        try {
            String toJson = readUrl(BASE + "i=" + id + "&type=series" + "&plot=short" + "&r=json");
            JSONObject json = new JSONObject(toJson);

            if (json.getString("Response").equals("True")) {
                this.titulo = json.getString("Title");
                this.description = json.getString("Plot");
                //this.tituloProperty = new SimpleStringProperty(titulo);
                this.urlImagen = json.getString("Poster");
                this.year = json.getString("Year");

                boolean next = true;
                int temporada = 1;
                int caps = 0;
                JSONObject aux;
                while (next) {
                    aux = new JSONObject(readUrl(BASE + "i=" + id + "&Season=" + temporada + "&r=json"));
                    if (!aux.getString("Response").equals("False")) {
                        temporada++;
                        int actual = aux.getJSONArray("Episodes").length();
                        if (actual > caps)
                            caps = actual;
                    } else {
                        next = false;
                        temporada--;
                    }
                }

                this.temporadas = temporada;
                if (this.temporadas != 0) {
                    this.capitulos = new Capitulo[temporadas][caps];
                    //this.vistos = new boolean[temporadas][caps];
                    for (int i = 0; i < capitulos.length; i++) {
                        aux = new JSONObject(readUrl(BASE + "i=" + id + "&Season=" + (i + 1) + "&r=json"));
                        JSONArray listaCaps = aux.getJSONArray("Episodes");
                        for (int j = 0; j < capitulos[i].length; j++) {
                            try {
                                capitulos[i][j] = new Capitulo(listaCaps.getJSONObject(j).getString("Title"),
                                        listaCaps.getJSONObject(j).getString("Released"), false);
                            } catch (JSONException e) {
                                capitulos[i][j] = new Capitulo("N/A", "N/A", false);
                            }
                        }
                    }
                } else {
                    this.capitulos = null;
                }
            }
        } catch (JSONException ex) {
            ex.printStackTrace();
        }
    }

    /**
     * getCapitulosMes
     * Mtodo que devuelve un diccionario con los dias en que se publicarn
     * captulos de la serie en este mes y sus ttulos.
     * @param ano = numero de ao
     * @param mes = numero de mes
     * @return Map<Integer, String> donde el primer valor es el dia y el segundo
     * el nombre del captulo.
     */
    public Map<Integer, String> getCapitulosMes(int ano, int mes) {
        Map<Integer, String> capitulosMes = new HashMap<Integer, String>();

        if (this.temporadas == 0) {
            return capitulosMes;
        }

        for (int i = 0; i < capitulos[temporadas - 1].length; i++) {
            if (capitulos[temporadas - 1][i] != null) {
                String fecha = capitulos[temporadas - 1][i].getFecha().get();
                if (!fecha.equals("N/A")) {
                    String[] detalle = fecha.split("-");
                    if (Integer.parseInt(detalle[0]) == ano && Integer.parseInt(detalle[1]) == mes
                            && capitulosMes.containsKey(Integer.parseInt(detalle[2]))) {
                        String existing = capitulosMes.get(Integer.parseInt(detalle[2]));
                        capitulosMes.put(Integer.parseInt(detalle[2]),
                                existing + "\n" + capitulos[temporadas - 1][i].getTitulo().get());
                    } else if (Integer.parseInt(detalle[0]) == ano && Integer.parseInt(detalle[1]) == mes) {
                        capitulosMes.put(Integer.parseInt(detalle[2]),
                                capitulos[temporadas - 1][i].getTitulo().get());
                    }
                }
            }
        }

        return capitulosMes;
    }

    /**
     * readUrl
     * Mtodo que lee una url y devuelve la respuesta HTTP
     * @param stringUrl = Url a leer
     * @return String con la respuesta HTTP de la url.
     */
    private String readUrl(String stringUrl) {
        BufferedReader reader = null;
        try {
            URL url = new URL(stringUrl);
            try {
                reader = new BufferedReader(new InputStreamReader(url.openStream(), StandardCharsets.UTF_8));
                StringBuffer buffer = new StringBuffer();
                int read;
                char[] chars = new char[1024];
                while ((read = reader.read(chars)) != -1)
                    buffer.append(chars, 0, read);
                reader.close();
                return buffer.toString();
            } catch (IOException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * setVistosHasta
     * Mtodo que modifica el array de booleanos que representa que captulos
     * han sido vistos por el usuario hasta la temporada y captulo introducidos.
     * @param temporada = numero de temporada
     * @param cap  = numero de capitulo
     */
    public void setVistosHasta(int temporada, int cap) {
        for (int i = 0; i <= temporada; i++) {
            if (i < temporada) {
                for (int j = 0; j < capitulos[i].length; j++) {
                    capitulos[i][j].getVisto().set(true);
                }
            } else {
                for (int j = 0; j <= cap; j++) {
                    capitulos[i][j].getVisto().set(true);
                }
            }
        }
    }

    /**
     * Getters y Setters
     */
    public int[] getLastVisto() {
        int[] res = { 0, 0 };
        for (int i = 0; i < this.capitulos.length; i++) {
            for (int j = 0; j < this.capitulos[i].length; j++) {
                if (!this.capitulos[i][j].getVisto().getValue()) {
                    res[0] = i;
                    res[1] = j;
                    return res;
                }
            }
        }
        return res;
    }

    public String getTitulo() {
        return titulo;
    }

    public String getUrlImagen() {
        return urlImagen;
    }

    public String getYear() {
        return this.year;
    }

    public String getDescription() {
        return this.description;
    }

    public String getId() {
        return this.id;
    }

    //    public boolean[][] getVistos() {
    //        return this.vistos;
    //    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
        //this.tituloProperty.setValue(titulo);
    }

    public Capitulo[][] getCapitulos() {
        return capitulos;
    }

    //    public StringProperty getTituloProperty() {
    //        return tituloProperty;
    //    }

    public void setCapitulos(Capitulo[][] capitulos) {
        this.capitulos = capitulos;
    }

    public int getTemporadas() {
        return temporadas;
    }

    public void setTemporadas(int temporadas) {
        this.temporadas = temporadas;
    }

    public boolean equals(Serie serie) {
        if (this.id.equals(serie.getId())) {
            if (this.titulo.equals(serie.getTitulo())) {
                if (this.year.equals(serie.getYear())) {
                    if (this.temporadas == serie.getTemporadas()) {
                        return true;
                    }
                }
            }
        }
        return false;
    }

    //    public static void main(String[] args) {
    //        Serie arrow = new Serie("tt3107288");
    //        arrow.setVistosHasta(2, 14);
    //        for(int i=0; i<arrow.getTemporadas(); i++) {
    //            for(int j=0; j<arrow.getVistos()[i].length; j++) {
    //                System.out.printf("%02dx%02d " + arrow.getVistos()[i][j] + "\n", i+1, j+1);
    //            }
    //        }
    //        
    //    }

}