Funcionalidad Episodios

master
Fernando 2018-12-12 20:10:51 -05:00
parent 0d34789308
commit 5fe9018be6
15 changed files with 665 additions and 329 deletions

View File

@ -4,9 +4,8 @@
"link": "/Anime/2018/Otono/IrozuKai", "link": "/Anime/2018/Otono/IrozuKai",
"imgUrl": "https://myanimelist.cdn-dena.com/images/anime/1424/93855.jpg", "imgUrl": "https://myanimelist.cdn-dena.com/images/anime/1424/93855.jpg",
"descripcion": "Ambientada en la ciudad de Nagasaki, la historia tiene lugar en un mundo en el que una cantidad minúscula de magia permanece en la vida cotidiana. Hitomi Tsukishiro es una descendiente de 17 años de una familia de brujas que creció con emociones vivas, ya que perdió su sentido del color a una edad muy temprana. Sintiéndose mal por el futuro de su nieta, Kohaku, una gran bruja, envía a Hitomi al pasado, el año 2018. Mediante intercambios con su abuela de 17 años y los miembros de su club, la historia sigue el crecimiento de Hitomi como persona.", "descripcion": "Ambientada en la ciudad de Nagasaki, la historia tiene lugar en un mundo en el que una cantidad minúscula de magia permanece en la vida cotidiana. Hitomi Tsukishiro es una descendiente de 17 años de una familia de brujas que creció con emociones vivas, ya que perdió su sentido del color a una edad muy temprana. Sintiéndose mal por el futuro de su nieta, Kohaku, una gran bruja, envía a Hitomi al pasado, el año 2018. Mediante intercambios con su abuela de 17 años y los miembros de su club, la historia sigue el crecimiento de Hitomi como persona.",
"data": {
"estudio": "P.A. Works", "estudio": "P.A. Works",
"eps": "?", "eps": "13",
"alAire": "06 de Octubre a ?", "alAire": "06 de Octubre a ?",
"temporada": "Otono", "temporada": "Otono",
"anio": 2018, "anio": 2018,
@ -18,7 +17,6 @@
}, },
"ED": { "ED": {
"1": "Mimei no Kimi to Hakumei no Mahou - Yanagi Nagi" "1": "Mimei no Kimi to Hakumei no Mahou - Yanagi Nagi"
}
}, },
"onPagPrin": [true,1], "onPagPrin": [true,1],
"key": 10001111 "key": 10001111
@ -28,7 +26,6 @@
"link": "/Anime/2018/Otono/Goblin-Slayer", "link": "/Anime/2018/Otono/Goblin-Slayer",
"imgUrl": "https://myanimelist.cdn-dena.com/images/anime/1949/93415l.jpg", "imgUrl": "https://myanimelist.cdn-dena.com/images/anime/1949/93415l.jpg",
"descripcion": "Una joven sacerdotisa formó su primer grupo de aventureros, pero casi inmediatamente se encuentran angustiados. Es el Asesino de Duendes que viene a su rescate, un hombre que dedicó su vida al exterminio de todos los duendes, por cualquier medio necesario. Y cuando los rumores de sus hazañas comienzan a circular, no hay forma de saber quién podría venir a continuación...", "descripcion": "Una joven sacerdotisa formó su primer grupo de aventureros, pero casi inmediatamente se encuentran angustiados. Es el Asesino de Duendes que viene a su rescate, un hombre que dedicó su vida al exterminio de todos los duendes, por cualquier medio necesario. Y cuando los rumores de sus hazañas comienzan a circular, no hay forma de saber quién podría venir a continuación...",
"data": {
"estudio": "White Fox", "estudio": "White Fox",
"eps": "12", "eps": "12",
"alAire": "7 de octubre a ?", "alAire": "7 de octubre a ?",
@ -42,7 +39,6 @@
}, },
"ED": { "ED": {
"1": "Gin no Kisei - Soraru" "1": "Gin no Kisei - Soraru"
}
}, },
"onPagPrin": [false,2], "onPagPrin": [false,2],
"key": 10001110 "key": 10001110
@ -52,7 +48,6 @@
"link": "/Anime/2018/Verano/Overlord-3", "link": "/Anime/2018/Verano/Overlord-3",
"imgUrl": "", "imgUrl": "",
"descripcion": "Tercera temporada de Overlord.", "descripcion": "Tercera temporada de Overlord.",
"data": {
"estudio": "Madhouse", "estudio": "Madhouse",
"eps": "13", "eps": "13",
"alAire": "10 de Julio a 2 de Octubre", "alAire": "10 de Julio a 2 de Octubre",
@ -66,7 +61,6 @@
}, },
"ED": { "ED": {
"1": "Silent Solitude - OxT" "1": "Silent Solitude - OxT"
}
}, },
"onPagPrin": [false,2], "onPagPrin": [false,2],
"key": 10001101 "key": 10001101
@ -76,7 +70,6 @@
"link": "/Anime/2018/Verano/Banana-Fish", "link": "/Anime/2018/Verano/Banana-Fish",
"imgUrl": "https://myanimelist.cdn-dena.com/images/anime/1190/93472.jpg", "imgUrl": "https://myanimelist.cdn-dena.com/images/anime/1190/93472.jpg",
"descripcion": "La naturaleza hizo a Ash Lynx hermoso; la crianza lo convirtió en un asesino despiadado y frío. Un fugitivo lo crió como el heredero adoptivo y el juguete sexual de 'Papa' Dino Golzine, Ash, ahora a la edad rebelde de diecisiete años, abandona el reino sostenido por el diablo que lo crió.", "descripcion": "La naturaleza hizo a Ash Lynx hermoso; la crianza lo convirtió en un asesino despiadado y frío. Un fugitivo lo crió como el heredero adoptivo y el juguete sexual de 'Papa' Dino Golzine, Ash, ahora a la edad rebelde de diecisiete años, abandona el reino sostenido por el diablo que lo crió.",
"data": {
"estudio": "MAPPA", "estudio": "MAPPA",
"eps": "24", "eps": "24",
"alAire": "6 de Julio a 21 de Diciembre", "alAire": "6 de Julio a 21 de Diciembre",
@ -92,7 +85,6 @@
"ED": { "ED": {
"1": "Prayer X - King Gnu", "1": "Prayer X - King Gnu",
"2": "RED - Survive Said The Prophet" "2": "RED - Survive Said The Prophet"
}
}, },
"onPagPrin": [true,2], "onPagPrin": [true,2],
"key": 10001100 "key": 10001100
@ -102,7 +94,6 @@
"link": "/Anime/2018/Primavera/Steins;Gate-0", "link": "/Anime/2018/Primavera/Steins;Gate-0",
"imgUrl": "https://myanimelist.cdn-dena.com/images/anime/1768/93520.jpg", "imgUrl": "https://myanimelist.cdn-dena.com/images/anime/1768/93520.jpg",
"descripcion": "La oscura historia no contada de Steins;Gate muestra al excéntrico científico loco Okabe, que lucha por recuperarse de un intento fallido de rescatar a Kurisu. Decide darse por vencido y abandona a su animado álter ego científico, en la búsqueda de olvidar el pasado. Cuando todo parece ser normal, aparentemente recuerda el pasado al conocer a un conocido de Kurisu... ", "descripcion": "La oscura historia no contada de Steins;Gate muestra al excéntrico científico loco Okabe, que lucha por recuperarse de un intento fallido de rescatar a Kurisu. Decide darse por vencido y abandona a su animado álter ego científico, en la búsqueda de olvidar el pasado. Cuando todo parece ser normal, aparentemente recuerda el pasado al conocer a un conocido de Kurisu... ",
"data": {
"estudio": "White Fox", "estudio": "White Fox",
"eps": "23", "eps": "23",
"alAire": "12 de Abril a 27 de Septiembre", "alAire": "12 de Abril a 27 de Septiembre",
@ -119,7 +110,6 @@
"2": "LAST GAME - Zwei", "2": "LAST GAME - Zwei",
"3": "World-Line - Amai Isami", "3": "World-Line - Amai Isami",
"4": "GATE OF STEINER - Sasaki Eri" "4": "GATE OF STEINER - Sasaki Eri"
}
}, },
"onPagPrin": [false,0], "onPagPrin": [false,0],
"key": 10001011 "key": 10001011
@ -129,7 +119,6 @@
"link": "/Anime/2018/Primavera/Mahou-Shoujo-Site", "link": "/Anime/2018/Primavera/Mahou-Shoujo-Site",
"imgUrl": "https://myanimelist.cdn-dena.com/images/anime/1720/95064.jpg", "imgUrl": "https://myanimelist.cdn-dena.com/images/anime/1720/95064.jpg",
"descripcion": "Aya Asagiri es una chica de secundaria que tiene problemas tanto en la escuela con el acoso escolar como en el hogar debido al abuso físico de su hermano. Al navegar en línea, aparece un sitio web en su computadora con una persona de aspecto espeluznante. Esta persona parece tener piedad de ella, y anuncia que le ha otorgado poderes mágicos a Asagiri. ", "descripcion": "Aya Asagiri es una chica de secundaria que tiene problemas tanto en la escuela con el acoso escolar como en el hogar debido al abuso físico de su hermano. Al navegar en línea, aparece un sitio web en su computadora con una persona de aspecto espeluznante. Esta persona parece tener piedad de ella, y anuncia que le ha otorgado poderes mágicos a Asagiri. ",
"data": {
"estudio": "production doA", "estudio": "production doA",
"eps": "12", "eps": "12",
"alAire": "7 de Abril a 23 de Junio", "alAire": "7 de Abril a 23 de Junio",
@ -143,7 +132,6 @@
}, },
"ED": { "ED": {
"1": "Zenzen Tomodachi - Yamazaki Haruka" "1": "Zenzen Tomodachi - Yamazaki Haruka"
}
}, },
"onPagPrin": [true,3], "onPagPrin": [true,3],
"key": 10001010 "key": 10001010
@ -153,7 +141,6 @@
"link": "/Anime/2018/Primavera/WotaKoi", "link": "/Anime/2018/Primavera/WotaKoi",
"imgUrl": "https://myanimelist.cdn-dena.com/images/anime/1864/93518.jpg", "imgUrl": "https://myanimelist.cdn-dena.com/images/anime/1864/93518.jpg",
"descripcion": "Después de descubrir que trabajan en la misma compañía, un otaku enloquecido y un fujoshi se reúnen por primera vez desde la secundaria. Después de algunas sesiones de bebida después del trabajo comienzan a salir, pero ¿será una relación perfecta para los dos? ", "descripcion": "Después de descubrir que trabajan en la misma compañía, un otaku enloquecido y un fujoshi se reúnen por primera vez desde la secundaria. Después de algunas sesiones de bebida después del trabajo comienzan a salir, pero ¿será una relación perfecta para los dos? ",
"data": {
"estudio": "A-1 Pictures", "estudio": "A-1 Pictures",
"eps": "11", "eps": "11",
"alAire": "13 de Abril a 22 de Junio", "alAire": "13 de Abril a 22 de Junio",
@ -167,7 +154,6 @@
}, },
"ED": { "ED": {
"1": "Kimi no Tonari - halca" "1": "Kimi no Tonari - halca"
}
}, },
"onPagPrin": [false,0], "onPagPrin": [false,0],
"key": 10001001 "key": 10001001
@ -177,7 +163,6 @@
"link": "/Anime/2018/Primavera/Shokugeki-no-Soma-3-2", "link": "/Anime/2018/Primavera/Shokugeki-no-Soma-3-2",
"imgUrl": "https://myanimelist.cdn-dena.com/images/anime/1604/93531.jpg", "imgUrl": "https://myanimelist.cdn-dena.com/images/anime/1604/93531.jpg",
"descripcion": "El segundo platillo de Shokugeki no Soma: San no Sara", "descripcion": "El segundo platillo de Shokugeki no Soma: San no Sara",
"data": {
"estudio": "J.C. Staff", "estudio": "J.C. Staff",
"eps": "12", "eps": "12",
"alAire": "9 de Abril a 25 de Junio", "alAire": "9 de Abril a 25 de Junio",
@ -191,7 +176,6 @@
}, },
"ED": { "ED": {
"1": "Atria - Fo'xTails" "1": "Atria - Fo'xTails"
}
}, },
"onPagPrin": [false,0], "onPagPrin": [false,0],
"key": 10001000 "key": 10001000
@ -201,7 +185,6 @@
"link": "/Anime/2018/Invierno/Violet-Evergarden", "link": "/Anime/2018/Invierno/Violet-Evergarden",
"imgUrl": "https://myanimelist.cdn-dena.com/images/anime/1795/95088.jpg", "imgUrl": "https://myanimelist.cdn-dena.com/images/anime/1795/95088.jpg",
"descripcion": "Hay palabras que Violet escuchó en el campo de batalla, las cuales no puede olvidar. Esas palabras le fueron dadas por alguien que conocía, más que nadie. Ella aún no conoce su significado. ", "descripcion": "Hay palabras que Violet escuchó en el campo de batalla, las cuales no puede olvidar. Esas palabras le fueron dadas por alguien que conocía, más que nadie. Ella aún no conoce su significado. ",
"data": {
"estudio": "Kyoto Animation", "estudio": "Kyoto Animation",
"eps": "13", "eps": "13",
"alAire": "11 de Enero a 5 de Abril", "alAire": "11 de Enero a 5 de Abril",
@ -216,7 +199,6 @@
"ED": { "ED": {
"1": "Michishirube - Minori Chihara", "1": "Michishirube - Minori Chihara",
"2": "Believe in... - Yuuki Aira" "2": "Believe in... - Yuuki Aira"
}
}, },
"onPagPrin": [false,0], "onPagPrin": [false,0],
"key": 10000111 "key": 10000111
@ -226,7 +208,6 @@
"link": "/Anime/2017/Otono/Inuyashiki", "link": "/Anime/2017/Otono/Inuyashiki",
"imgUrl": "https://myanimelist.cdn-dena.com/images/anime/3/88470.jpg", "imgUrl": "https://myanimelist.cdn-dena.com/images/anime/3/88470.jpg",
"descripcion": "Inuyashiki Ichirou está de mala suerte. Justo cuando parece que las cosas no pueden empeorar, una luz cegadora en el cielo nocturno golpea la tierra donde se encuentra Ichirou. ", "descripcion": "Inuyashiki Ichirou está de mala suerte. Justo cuando parece que las cosas no pueden empeorar, una luz cegadora en el cielo nocturno golpea la tierra donde se encuentra Ichirou. ",
"data": {
"estudio": "MAPPA", "estudio": "MAPPA",
"eps": "11", "eps": "11",
"alAire": "13 de Octubre al 22 de Diciembre", "alAire": "13 de Octubre al 22 de Diciembre",
@ -234,12 +215,12 @@
"anio": 2017, "anio": 2017,
"fuente": "Manga", "fuente": "Manga",
"generos": "Accion, Drama, Psicologico, Ciencia ficcion, Seinen", "generos": "Accion, Drama, Psicologico, Ciencia ficcion, Seinen",
"color": "#23BF87",
"OP": { "OP": {
"1": "My Hero - MAN WITH A MISSION" "1": "My Hero - MAN WITH A MISSION"
}, },
"ED": { "ED": {
"1": "Ai wo Oshiete Kureta Kimi e - Qaijff" "1": "Ai wo Oshiete Kureta Kimi e - Qaijff"
}
}, },
"onPagPrin": [false,0], "onPagPrin": [false,0],
"key": 10000110 "key": 10000110
@ -249,7 +230,6 @@
"link": "/Anime/2017/Otono/Kekkai-Sensen-Beyond", "link": "/Anime/2017/Otono/Kekkai-Sensen-Beyond",
"imgUrl": "https://myanimelist.cdn-dena.com/images/anime/9/88281.jpg", "imgUrl": "https://myanimelist.cdn-dena.com/images/anime/9/88281.jpg",
"descripcion": "Segunda temporada de Kekkai Sensen.", "descripcion": "Segunda temporada de Kekkai Sensen.",
"data": {
"estudio": "Bones", "estudio": "Bones",
"eps": "12", "eps": "12",
"alAire": "8 de Octubre al 24 de Diciembre", "alAire": "8 de Octubre al 24 de Diciembre",
@ -263,7 +243,6 @@
}, },
"ED": { "ED": {
"1": "Step Up LOVE - DAOKO x Yasuyuki Okamura" "1": "Step Up LOVE - DAOKO x Yasuyuki Okamura"
}
}, },
"onPagPrin": [false,0], "onPagPrin": [false,0],
"key": 10000101 "key": 10000101
@ -273,7 +252,6 @@
"link": "/Anime/2017/Otono/Just-Because", "link": "/Anime/2017/Otono/Just-Because",
"imgUrl": "https://myanimelist.cdn-dena.com/images/anime/3/88185.jpg", "imgUrl": "https://myanimelist.cdn-dena.com/images/anime/3/88185.jpg",
"descripcion": "Al final del segundo semestre del tercer año de preparatoria, cuatro estudiantes están listos para graduarse y pueden sentir el final de su vida en la preparatoria. Pero eso cambia un poco con la llegada de un estudiante transferido. ", "descripcion": "Al final del segundo semestre del tercer año de preparatoria, cuatro estudiantes están listos para graduarse y pueden sentir el final de su vida en la preparatoria. Pero eso cambia un poco con la llegada de un estudiante transferido. ",
"data": {
"estudio": "Pine Jam", "estudio": "Pine Jam",
"eps": "12", "eps": "12",
"alAire": "5 de Octubre al 28 de Diciembre", "alAire": "5 de Octubre al 28 de Diciembre",
@ -287,7 +265,6 @@
}, },
"ED": { "ED": {
"1": "behind - Mio Natsume (Karin Isobe), Hatsuki Morikawa (Yuna Yoshino), Ena Komiya (Lynn)" "1": "behind - Mio Natsume (Karin Isobe), Hatsuki Morikawa (Yuna Yoshino), Ena Komiya (Lynn)"
}
}, },
"onPagPrin": [false,0], "onPagPrin": [false,0],
"key": 10000100 "key": 10000100
@ -297,7 +274,6 @@
"link": "/Anime/2017/Otono/Shokugeki-no-Soma-3", "link": "/Anime/2017/Otono/Shokugeki-no-Soma-3",
"imgUrl": "https://myanimelist.cdn-dena.com/images/anime/4/86603.jpg", "imgUrl": "https://myanimelist.cdn-dena.com/images/anime/4/86603.jpg",
"descripcion": "Tercera temporada de Shokugeki no Soma", "descripcion": "Tercera temporada de Shokugeki no Soma",
"data": {
"estudio": "J.C. Staff", "estudio": "J.C. Staff",
"eps": "12", "eps": "12",
"alAire": "4 de Octubre al 20 de Diciembre", "alAire": "4 de Octubre al 20 de Diciembre",
@ -311,7 +287,6 @@
}, },
"ED": { "ED": {
"1": "Kyokyo Jitsujitsu - nano.RIPE" "1": "Kyokyo Jitsujitsu - nano.RIPE"
}
}, },
"onPagPrin": [true,4], "onPagPrin": [true,4],
"key": 10000011 "key": 10000011
@ -321,7 +296,6 @@
"link": "/Anime/2017/Verano/Kakegurui", "link": "/Anime/2017/Verano/Kakegurui",
"imgUrl": "https://myanimelist.cdn-dena.com/images/anime/3/86578.jpg", "imgUrl": "https://myanimelist.cdn-dena.com/images/anime/3/86578.jpg",
"descripcion": "Academia Privada Hyakkaou. Una institución para los privilegiados con un currículo muy peculiar. Veras, cuando eres de los hijos e hijas de los más ricos de los ricos, no es la destreza atlética o la inteligencia lo que te mantiene por delante. Es leer a tu oponente, el arte del trato. ¿Qué mejor manera de afilar esas habilidades que con un riguroso plan de estudios de juegos de azar? ", "descripcion": "Academia Privada Hyakkaou. Una institución para los privilegiados con un currículo muy peculiar. Veras, cuando eres de los hijos e hijas de los más ricos de los ricos, no es la destreza atlética o la inteligencia lo que te mantiene por delante. Es leer a tu oponente, el arte del trato. ¿Qué mejor manera de afilar esas habilidades que con un riguroso plan de estudios de juegos de azar? ",
"data": {
"estudio": "MAPPA", "estudio": "MAPPA",
"eps": "12", "eps": "12",
"alAire": "1 de Julio al 23 de Septiembre", "alAire": "1 de Julio al 23 de Septiembre",
@ -335,7 +309,6 @@
}, },
"ED": { "ED": {
"1": "LAYon-theLINE - D-selections" "1": "LAYon-theLINE - D-selections"
}
}, },
"onPagPrin": [false,0], "onPagPrin": [false,0],
"key": 10000010 "key": 10000010
@ -345,7 +318,6 @@
"link": "/Anime/2017/Verano/Re:Creators", "link": "/Anime/2017/Verano/Re:Creators",
"imgUrl": "https://myanimelist.cdn-dena.com/images/anime/11/85469.jpg", "imgUrl": "https://myanimelist.cdn-dena.com/images/anime/11/85469.jpg",
"descripcion": "Los humanos han creado muchas historias. Felicidad, tristeza, ira, emociones profundas. Las historias sacuden nuestro corazón y nos fascinan. Sin embargo, estos son sólo los pensamientos de los espectadores. Pero ¿y si los personajes de la historia tienen 'intenciones'?", "descripcion": "Los humanos han creado muchas historias. Felicidad, tristeza, ira, emociones profundas. Las historias sacuden nuestro corazón y nos fascinan. Sin embargo, estos son sólo los pensamientos de los espectadores. Pero ¿y si los personajes de la historia tienen 'intenciones'?",
"data": {
"estudio": "TROYCA", "estudio": "TROYCA",
"eps": "22", "eps": "22",
"alAire": "8 de Abril al 26 de Septiembre", "alAire": "8 de Abril al 26 de Septiembre",
@ -363,7 +335,6 @@
"2": "NEWLOOK - Ayano Mashiro", "2": "NEWLOOK - Ayano Mashiro",
"3": "world Étude - Toyosaki Aki", "3": "world Étude - Toyosaki Aki",
"4": "Rubikon - Sangatsu no Phantasia" "4": "Rubikon - Sangatsu no Phantasia"
}
}, },
"onPagPrin": [false,0], "onPagPrin": [false,0],
"key": 10000001 "key": 10000001
@ -372,8 +343,7 @@
"titulo": "Flip Flappers", "titulo": "Flip Flappers",
"link": "/Anime/2016/Otono/Flip-Flappers", "link": "/Anime/2016/Otono/Flip-Flappers",
"imgUrl": "https://myanimelist.cdn-dena.com/images/anime/4/82292.jpg", "imgUrl": "https://myanimelist.cdn-dena.com/images/anime/4/82292.jpg",
"descripcion": "Cocona, que lleva una vida normal, se encuentra un día con Papika, y juntas van a Pure Illusion, a conseguir 'fragmentos', que se dice, pueden conceder deseos. ", "descripcion": "Cocona, que lleva una vida normal, se encuentra un día con Papika, y juntas van a Pure Illusion, a conseguir 'fragmentos', que se dice pueden conceder deseos.",
"data": {
"estudio": "Studio 3Hz", "estudio": "Studio 3Hz",
"eps": "13", "eps": "13",
"alAire": "6 de Octubre al 29 de Diciembre", "alAire": "6 de Octubre al 29 de Diciembre",
@ -389,7 +359,6 @@
"1": "FLIP FLAP FLIP FLAP - TO-MAS feat.Chima", "1": "FLIP FLAP FLIP FLAP - TO-MAS feat.Chima",
"2": "find the wind - ZAQ", "2": "find the wind - ZAQ",
"3": "Over the Rainbow - TO-MAS feat.Chima" "3": "Over the Rainbow - TO-MAS feat.Chima"
}
}, },
"onPagPrin": [false,0], "onPagPrin": [false,0],
"key": 10000000 "key": 10000000

View File

@ -1,8 +1,15 @@
<template> <template>
<div > <div v-if="render">
<br> <br>
Este es un proceso largo y doloroso, pero necesario. <br> Este es un proceso largo y doloroso, pero necesario. <br>
<br> <br>
<form @submit.prevent="crearAnimeConYaml" id="animeNuevoYAML">
YAML:
<textarea placeholder="YAML raw" class="materialize-textarea" required name="yaml-raw"></textarea><br>
<br>
<input type="submit" value="Enviar">
</form>
<br>
<form id="animeNuevo" @submit.prevent="crearAnime" class="form-crear"> <form id="animeNuevo" @submit.prevent="crearAnime" class="form-crear">
<span>Nombre: </span><input type="text" placeholder="nombre" required name="nombre"><br> <span>Nombre: </span><input type="text" placeholder="nombre" required name="nombre"><br>
<span>Link: </span><input type="text" placeholder="/Anime/?" required name="link"><br> <span>Link: </span><input type="text" placeholder="/Anime/?" required name="link"><br>
@ -60,7 +67,6 @@
}; };
console.log("El objeto a enviar es:\n", YAML.stringify(respuesta)); console.log("El objeto a enviar es:\n", YAML.stringify(respuesta));
console.log("Y en JSON:\n", JSON.stringify(respuesta));
const xhr = new XMLHttpRequest(); const xhr = new XMLHttpRequest();
xhr.open("PUT","/a/"); xhr.open("PUT","/a/");
@ -69,6 +75,19 @@
console.log("El servidor respondió:\n" + xhr.responseText); console.log("El servidor respondió:\n" + xhr.responseText);
}; };
xhr.send(`data=${YAML.stringify(respuesta)}`); xhr.send(`data=${YAML.stringify(respuesta)}`);
},
crearAnimeConYaml () {
const form = document.getElementById("animeNuevoYAML");
const respuesta = form["yaml-raw"].value;
const xhr = new XMLHttpRequest();
xhr.open("PUT","/a/");
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
xhr.onload = () => {
console.log("El servidor respondió:\n" + xhr.responseText);
};
xhr.send(`data=${respuesta}`);
} }
} }
} }

View File

@ -1,20 +1,161 @@
<template> <template>
<div> <div>
<div v-for="anime in listaAnimes"> <table class="striped">
lol? <thead>
</div> <tr>
<td>ID</td>
<td>Nombre</td>
<td>Acciones</td>
</tr>
</thead>
<tbody>
<tr v-for="anime in listaAnimes" :id="'anime' + anime['anime_ID']">
<td class="columna-id">{{ anime["anime_ID"] }}</td>
<td>{{ anime["titulo"] }}</td>
<td>
<button class="btn" @click="revisarOP('anime' + anime['anime_ID'], anime['anime_ID'])">OP</button> | <button class="btn">ED</button> | <button class="btn">Link</button>
</td>
</tr>
</tbody>
</table>
</div> </div>
</template> </template>
<script> <script>
const YAML = require('yaml');
export default { export default {
name: "lista-animes", name: "lista-animes",
props: { props: {
listaAnimes: Object listaAnimes: Array | Object
},
methods: {
revisarOP (elemId, animeID) {
const elemActual = document.getElementById(elemId);
const marco = document.createElement("tr");
marco.appendChild(document.createElement("td"));
const marcof = document.createElement("td");
marco.appendChild(marcof);
marco.appendChild(document.createElement("td"));
const elemNuevo = document.createElement("div");
const formCrear = document.createElement("div");
formCrear.appendChild(document.createTextNode("Crear un OP:"));
formCrear.appendChild(document.createElement("br"));
formCrear.appendChild(document.createElement("br"));
const form = document.createElement("form");
form.style.display = "inline-block";
form.style.maxWidth = "450px";
form.onsubmit = () => false;
const input = document.createElement("input");
input.placeholder = "Numero del OP";
input.type = "number";
input.style.display = "inline-block";
input.style.maxWidth = "400px";
input.min = "1";
input.max = "50";
input.name = "numOP";
input.required = true;
form.appendChild(input);
const input2 = document.createElement("input");
input2.placeholder = "Nombre del OP";
input2.type = "text";
input2.name = "nombreOP";
input2.style.display = "inline-block";
input2.style.maxWidth = "400px";
input2.required = true;
form.appendChild(input2);
const input3 = document.createElement("input");
input3.placeholder = "Artista del OP";
input3.type = "text";
input3.name = "artistaOP";
input3.style.display = "inline-block";
input3.style.maxWidth = "400px";
input3.required = true;
form.appendChild(input3);
const input4 = document.createElement("input");
input4.placeholder = "Episodios del OP (1 al 13)";
input4.type = "text";
input4.name = "epsOP";
input4.style.display = "inline-block";
input4.style.maxWidth = "400px";
input4.required = true;
form.appendChild(input4);
const botonEnviar = document.createElement("button");
botonEnviar.className = "btn";
botonEnviar.addEventListener("click", () => {
botonEnviar.className = "btn disabled";
const data = {
num_OP: input.value,
nombre: input2.value,
artista: input3.value,
eps: input4.value,
anime_ID: animeID
};
const xhr = new XMLHttpRequest();
xhr.open("POST", "/op/");
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.onload = () => {
botonEnviar.className = "btn";
console.log("Resultado:\n" + xhr.responseText);
};
xhr.send(`data=${YAML.stringify(data)}`);
console.log("YAML:\n" + YAML.stringify(data));
});
botonEnviar.innerText = "Crear.";
form.appendChild(botonEnviar);
formCrear.appendChild(form);
elemNuevo.appendChild(formCrear);
elemNuevo.style.padding = "30px";
const xhr = new XMLHttpRequest();
xhr.open("GET", `/op/${animeID}`);
xhr.onload = () => {
const data = YAML.parse(xhr.responseText);
for (const elemento of data) {
const div = document.createElement("div");
div.innerHTML = `<br>OP ${elemento['num_OP']}: ${elemento['nombre']} - ${elemento['artista']}<br>\
Eps: ${elemento['eps']}`;
elemNuevo.appendChild(div);
}
console.log("El servidor respondió:\n" + xhr.responseText);
};
xhr.send();
marcof.appendChild(elemNuevo);
elemActual.parentNode.insertBefore(marco, elemActual.nextSibling);
}
} }
} }
</script> </script>
<style scoped> <style scoped lang="sass">
.columna-id
max-width: 40px
</style> </style>

View File

@ -18,19 +18,19 @@
Especificaciones tecnicas Especificaciones tecnicas
</div> </div>
<div class="contenido--datos--descripcion"> <div class="contenido--datos--descripcion">
Capitulos: {{ datos.data.eps }} <br> Capitulos: {{ datos.eps }} <br>
Al Aire: {{ datos.data.alAire }} <br> Al Aire: {{ datos.alAire }} <br>
Temporada: {{ datos.data.temporada }} <br> Temporada: {{ datos.temporada }} <br>
Estudio: {{ datos.data.estudio }} <br> Estudio: {{ datos.estudio }} <br>
Fuente: {{ datos.data.fuente }} <br> Fuente: {{ datos.fuente }} <br>
Generos: {{ datos.data.generos }} <br> Generos: {{ datos.generos }} <br>
<br> <br>
Openings:<br> Openings:<br>
<template v-for="(op, index) in datos.data.OP"> <template v-for="(op, index) in datos.OP">
<div class="espaciado">{{ index }} : {{ op }}</div> <div class="espaciado">{{ index }} : {{ op }}</div>
</template> </template>
Endings:<br> Endings:<br>
<template v-for="(op, index) in datos.data.ED"> <template v-for="(op, index) in datos.ED">
<div class="espaciado">{{ index }} : {{ op }}</div> <div class="espaciado">{{ index }} : {{ op }}</div>
</template> </template>
</div> </div>
@ -56,6 +56,7 @@
import ProximoEpisodio from './proximoEpisodio.vue' import ProximoEpisodio from './proximoEpisodio.vue'
import AnuncioLocal from './anuncioLocal.vue' import AnuncioLocal from './anuncioLocal.vue'
import ComponenteCarga from '../comp-cargando.vue' import ComponenteCarga from '../comp-cargando.vue'
const YAML = require('yaml');
export default { export default {
name: "Contenido", name: "Contenido",
@ -67,7 +68,10 @@
props: { props: {
nombre: String, nombre: String,
datos: Object, datos: Object,
color: String, color: {
type: String,
default: '#23BF87'
},
}, },
components: { components: {
'anuncio-global': AnuncioGlobal, 'anuncio-global': AnuncioGlobal,
@ -89,14 +93,16 @@
const vm = this; const vm = this;
xhr.onload = () => { xhr.onload = () => {
const data = JSON.parse(xhr.responseText); const data = YAML.parse(xhr.responseText);
if (data.exito) { console.log("La data es:");
vm.datosAnime = data.payload; console.log(xhr.responseText);
if (data.opciones) {
vm.datosAnime = data["opciones"];
} }
}; };
console.log("Este es el query: " + `nombre=${ this.datos.titulo }`); console.log("Este es el query: " + `nombre=${ this.datos.titulo }`);
xhr.send(`nombre=${ this.datos.titulo }`); xhr.send(`animeID=29`);
} }
} }

View File

@ -4,9 +4,9 @@
Descarga aquí.<br> Descarga aquí.<br>
<div class="panel__titulo__variantes"> <div class="panel__titulo__variantes">
<template v-for="(opcion, indice) in datos.opciones"> <template v-for="(opcion, indice) in datos">
<div class="panel__titulo__variantes__variante hoverable" <div class="panel__titulo__variantes__variante hoverable"
:style="indice === 0? `background-color: ${opcion.color}` : ''" :style="indice === '1'? `background-color: ${opcion.color}` : ''"
v-on:click="cambiarDescripcionDescarga(indice)" :color-min="opcion.color" v-on:click="cambiarDescripcionDescarga(indice)" :color-min="opcion.color"
:id="`opcion${indice}`"> :id="`opcion${indice}`">
{{ opcion.formato }} {{ opcion.res }}<br>{{ opcion.servidor }} {{ opcion.formato }} {{ opcion.res }}<br>{{ opcion.servidor }}
@ -18,9 +18,9 @@
</div> </div>
<div class="panel__descripcion"> <div class="panel__descripcion">
<template v-for="(opcion, indice) in datos.opciones"> <template v-for="(opcion, indice) in datos">
<div :id="`tarjeta${indice}`" :style="indice !== 0? 'display: none' : ''"> <div :id="`tarjeta${indice}`" :style="indice !== '1'? 'display: none' : ''">
<div class="panel__descripcion__titulo" :style="'color: ' + color"> <div class="panel__descripcion__titulo" :style="'color: ' + color">
Links<br> Links<br>
@ -29,9 +29,9 @@
Todos los links se abren en una pestaña nueva.<br> Todos los links se abren en una pestaña nueva.<br>
<br> <br>
Episodio {{ num }} -> Episodio {{ num }} ->
<a :href="ep[2]" target="_blank" :style="'color: ' + color" <a :href="ep.link" target="_blank" :style="'color: ' + color"
@mousedown.stop="incrementarContador(opcion.key, num, $event)"> @mousedown.stop="incrementarContador(ep.ep_ID, $event)">
{{ ep[1] }} {{ ep.peso }}
</a> </a>
</span> </span>
@ -84,7 +84,7 @@
console.log(":c"); console.log(":c");
} }
}, },
incrementarContador (variante, episodio, evento) { incrementarContador (ep_ID, evento) {
const xhr = new XMLHttpRequest(); const xhr = new XMLHttpRequest();
xhr.open("PUT","/links"); xhr.open("PUT","/links");
@ -92,7 +92,7 @@
xhr.onload = () => { xhr.onload = () => {
console.log(xhr.responseText); console.log(xhr.responseText);
}; };
xhr.send(`nombre=${ this.nombre }&variante=${ variante }&episodio=${ episodio }`); xhr.send(`ep_ID=${ ep_ID }`);
} }
} }

View File

@ -21,10 +21,15 @@
<lista-animes :lista-animes="listaAnimes" /> <lista-animes :lista-animes="listaAnimes" />
</div>
<br> <br>
<div class="caja">
<button class="btn" @click="mostrarCrearAnime">Crear un anime</button> <button class="btn" @click="mostrarCrearAnime">Crear un anime</button>
<br> <br>
<crear-anime :render="crearAnime" /> <crear-anime :render="crearAnime" />
<br>
<br>
</div> </div>
<br> <br>
<br> <br>
@ -39,6 +44,8 @@
import ListaAnimes from "../components/Administracion/lista-animes"; import ListaAnimes from "../components/Administracion/lista-animes";
import CrearAnime from "../components/Administracion/crear-anime"; import CrearAnime from "../components/Administracion/crear-anime";
const YAML = require('yaml');
export default { export default {
name: "Administracion", name: "Administracion",
components: {CrearAnime, ListaAnimes}, components: {CrearAnime, ListaAnimes},
@ -54,12 +61,12 @@
const xhr = new XMLHttpRequest(); const xhr = new XMLHttpRequest();
xhr.open("GET", "/a/"); xhr.open("GET", "/a/");
xhr.onload = () => { xhr.onload = () => {
console.log(xhr.responseText); this.listaAnimes = YAML.parse(xhr.responseText);
}; };
xhr.send(); xhr.send();
}, },
mostrarCrearAnime () { mostrarCrearAnime () {
this.crearAnime = true; this.crearAnime = !this.crearAnime;
} }
} }
} }

View File

@ -63,10 +63,14 @@
for (const animeI in window.indiceAnimes) { for (const animeI in window.indiceAnimes) {
const anime = window.indiceAnimes[animeI]; const anime = window.indiceAnimes[animeI];
if (anime.link === link) { if (anime.link === link) {
vm.datos = anime; vm.datos = anime;
vm.existe = true; vm.existe = true;
vm.color = anime.data.color; if (anime.color)
vm.color = anime.color;
else
vm.color = '#23bf87';
break; break;
} }
} }

32
srv/Admin/OP/nuevoOP.ts Normal file
View File

@ -0,0 +1,32 @@
const nuevoOP = (req: any, res: any) => {
const con = require('../../mysql').obtenerConexionMySql();
const YAML = require('yaml');
const data = YAML.parse(req.body.data);
con.connect((err: any) => {
if (!err) {
con.query(
`INSERT INTO OP (anime_ID, num_OP, nombre, artista, eps) VALUES \
(${con.escape(data['anime_ID'])}, ${con.escape(data['num_OP'])}, ${con.escape(data['nombre'])}, ${con.escape(data['artista'])}, ${con.escape(data['eps'])})`,
(err: any) => {
if (!err) {
res.send("Exito :D");
} else {
}
}
);
} else {
}
});
};
module.exports.nuevoOP = nuevoOP;

View File

@ -0,0 +1,31 @@
const obtenerOPs = (req: any, res: any) => {
const con = require('../../mysql').obtenerConexionMySql();
const YAML = require('yaml');
const animeID: string = req.params.id;
con.connect((err: any) => {
if (!err && animeID) {
con.query(
`SELECT * FROM OP WHERE anime_ID=${con.escape(animeID)}`,
(err: any, resultado: object) => {
if (!err) {
res.send(YAML.stringify(resultado));
} else {
}
}
);
} else {
}
});
};
module.exports.obtenerOPs = obtenerOPs;

View File

@ -8,14 +8,15 @@ const crearAnime = (req: any, res: any) => {
const data = YAML.parse(req.body.data); const data = YAML.parse(req.body.data);
con.connect((err: any) => { con.connect((err: any) => {
if (!err) { if (!err) {
const query = `INSERT INTO animes
con.query(
`INSERT INTO animes
(titulo, link, imgUrl, descripcion, estudio, eps, alAire, temporada, anio, fuente, generos, color) (titulo, link, imgUrl, descripcion, estudio, eps, alAire, temporada, anio, fuente, generos, color)
VALUES ('${data.titulo}', '${data.link}', '${data.imgUrl}', '${data.descripcion}', VALUES (${con.escape(data.titulo)}, ${con.escape(data.link)}, ${con.escape(data.imgUrl)}, ${con.escape(data.descripcion)},
'${data.estudio}', ${data.eps}, '${data.alAire}', '${data.temporada}', '${data.anio}', ${con.escape(data.estudio)}, ${data.eps}, ${con.escape(data.alAire)}, ${con.escape(data.temporada)}, ${con.escape(data.anio)},
'${data.fuente}', '${data.generos}', '${data.color}')`, ${con.escape(data.fuente)}, ${con.escape(data.generos)}, ${con.escape(data.color)})`
(err: any, respuesta: any) => { ;
con.query(
query,
(err: any) => {
if (!err) { if (!err) {
res.send("Exito"); res.send("Exito");
} else { } else {

View File

@ -7,12 +7,11 @@ const obtenerTodosAnimes = (req: any, res: any) => {
if (!err) { if (!err) {
con.query( con.query(
`SELECT anime_ID ,titulo FROM animes`, `SELECT anime_ID ,titulo FROM animes ORDER BY anime_ID DESC `,
(err: any, respuesta: any) => { (err: any, respuesta: any) => {
if (!err) { if (!err) {
const resultado = YAML.stringify(respuesta); const resultado = YAML.stringify(respuesta);
console.log("El resultado en YAML es:\n" + resultado);
res.send(resultado); res.send(resultado);
} else { } else {

View File

@ -1,8 +1,6 @@
const modificarLink = (req: any, res: any) => { const modificarLink = (req: any, res: any) => {
const nombre = req.body.nombre; const ep_ID = req.body.ep_ID;
const variante = parseInt(req.body.variante);
const episodio = req.body.episodio;
const con = require('../mysql').obtenerConexionMySql(); const con = require('../mysql').obtenerConexionMySql();
@ -10,31 +8,12 @@ const modificarLink = (req: any, res: any) => {
if (!err) { if (!err) {
con.query( con.query(
`SELECT data FROM links WHERE nombre='${nombre}'`, `UPDATE eps SET visitas=visitas+1 WHERE ep_ID=${ep_ID};`,
(err: any, respuesta: any) => { (err: Error) => {
if (!err) { if (!err) {
res.send("Actualizado con exito.");
const data = JSON.parse(respuesta[0]["data"]);
for (const opcion of data["opciones"]) {
if (opcion.key === variante) {
opcion["eps"][episodio][0]++;
}
}
con.query(
`UPDATE links SET data='${JSON.stringify(data)}' WHERE nombre='${nombre}'`,
(err:any) => {
if (err)
console.log("Error al actualizar la tabla :c");
con.end();
}
);
} else { } else {
console.log("Eror al ejecutar query."); console.log("Error al actualizar el episodio :c");
con.end();
} }
} }
); );

View File

@ -1,18 +1,163 @@
class GestorDeTareas {
tareas: boolean[] = [];
alCompletar: (() => void);
constructor(alCompletar: (() => void)) {
console.log("Lo cree :c");
this.alCompletar = alCompletar;
}
agregarTarea() {
return (this.tareas.push(false) - 1);
}
terminarTarea(num: number) {
this.tareas[num] = true;
this.verificarTareas();
}
verificarTareas() {
this.tareas.forEach((x: boolean) => {
if (!x)
return;
});
this.alCompletar();
}
}
const YAML = require('yaml');
interface links {
links_ID: number,
anime_ID: number,
aviso: string,
sigEp: string
}
interface links_opciones {
opcion_ID: number,
links_ID: number,
num_opcion: number,
formato: string,
res: string,
servidor: string,
color: string
}
interface eps {
ep_ID: number,
opcion_ID: number,
num_ep: number,
visitas: number,
link: string,
peso: string
}
interface LinksEps {
ep_ID: number,
visitas: number,
peso: string,
link: string
}
interface Links {
aviso: string,
sigEp: string
opciones: {
[num: number]: {
formato: string,
res: string,
servidor: string,
color: string,
eps: {
[num: number]: LinksEps
}
}
}
}
const obtenerLinks = (req: any, res: any) => { const obtenerLinks = (req: any, res: any) => {
const con = require('../mysql').obtenerConexionMySql(); const con = require('../mysql').obtenerConexionMySql();
const nombre = req.body.nombre; const animeID = req.body.animeID;
con.connect((err: any) => { con.connect((err: any) => {
if (!err && nombre !== undefined) { if (!err && animeID !== undefined) {
const data: Links = {aviso: '', sigEp: '', opciones: {}};
con.query( con.query(
`SELECT data FROM links WHERE nombre='${nombre}'`, `SELECT * FROM links WHERE anime_ID=${animeID} `,
(err: any, response: any) => { (err: Error, response: links[]) => {
if (!err && response[0] ) { if (!err && response[0] ) {
const objecto = JSON.parse(response[0]["data"]); const subData: links = response[0];
data.aviso = subData.aviso;
data.sigEp = subData.sigEp;
res.send(`{ "exito": true, "payload": ${JSON.stringify(objecto)} }`);
const gestorOpciones = new GestorDeTareas(() => {
console.log(YAML.stringify(data));
res.send(YAML.stringify(data));
});
con.query(
`SELECT * FROM links_opciones WHERE links_ID=${subData.links_ID}`,
(err: Error, response: links_opciones[]) => {
if (!err && response[0]) {
for (const opcionID in response) {
const opcion = response[opcionID];
const tareaActualOpcion = gestorOpciones.agregarTarea();
data.opciones[opcion.num_opcion] = {
formato: opcion.formato,
res: opcion.res,
servidor: opcion.servidor,
color: opcion.color,
eps: {}
};
con.query(
`SELECT * FROM eps WHERE opcion_ID=${opcion.opcion_ID}`,
(err: Error, response: eps[]) => {
if (!err && response[0]) {
for (const epID in response) {
const ep = response[epID];
const eps: LinksEps = {
ep_ID: ep.ep_ID,
visitas: ep.visitas,
peso: ep.peso,
link: ep.link
};
data.opciones[opcion.num_opcion].eps[ep.num_ep] = eps;
}
gestorOpciones.terminarTarea(tareaActualOpcion);
} else if (!err) {
console.log("No existen episodios para esta variante");
res.send(`{ "exito": false }`);
} else {
console.log("Error al obtener eps:\n" + err);
res.send(`{ "exito": false }`);
}
}
);
}
} else if (!err) {
console.log("No existen links_opciones ");
res.send(`{ "exito": false }`);
} else {
console.log("Error al obtener links opciones:\n" + err);
res.send(`{ "exito": false }`);
}
}
);
} else if (!err) { } else if (!err) {
console.log("Error: La consulta no dio ningun resultado en obtenerLinks"); console.log("Error: La consulta no dio ningun resultado en obtenerLinks");
@ -21,15 +166,14 @@ const obtenerLinks = (req: any, res: any) => {
res.send(`{ "exito": false }`); res.send(`{ "exito": false }`);
} }
con.end();
} }
); );
} else { } else {
console.log("Hubo un error al conectarse a la base de datos :c"); console.log("Hubo un error al conectarse a la base de datos :c");
res.send(`{ "exito": false }`); res.send(`{ "exito": false }`);
con.end();
} }
}); });

View File

@ -21,4 +21,7 @@ export default (app:any) => {
app.put('/a/', require('./Admin/crearAnime').crearAnime); app.put('/a/', require('./Admin/crearAnime').crearAnime);
app.get('/a/', require('./Admin/obtenerTodosAnimes').obtenerTodosAnimes); app.get('/a/', require('./Admin/obtenerTodosAnimes').obtenerTodosAnimes);
app.get('/op/:id', require('./Admin/OP/obtenerOPs').obtenerOPs);
app.post('/op/', require('./Admin/OP/nuevoOP').nuevoOP);
} }

View File

@ -70,5 +70,6 @@ CREATE TABLE eps (
opcion_ID INT, opcion_ID INT,
num_ep INT, num_ep INT,
visitas INT DEFAULT 0, visitas INT DEFAULT 0,
link TINYTEXT link TINYTEXT,
peso VARCHAR(10)
); );