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",
"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.",
"data": {
"estudio": "P.A. Works",
"eps": "?",
"eps": "13",
"alAire": "06 de Octubre a ?",
"temporada": "Otono",
"anio": 2018,
@ -18,7 +17,6 @@
},
"ED": {
"1": "Mimei no Kimi to Hakumei no Mahou - Yanagi Nagi"
}
},
"onPagPrin": [true,1],
"key": 10001111
@ -28,7 +26,6 @@
"link": "/Anime/2018/Otono/Goblin-Slayer",
"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...",
"data": {
"estudio": "White Fox",
"eps": "12",
"alAire": "7 de octubre a ?",
@ -42,7 +39,6 @@
},
"ED": {
"1": "Gin no Kisei - Soraru"
}
},
"onPagPrin": [false,2],
"key": 10001110
@ -52,7 +48,6 @@
"link": "/Anime/2018/Verano/Overlord-3",
"imgUrl": "",
"descripcion": "Tercera temporada de Overlord.",
"data": {
"estudio": "Madhouse",
"eps": "13",
"alAire": "10 de Julio a 2 de Octubre",
@ -66,7 +61,6 @@
},
"ED": {
"1": "Silent Solitude - OxT"
}
},
"onPagPrin": [false,2],
"key": 10001101
@ -76,7 +70,6 @@
"link": "/Anime/2018/Verano/Banana-Fish",
"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ó.",
"data": {
"estudio": "MAPPA",
"eps": "24",
"alAire": "6 de Julio a 21 de Diciembre",
@ -92,7 +85,6 @@
"ED": {
"1": "Prayer X - King Gnu",
"2": "RED - Survive Said The Prophet"
}
},
"onPagPrin": [true,2],
"key": 10001100
@ -102,7 +94,6 @@
"link": "/Anime/2018/Primavera/Steins;Gate-0",
"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... ",
"data": {
"estudio": "White Fox",
"eps": "23",
"alAire": "12 de Abril a 27 de Septiembre",
@ -119,7 +110,6 @@
"2": "LAST GAME - Zwei",
"3": "World-Line - Amai Isami",
"4": "GATE OF STEINER - Sasaki Eri"
}
},
"onPagPrin": [false,0],
"key": 10001011
@ -129,7 +119,6 @@
"link": "/Anime/2018/Primavera/Mahou-Shoujo-Site",
"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. ",
"data": {
"estudio": "production doA",
"eps": "12",
"alAire": "7 de Abril a 23 de Junio",
@ -143,7 +132,6 @@
},
"ED": {
"1": "Zenzen Tomodachi - Yamazaki Haruka"
}
},
"onPagPrin": [true,3],
"key": 10001010
@ -153,7 +141,6 @@
"link": "/Anime/2018/Primavera/WotaKoi",
"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? ",
"data": {
"estudio": "A-1 Pictures",
"eps": "11",
"alAire": "13 de Abril a 22 de Junio",
@ -167,7 +154,6 @@
},
"ED": {
"1": "Kimi no Tonari - halca"
}
},
"onPagPrin": [false,0],
"key": 10001001
@ -177,7 +163,6 @@
"link": "/Anime/2018/Primavera/Shokugeki-no-Soma-3-2",
"imgUrl": "https://myanimelist.cdn-dena.com/images/anime/1604/93531.jpg",
"descripcion": "El segundo platillo de Shokugeki no Soma: San no Sara",
"data": {
"estudio": "J.C. Staff",
"eps": "12",
"alAire": "9 de Abril a 25 de Junio",
@ -191,7 +176,6 @@
},
"ED": {
"1": "Atria - Fo'xTails"
}
},
"onPagPrin": [false,0],
"key": 10001000
@ -201,7 +185,6 @@
"link": "/Anime/2018/Invierno/Violet-Evergarden",
"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. ",
"data": {
"estudio": "Kyoto Animation",
"eps": "13",
"alAire": "11 de Enero a 5 de Abril",
@ -216,7 +199,6 @@
"ED": {
"1": "Michishirube - Minori Chihara",
"2": "Believe in... - Yuuki Aira"
}
},
"onPagPrin": [false,0],
"key": 10000111
@ -226,7 +208,6 @@
"link": "/Anime/2017/Otono/Inuyashiki",
"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. ",
"data": {
"estudio": "MAPPA",
"eps": "11",
"alAire": "13 de Octubre al 22 de Diciembre",
@ -234,12 +215,12 @@
"anio": 2017,
"fuente": "Manga",
"generos": "Accion, Drama, Psicologico, Ciencia ficcion, Seinen",
"color": "#23BF87",
"OP": {
"1": "My Hero - MAN WITH A MISSION"
},
"ED": {
"1": "Ai wo Oshiete Kureta Kimi e - Qaijff"
}
},
"onPagPrin": [false,0],
"key": 10000110
@ -249,7 +230,6 @@
"link": "/Anime/2017/Otono/Kekkai-Sensen-Beyond",
"imgUrl": "https://myanimelist.cdn-dena.com/images/anime/9/88281.jpg",
"descripcion": "Segunda temporada de Kekkai Sensen.",
"data": {
"estudio": "Bones",
"eps": "12",
"alAire": "8 de Octubre al 24 de Diciembre",
@ -263,7 +243,6 @@
},
"ED": {
"1": "Step Up LOVE - DAOKO x Yasuyuki Okamura"
}
},
"onPagPrin": [false,0],
"key": 10000101
@ -273,7 +252,6 @@
"link": "/Anime/2017/Otono/Just-Because",
"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. ",
"data": {
"estudio": "Pine Jam",
"eps": "12",
"alAire": "5 de Octubre al 28 de Diciembre",
@ -287,7 +265,6 @@
},
"ED": {
"1": "behind - Mio Natsume (Karin Isobe), Hatsuki Morikawa (Yuna Yoshino), Ena Komiya (Lynn)"
}
},
"onPagPrin": [false,0],
"key": 10000100
@ -297,7 +274,6 @@
"link": "/Anime/2017/Otono/Shokugeki-no-Soma-3",
"imgUrl": "https://myanimelist.cdn-dena.com/images/anime/4/86603.jpg",
"descripcion": "Tercera temporada de Shokugeki no Soma",
"data": {
"estudio": "J.C. Staff",
"eps": "12",
"alAire": "4 de Octubre al 20 de Diciembre",
@ -311,7 +287,6 @@
},
"ED": {
"1": "Kyokyo Jitsujitsu - nano.RIPE"
}
},
"onPagPrin": [true,4],
"key": 10000011
@ -321,7 +296,6 @@
"link": "/Anime/2017/Verano/Kakegurui",
"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? ",
"data": {
"estudio": "MAPPA",
"eps": "12",
"alAire": "1 de Julio al 23 de Septiembre",
@ -335,7 +309,6 @@
},
"ED": {
"1": "LAYon-theLINE - D-selections"
}
},
"onPagPrin": [false,0],
"key": 10000010
@ -345,7 +318,6 @@
"link": "/Anime/2017/Verano/Re:Creators",
"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'?",
"data": {
"estudio": "TROYCA",
"eps": "22",
"alAire": "8 de Abril al 26 de Septiembre",
@ -363,7 +335,6 @@
"2": "NEWLOOK - Ayano Mashiro",
"3": "world Étude - Toyosaki Aki",
"4": "Rubikon - Sangatsu no Phantasia"
}
},
"onPagPrin": [false,0],
"key": 10000001
@ -372,8 +343,7 @@
"titulo": "Flip Flappers",
"link": "/Anime/2016/Otono/Flip-Flappers",
"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. ",
"data": {
"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.",
"estudio": "Studio 3Hz",
"eps": "13",
"alAire": "6 de Octubre al 29 de Diciembre",
@ -389,7 +359,6 @@
"1": "FLIP FLAP FLIP FLAP - TO-MAS feat.Chima",
"2": "find the wind - ZAQ",
"3": "Over the Rainbow - TO-MAS feat.Chima"
}
},
"onPagPrin": [false,0],
"key": 10000000

View File

@ -1,8 +1,15 @@
<template>
<div >
<div v-if="render">
<br>
Este es un proceso largo y doloroso, pero necesario. <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">
<span>Nombre: </span><input type="text" placeholder="nombre" required name="nombre"><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("Y en JSON:\n", JSON.stringify(respuesta));
const xhr = new XMLHttpRequest();
xhr.open("PUT","/a/");
@ -69,6 +75,19 @@
console.log("El servidor respondió:\n" + xhr.responseText);
};
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>
<div>
<div v-for="anime in listaAnimes">
lol?
</div>
<table class="striped">
<thead>
<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>
</template>
<script>
const YAML = require('yaml');
export default {
name: "lista-animes",
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>
<style scoped>
<style scoped lang="sass">
.columna-id
max-width: 40px
</style>

View File

@ -18,19 +18,19 @@
Especificaciones tecnicas
</div>
<div class="contenido--datos--descripcion">
Capitulos: {{ datos.data.eps }} <br>
Al Aire: {{ datos.data.alAire }} <br>
Temporada: {{ datos.data.temporada }} <br>
Estudio: {{ datos.data.estudio }} <br>
Fuente: {{ datos.data.fuente }} <br>
Generos: {{ datos.data.generos }} <br>
Capitulos: {{ datos.eps }} <br>
Al Aire: {{ datos.alAire }} <br>
Temporada: {{ datos.temporada }} <br>
Estudio: {{ datos.estudio }} <br>
Fuente: {{ datos.fuente }} <br>
Generos: {{ datos.generos }} <br>
<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>
</template>
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>
</template>
</div>
@ -56,6 +56,7 @@
import ProximoEpisodio from './proximoEpisodio.vue'
import AnuncioLocal from './anuncioLocal.vue'
import ComponenteCarga from '../comp-cargando.vue'
const YAML = require('yaml');
export default {
name: "Contenido",
@ -67,7 +68,10 @@
props: {
nombre: String,
datos: Object,
color: String,
color: {
type: String,
default: '#23BF87'
},
},
components: {
'anuncio-global': AnuncioGlobal,
@ -89,14 +93,16 @@
const vm = this;
xhr.onload = () => {
const data = JSON.parse(xhr.responseText);
if (data.exito) {
vm.datosAnime = data.payload;
const data = YAML.parse(xhr.responseText);
console.log("La data es:");
console.log(xhr.responseText);
if (data.opciones) {
vm.datosAnime = data["opciones"];
}
};
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>
<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"
:style="indice === 0? `background-color: ${opcion.color}` : ''"
:style="indice === '1'? `background-color: ${opcion.color}` : ''"
v-on:click="cambiarDescripcionDescarga(indice)" :color-min="opcion.color"
:id="`opcion${indice}`">
{{ opcion.formato }} {{ opcion.res }}<br>{{ opcion.servidor }}
@ -18,9 +18,9 @@
</div>
<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">
Links<br>
@ -29,9 +29,9 @@
Todos los links se abren en una pestaña nueva.<br>
<br>
Episodio {{ num }} ->
<a :href="ep[2]" target="_blank" :style="'color: ' + color"
@mousedown.stop="incrementarContador(opcion.key, num, $event)">
{{ ep[1] }}
<a :href="ep.link" target="_blank" :style="'color: ' + color"
@mousedown.stop="incrementarContador(ep.ep_ID, $event)">
{{ ep.peso }}
</a>
</span>
@ -84,7 +84,7 @@
console.log(":c");
}
},
incrementarContador (variante, episodio, evento) {
incrementarContador (ep_ID, evento) {
const xhr = new XMLHttpRequest();
xhr.open("PUT","/links");
@ -92,7 +92,7 @@
xhr.onload = () => {
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" />
</div>
<br>
<div class="caja">
<button class="btn" @click="mostrarCrearAnime">Crear un anime</button>
<br>
<crear-anime :render="crearAnime" />
<br>
<br>
</div>
<br>
<br>
@ -39,6 +44,8 @@
import ListaAnimes from "../components/Administracion/lista-animes";
import CrearAnime from "../components/Administracion/crear-anime";
const YAML = require('yaml');
export default {
name: "Administracion",
components: {CrearAnime, ListaAnimes},
@ -54,12 +61,12 @@
const xhr = new XMLHttpRequest();
xhr.open("GET", "/a/");
xhr.onload = () => {
console.log(xhr.responseText);
this.listaAnimes = YAML.parse(xhr.responseText);
};
xhr.send();
},
mostrarCrearAnime () {
this.crearAnime = true;
this.crearAnime = !this.crearAnime;
}
}
}

View File

@ -63,10 +63,14 @@
for (const animeI in window.indiceAnimes) {
const anime = window.indiceAnimes[animeI];
if (anime.link === link) {
vm.datos = anime;
vm.existe = true;
vm.color = anime.data.color;
if (anime.color)
vm.color = anime.color;
else
vm.color = '#23bf87';
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);
con.connect((err: any) => {
if (!err) {
con.query(
`INSERT INTO animes
const query = `INSERT INTO animes
(titulo, link, imgUrl, descripcion, estudio, eps, alAire, temporada, anio, fuente, generos, color)
VALUES ('${data.titulo}', '${data.link}', '${data.imgUrl}', '${data.descripcion}',
'${data.estudio}', ${data.eps}, '${data.alAire}', '${data.temporada}', '${data.anio}',
'${data.fuente}', '${data.generos}', '${data.color}')`,
(err: any, respuesta: any) => {
VALUES (${con.escape(data.titulo)}, ${con.escape(data.link)}, ${con.escape(data.imgUrl)}, ${con.escape(data.descripcion)},
${con.escape(data.estudio)}, ${data.eps}, ${con.escape(data.alAire)}, ${con.escape(data.temporada)}, ${con.escape(data.anio)},
${con.escape(data.fuente)}, ${con.escape(data.generos)}, ${con.escape(data.color)})`
;
con.query(
query,
(err: any) => {
if (!err) {
res.send("Exito");
} else {

View File

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

View File

@ -1,8 +1,6 @@
const modificarLink = (req: any, res: any) => {
const nombre = req.body.nombre;
const variante = parseInt(req.body.variante);
const episodio = req.body.episodio;
const ep_ID = req.body.ep_ID;
const con = require('../mysql').obtenerConexionMySql();
@ -10,31 +8,12 @@ const modificarLink = (req: any, res: any) => {
if (!err) {
con.query(
`SELECT data FROM links WHERE nombre='${nombre}'`,
(err: any, respuesta: any) => {
`UPDATE eps SET visitas=visitas+1 WHERE ep_ID=${ep_ID};`,
(err: Error) => {
if (!err) {
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();
}
);
res.send("Actualizado con exito.");
} else {
console.log("Eror al ejecutar query.");
con.end();
console.log("Error al actualizar el episodio :c");
}
}
);

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 con = require('../mysql').obtenerConexionMySql();
const nombre = req.body.nombre;
const animeID = req.body.animeID;
con.connect((err: any) => {
if (!err && nombre !== undefined) {
if (!err && animeID !== undefined) {
const data: Links = {aviso: '', sigEp: '', opciones: {}};
con.query(
`SELECT data FROM links WHERE nombre='${nombre}'`,
(err: any, response: any) => {
`SELECT * FROM links WHERE anime_ID=${animeID} `,
(err: Error, response: links[]) => {
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) {
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 }`);
}
con.end();
}
);
} else {
console.log("Hubo un error al conectarse a la base de datos :c");
res.send(`{ "exito": false }`);
con.end();
}
});

View File

@ -21,4 +21,7 @@ export default (app:any) => {
app.put('/a/', require('./Admin/crearAnime').crearAnime);
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,
num_ep INT,
visitas INT DEFAULT 0,
link TINYTEXT
link TINYTEXT,
peso VARCHAR(10)
);