From da1017002422a7bc7a5fb20d7b3dcf08b2220aae Mon Sep 17 00:00:00 2001 From: kelvin012 Date: Sat, 30 Jul 2022 01:22:49 -0300 Subject: [PATCH] Aula 3 --- .gitignore | 3 ++ src/Apod.java | 17 ++++++++ src/ClienteHttp.java | 23 +++++++++++ src/Conteudo.java | 18 +++++++++ src/ExtratorConteudo.java | 7 ++++ src/ExtratorConteudoIMDB.java | 30 ++++++++++++++ src/ExtratorConteudoNasa.java | 32 +++++++++++++++ src/Filme.java | 26 +++++------- src/JsonParser.java | 42 -------------------- src/ListaDeFilmes.java | 10 +---- src/Main.java | 51 +++++++++++------------- src/StickerGenerator.java | 61 +++++++++++++++++++++++++++++ target/classes/Filme.class | Bin 878 -> 0 bytes target/classes/JsonParser.class | Bin 2124 -> 0 bytes target/classes/ListaDeFilmes.class | Bin 679 -> 0 bytes target/classes/Main.class | Bin 3739 -> 0 bytes 16 files changed, 224 insertions(+), 96 deletions(-) create mode 100644 src/Apod.java create mode 100644 src/ClienteHttp.java create mode 100644 src/Conteudo.java create mode 100644 src/ExtratorConteudo.java create mode 100644 src/ExtratorConteudoIMDB.java create mode 100644 src/ExtratorConteudoNasa.java delete mode 100644 src/JsonParser.java create mode 100644 src/StickerGenerator.java delete mode 100644 target/classes/Filme.class delete mode 100644 target/classes/JsonParser.class delete mode 100644 target/classes/ListaDeFilmes.class delete mode 100644 target/classes/Main.class diff --git a/.gitignore b/.gitignore index cf6a31c..1e827c8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ .idea out +target +entrada +saida alura-stickers.iml \ No newline at end of file diff --git a/src/Apod.java b/src/Apod.java new file mode 100644 index 0000000..0f35b41 --- /dev/null +++ b/src/Apod.java @@ -0,0 +1,17 @@ +public class Apod { + private final String title; + private final String url; + + public Apod(String title, String url) { + this.title = title; + this.url = url; + } + + public String getTitle() { + return title; + } + + public String getUrl() { + return url; + } +} diff --git a/src/ClienteHttp.java b/src/ClienteHttp.java new file mode 100644 index 0000000..4492fdd --- /dev/null +++ b/src/ClienteHttp.java @@ -0,0 +1,23 @@ +import java.io.IOException; +import java.net.URI; +import java.net.http.HttpClient; +import java.net.http.HttpRequest; +import java.net.http.HttpResponse; + +public class ClienteHttp { + + public String buscaDados(String url) { + + try { + URI endereco = URI.create(url); + HttpClient httpClient = HttpClient.newHttpClient(); + HttpRequest request = HttpRequest.newBuilder(endereco).GET().build(); + HttpResponse response = httpClient.send(request, HttpResponse.BodyHandlers.ofString()); + return response.body(); + } catch (IOException | InterruptedException e) { + throw new RuntimeException(e); + } + + } + +} diff --git a/src/Conteudo.java b/src/Conteudo.java new file mode 100644 index 0000000..a5affad --- /dev/null +++ b/src/Conteudo.java @@ -0,0 +1,18 @@ +public class Conteudo { + private final String titulo; + private final String urlImagem; + + public Conteudo(String titulo, String urlImagem) { + this.titulo = titulo; + this.urlImagem = urlImagem; + } + + public String getTitulo() { + return titulo; + } + + public String getUrlImagem() { + return urlImagem; + } + +} diff --git a/src/ExtratorConteudo.java b/src/ExtratorConteudo.java new file mode 100644 index 0000000..3ad3849 --- /dev/null +++ b/src/ExtratorConteudo.java @@ -0,0 +1,7 @@ +import java.util.List; + +public interface ExtratorConteudo { + + List extrairConteudos(String json); + +} diff --git a/src/ExtratorConteudoIMDB.java b/src/ExtratorConteudoIMDB.java new file mode 100644 index 0000000..8dc5581 --- /dev/null +++ b/src/ExtratorConteudoIMDB.java @@ -0,0 +1,30 @@ +import com.google.gson.Gson; + +import java.util.ArrayList; +import java.util.List; + +public class ExtratorConteudoIMDB implements ExtratorConteudo { + + public List extrairConteudos(String json) { + + // extrair os dados que interessam (titulo, poster, classificação) + Gson gson = new Gson(); + ListaDeFilmes filmeList = gson.fromJson(json, ListaDeFilmes.class); + + List conteudos = new ArrayList<>(); + + // popular a lista + for (Filme filme : filmeList.items) { + String titulo = filme.getTitle() + .replace(":", "-"); + String urlImagem = filme.getImage() + .replaceAll("(@+)(.*).jpg$", "$1.jpg"); + var conteudo = new Conteudo(titulo, urlImagem); + + conteudos.add(conteudo); + } + + return conteudos; + } + +} diff --git a/src/ExtratorConteudoNasa.java b/src/ExtratorConteudoNasa.java new file mode 100644 index 0000000..7e72da9 --- /dev/null +++ b/src/ExtratorConteudoNasa.java @@ -0,0 +1,32 @@ +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +public class ExtratorConteudoNasa implements ExtratorConteudo { + + public List extrairConteudos(String json) { + + // extrair os dados que interessam (titulo, poster, classificação) + Gson gson = new Gson(); + Type apodListType = new TypeToken>(){}.getType(); + List apodList = gson.fromJson(json, apodListType); + + List conteudos = new ArrayList<>(); + + // popular a lista + for (Apod apod : apodList) { + String titulo = apod.getTitle() + .replace(":", "-"); + String urlImagem = apod.getUrl(); + var conteudo = new Conteudo(titulo, urlImagem); + + conteudos.add(conteudo); + } + + return conteudos; + } + +} diff --git a/src/Filme.java b/src/Filme.java index 46e90d6..7a69988 100644 --- a/src/Filme.java +++ b/src/Filme.java @@ -1,29 +1,23 @@ public class Filme { - private String title; - private String imDbRating; - private String image; + private final String title; + private final String image; + private final String imDbRating; - public String getTitle() { - return title; - } - - public void setTitle(String title) { + public Filme(String title, String image, String imDbRating) { this.title = title; + this.image = image; + this.imDbRating = imDbRating; } - public String getImDbRating() { - return imDbRating; - } - - public void setImDbRating(String imDbRating) { - this.imDbRating = imDbRating; + public String getTitle() { + return title; } public String getImage() { return image; } - public void setImage(String image) { - this.image = image; + public String getImDbRating() { + return imDbRating; } } diff --git a/src/JsonParser.java b/src/JsonParser.java deleted file mode 100644 index f7dd6b4..0000000 --- a/src/JsonParser.java +++ /dev/null @@ -1,42 +0,0 @@ -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -public class JsonParser { - - private static final Pattern REGEX_ITEMS = Pattern.compile(".*\\[(.+)\\].*"); - private static final Pattern REGEX_ATRIBUTOS_JSON = Pattern.compile("\"(.+?)\":\"(.*?)\""); - - public List> parse(String json) { - - Matcher matcher = REGEX_ITEMS.matcher(json); - if (!matcher.find()) { - - throw new IllegalArgumentException("Não encontrou items."); - } - - String[] items = matcher.group(1).split("\\},\\{"); - - List> dados = new ArrayList<>(); - - for (String item : items) { - - Map atributosItem = new HashMap<>(); - - Matcher matcherAtributosJson = REGEX_ATRIBUTOS_JSON.matcher(item); - while (matcherAtributosJson.find()) { - String atributo = matcherAtributosJson.group(1); - String valor = matcherAtributosJson.group(2); - atributosItem.put(atributo, valor); - } - - dados.add(atributosItem); - } - - return dados; - - } -} \ No newline at end of file diff --git a/src/ListaDeFilmes.java b/src/ListaDeFilmes.java index 3123033..d67b1b8 100644 --- a/src/ListaDeFilmes.java +++ b/src/ListaDeFilmes.java @@ -1,13 +1,5 @@ import java.util.List; public class ListaDeFilmes { - private List items; - - public List getItems() { - return items; - } - - public void setItems(List items) { - this.items = items; - } + List items; } diff --git a/src/Main.java b/src/Main.java index b63e025..d9d69a1 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,44 +1,37 @@ -import com.diogonunes.jcolor.Attribute; -import com.google.gson.Gson; - import java.io.IOException; -import java.net.URI; -import java.net.http.HttpClient; -import java.net.http.HttpRequest; -import java.net.http.HttpResponse; -import java.net.http.HttpResponse.BodyHandlers; - -import static com.diogonunes.jcolor.Ansi.colorize; -import static com.diogonunes.jcolor.Attribute.*; +import java.io.InputStream; +import java.net.URL; +import java.util.List; public class Main { public static void main(String[] args) throws IOException, InterruptedException { // fazer a requisição HTTP com o metodo GET dos top 250 filmes de acordo com o site imdb. - String url = "https://mocki.io/v1/9a7c1ca9-29b4-4eb3-8306-1adb9d159060"; - URI endereco = URI.create(url); - HttpClient httpClient = HttpClient.newHttpClient(); - HttpRequest request = HttpRequest.newBuilder(endereco).GET().build(); - HttpResponse response = httpClient.send(request, BodyHandlers.ofString()); - String body = response.body(); + ExtratorConteudo extrator = new ExtratorConteudoIMDB(); + +// String url = "https://api.nasa.gov/planetary/apod?api_key=DEMO_KEY&start_date=2022-07-20&end_date=2022-07-22"; +// ExtratorConteudo extrator = new ExtratorConteudoNasa(); + + var http = new ClienteHttp(); + String jsonText = http.buscaDados(url); - // extrair os dados que interessam (titulo, poster, classificação) + // exibir e manipular os dados + List conteudos = extrator.extrairConteudos(jsonText); - Gson gsonParser = new Gson(); - ListaDeFilmes filmes = gsonParser.fromJson(body, ListaDeFilmes.class); + var generator = new StickerGenerator(); - // manipular e exibir os dados + for (int k = 0; k < 3; k++) { - Attribute[] myFormat1 = new Attribute[]{BLACK_TEXT(), CYAN_BACK(), BOLD()}; - Attribute[] myFormat2 = new Attribute[]{BRIGHT_CYAN_TEXT(), BOLD()}; + Conteudo conteudo = conteudos.get(k); - for (Filme filme : filmes.getItems()) { - System.out.println(colorize("Nome: " + filme.getTitle(), myFormat1)); - System.out.println(colorize("Capa[url]: ", myFormat2) + filme.getImage()); - System.out.println(colorize("Nota: " + filme.getImDbRating(),myFormat2)); - System.out.println("\n"); + try (InputStream inputStream = new URL(conteudo.getUrlImagem()).openStream()) { + System.out.println(conteudo.getTitulo()); + generator.criar(inputStream, "saida/" + conteudo.getTitulo() + ".png"); + } catch (Exception e) { + e.printStackTrace(); + } } } -} \ No newline at end of file +} diff --git a/src/StickerGenerator.java b/src/StickerGenerator.java new file mode 100644 index 0000000..78d1e10 --- /dev/null +++ b/src/StickerGenerator.java @@ -0,0 +1,61 @@ +import javax.imageio.ImageIO; +import java.awt.*; +import java.awt.font.TextLayout; +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.net.URL; + +public class StickerGenerator { + + public void criar(InputStream inputStream, String nomeArquivo) throws IOException { + + // leitura da imagem + // InputStream inputStream = new FileInputStream("entrada/filme-maior.jpg"); + // InputStream inputStream = new URL("https://m.media-amazon.com/images/M/MV5BMDFkYTc0MGEtZmNhMC00ZDIzLWFmNTEtODM1ZmRlYWMwMWFmXkEyXkFqcGdeQXVyMTMxODk2OTU@.jpg").openStream(); + BufferedImage imagemOriginal = ImageIO.read(inputStream); + + // criar nova imagem em memoria com transparencia e com tamanho novo + int largura = imagemOriginal.getWidth(); + int altura = imagemOriginal.getHeight(); + int novaAltura = altura + 200; + BufferedImage novaImagem = new BufferedImage(largura, novaAltura, BufferedImage.TRANSLUCENT); + + // copiar a imagem original pra novo imagem (em memoria) + Graphics2D graphics = (Graphics2D) novaImagem.getGraphics(); + graphics.drawImage(imagemOriginal, 0, 0, null); + + // configurar a fonte + Font fonte = new Font("impact", Font.BOLD, 64); + graphics.setColor(Color.yellow); + graphics.setFont(fonte); + + // escrever uma frase na nova imagem + String mensagem = "TOPZERA"; + int centralizarMensagem = (int) (largura / 3.3); + graphics.drawString(mensagem, centralizarMensagem, novaAltura - 100); + + // fazer o contorno(outline) na mensagem + TextLayout tl = new TextLayout(mensagem, fonte, graphics.getFontRenderContext()); + Shape shape = tl.getOutline(null); + + graphics.translate(centralizarMensagem, novaAltura - 100); + + graphics.setColor(Color.BLACK); + graphics.setStroke(new BasicStroke(2f)); + graphics.draw(shape); + + // escrever a imagem final em disco + File imagemFinal = new File(nomeArquivo); + if (!imagemFinal.getParentFile().exists()) imagemFinal.getParentFile().mkdirs(); + ImageIO.write(novaImagem, "png", imagemFinal); + + } + +// public static void main(String[] args) throws IOException { +// StickerGenerator stickerGenerator = new StickerGenerator(); +// InputStream inputStream = new URL("https://m.media-amazon.com/images/M/MV5BMDFkYTc0MGEtZmNhMC00ZDIzLWFmNTEtODM1ZmRlYWMwMWFmXkEyXkFqcGdeQXVyMTMxODk2OTU@.jpg").openStream(); +// stickerGenerator.criar(inputStream, "saida/filme5.png"); +// } +} diff --git a/target/classes/Filme.class b/target/classes/Filme.class deleted file mode 100644 index 62b1ab6162ebea73766243598405ec6543f908a3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 878 zcmZ{i%TB^j5QhI#E`?eI0q=Oh6<{I{fV$C`m=I0GurJu)AzTtDK9?pM6Bj;!4`uwP zC8AIkojEg|f95;Wetmy@0yx8w1p^TiQ5!MD6*67t$*K07L8p4#>bh-DA%3a{+B;W> zl*-K{5=fe`Y^=amh+XMk-=+7o*Q3wYXZnUW(t}P-6stDUQf}$~W$VuIn3wdLjjZ2A z_ni*a(Tm{&UAnFZ?#-m%a!2=0D`-1xJH4he(h^UTQSVWY70kNNP*X^BT<<>M$d}5C zB&-vsy^wmE$*q(EJ2TZ&k|iKP~6La9KZ1^JRtC?6GX>0B$0! zq5=U0K@A~P3e;{J4~)U3^6{sArvX(n25NPjMh#-uJ0#!p5Gy!!YZ)ax> zCvQ3eRdb_vM(?kU&yP+e1@uV|s^D6gm}92RN3mJMbxkLmP;mw|3TidfAu4e0U+e^w z9m7p+N$6|sMKq7t$d=(G&E0~TO__;~6W2@?5Am9MG$?4)a1O7Xa*b~%5Ztt~8=ia1 z3Yr93N*au3GG^My3_0n-j+u2wAEnHkYuVW_UKePX{_Q)vnJnzA>)3^6%QbiMy()BE zlxkk0MLF%H>sZ-zqGLf4yR4xFZwQ3aJeiZ0r zLqI0MH4Sge45%*#eQ17eeE8n{Omb}^IWt{_e!QdLhK6?$7pN}55Q0kQ3gmgCoM$oF z5@js?m2y@5r78^Irh-8YxA308nG(8WPk3X4;XJ1O5!iAV!vb1w=juv(Z&%0agWgV= zjkh(7VvGrwvUhS;#uVr&CwCON6RCET(P7*bsA(bOt&WyB`%d;utPy*IST&PY)|@Wv zteeifu`bc0lXl9;EEtX@=l){Q-Lmo|H(9Ew1f!ah)g{pSAB3dqG!Glhvh{*%%S$|A z%JYeE4~>k?f~r2U%a1c_CC8GAj1iIQ{o)()0rQg9X=Qy>Z}eAI0K09^GUU|*Q|y%7 zBasbb!=}5nWf%KCG#*#yaqdW=>t(hiIdIa!lPiOC@q%!_ftS0S(lQPG=T&*c3Os|Y0F0(!>_`Fx3 zNj}pYHOXRS9{`m{CEIb%V(bO`Q0G3xj~rBBg00*JA>L=J6%8aB2Bj|^K0u5XSL2aq=+nc*i>tay#IMn!s}d+)rK=&?YkEYl(zWNf9>C($ z!$0((9(j&L1r|S3#M8s?_23Vr74%#gMlHuRbf%VVluvU5TKRj>!_gSd)0qoc!bKRk z1PjgBrFKvFGJi^|&uQ}|UtKA~CRFa%V-_D!(Ot?i$C1YK2_!L(2vM%$9u{afhTB-= zZdi)r3nxeSxyAy;7yQ{-<(AMK&9MXG4z{YM?GU^fN|& bf)c&s^?fokgeRx`vjDmnrU(M22eSDWe)|Gn diff --git a/target/classes/ListaDeFilmes.class b/target/classes/ListaDeFilmes.class deleted file mode 100644 index e85277e9904e6ae89910eb9a06ea7b0d5760deca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 679 zcmZuvO;5r=6r3#|1q4A*6v2Zxz{LIlkc-B|q)`(L_ks;BDaDl5#DArU#>9g^z#nCt zZBd|ld2jc%&GPp#B&HKF{(BQ-C|T^0#HVUSzsGG6j~?0K!0LW z!;-B3LykODDYA>bg~&Cta++=*y+T(O5}}IvQK0t}4JaGc2(_@GEJpXLu@_lXl}&0# Mr|ff8XHP@p8&WKPga7~l diff --git a/target/classes/Main.class b/target/classes/Main.class deleted file mode 100644 index fd339bc565550dabea12aa93d27cd68576076ec1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3739 zcmai1X?Gh}8Gf!UYb1GW2PJW$)Jd~Ajk7qi<0Ot{HxS!N>{M}r?WT22Yev#o9$T7G zXGTd}3Z*QiY^CfeltS3b)<9cuY?qb*WeZE$zH<(IfCK-450vMQBwK2fCdZkX`|kI7 zmwR>nf6K1`xD$U3p$4@Id@AbT7g#f^o!6on%}htnBxd!bE8y=lOv61YP}{cqTmS)q zBQvg>b7IkG)=JJ9`wc64zBAgRbtgNMT2K3dp2WfSgLJR31hjv4> z+n+ZwDcu(6Dn?uiubPXZW@}NYw;nCntYC|Z+p$$(+f99yG?;;t$HxVBR^350^V?PI zK&wDqLIx_Z`OP%B`8%*nL7R%**dws3T0l=*Dky2<#oG8k7An^ni@ZTFH3C)_kIgq=5Y{r zsfbJE;K0POk*R(fkkkA1> zcdF2kppR7xB@qE-Msr5=i)?caz5Ap_N`)>f#%GeOAkC)oG8lw`Sp{<{GRRhz#Js~@ z(1Mkxo%MzEaaNw?Jabtux|St&)38+J@L*xz?fL7_x7`N)fT9xMAue`D{YB$F+n^Za8iwwahuqHsrcU^tm$zv*(XXWljlS z)-%%FHd!S+Hc8#I93O-z?p2}G(CjoVtgWKJ8YDi_vj=l|9Wc9`yt=I?EjCkuUpmA% z3*@9N9i*F9xhn&>z@vA?E}e_FRS_$VaC)=#!Xy@GsVZ2U)ATK8=UL5m$9cWTw~`)DK;l;an&#g4y{KmYvnyPF^)`UA?qaQaB(ZsmR`Z zu9U%!H`z{KfmaUvQAXG>=4#2g(^}3e0tHVixWZVEUrg#b*I-X8xLVd5!)I1F3YG-6 ztY&lAmg~5-mOHJxGgiuJ^5c~deu8TX zekxn#X9BIO)(!K#HK#`l-BFl2C$uDIEKkQv=s@47u#A)fcxpXO7tfhK&0PqiR`&*F1j1@U=Y zq7f?Bw8KXk;6Gs{zITxYvxugVeT!JXgxds`uuUN5YmfLAv2y`?V|9_bB}4_T;ZV%~ z61pd@q9>+Al!!kZTR`76#A1Q)+hW0Re=OvG8G{qGi#RbhLG@E(6LpI?Jr=94E7H$; zbW+qvU;$%GxQD(PA`MHpU*IWB%CDq!H63ew0W*=t1(?gQfk^!#&M)9$62tF{s9Z?i z2bS?6pg@-Ek1XTkl$GqF>=S%H`}$=Gkq;805&n<>)}a>b5#X-?6&rXz--uoOCD4V< z=))GA!gk8-;2mZsW_ekD7<=&y_TfcdVy|OA{zm-&$qVMc(dj|`1RBX7<_5mNF9M4% z;%UBX@h^Od9F9Z$17F5hm;ja9m+@8dTJRdahOaZOU3eAWz&DxSE-do@GfZS3zK>_| zEhvoUGQN%P(8dU@eV5!IBYO(p<5!6BJ&NaW1@(;5qRth1_yK*(^cUvD;Vrur#Jmr(e(3!@0Q{GCryo(*&&U@TTP>Eks=-V6G2ar! rm+9x{-t!mU^H=x{Ior9b7NUFIA0&Pq_$_1p9p8W8`ZfFse?jE`ey|k;