Skip to content

Commit

Permalink
Merge pull request #145 from koikiss-dev/TokyoTF
Browse files Browse the repository at this point in the history
New changes to keep the project updated
  • Loading branch information
koikiss-dev authored Feb 9, 2024
2 parents 1a86c47 + da81b26 commit 5bddd79
Show file tree
Hide file tree
Showing 19 changed files with 544 additions and 232 deletions.
443 changes: 286 additions & 157 deletions package-lock.json

Large diffs are not rendered by default.

13 changes: 11 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,23 @@
"description": "API for scraping multimedia content such as anime, movies, series, and manga",
"main": "src/index.ts",
"scripts": {
"start": "node build/index.js",
"start": "tsc && node build/index.js",
"start:stable": "ts-node build/index.js",
"server": "nodemon src/index.ts",
"format": "prettier --ignore-path .gitignore --write \"**/*.+(js|ts|json)\"",
"linter": "npx eslint src/scraper/* src/routes/*",
"linter:win": "npx eslint src/scraper/** src/routes/**",
"build": "tsc",
"zoro": "ts-node src/scraper/sites/anime/zoro/Zoro.ts",
"heroku-postbuild": "npm run build",
"start:dev": "nodemon src/index.ts",
"test": "jest --coverage"
},
"pre-commit": [
"ts.check",
"build",
"add-build"
],
"keywords": [
"scraper",
"api",
Expand Down Expand Up @@ -44,7 +52,9 @@
"express": "^4.18.2",
"helmet": "^6.0.1",
"morgan": "^1.10.0",
"ts-alias": "^0.0.7",
"ts-node": "^10.9.1",
"tsc-alias": "^1.8.8",
"underscore": "^1.13.6",
"unpacker": "^1.0.1"
},
Expand All @@ -68,7 +78,6 @@
"prettier": "^3.0.3",
"pretty": "^2.0.0",
"ts-jest": "^29.1.0",
"tsconfig-paths": "^4.2.0",
"tslib": "^2.5.0",
"typescript": "^4.9.5"
}
Expand Down
30 changes: 16 additions & 14 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,21 +7,22 @@ import cors from 'cors'


/* Anime */
import flv from "@routes/anime/animeflv/AnimeflvRoutes";
import latinhd from "@routes/anime/animelatinohd/AnimeLatinoHDRoutes";
import gogoanime from "@routes/anime/gogoanime/GogoAnimeRoute";
import zoro from "@routes/anime/zoro/ZoroRoutes";
import monoschinos from "@routes/anime/monoschinos/MonosChinosRoute";
import tioanime from '@routes/anime/tioanime/TioAnimeRoute'
import WcoStream from "@routes/anime/wcostream/wcostreamRoutes";
import AnimeBlix from "@routes/anime/animeblix/AnimeBlixRoutes";
import flv from "../src/routes/v1/anime/animeflv/AnimeflvRoutes";
import latinhd from "../src/routes/v1/anime/animelatinohd/AnimeLatinoHDRoutes";
import gogoanime from "../src/routes/v1/anime/gogoanime/GogoAnimeRoute";
import zoro from "../src/routes/v1/anime/zoro/ZoroRoutes";
import monoschinos from "../src/routes/v1/anime/monoschinos/MonosChinosRoute";
import tioanime from '../src/routes/v1/anime/tioanime/TioAnimeRoute'
import WcoStream from "../src/routes/v1/anime/wcostream/wcostreamRoutes";
//import AnimeBlix from "../src/routes/v1/anime/animeblix/AnimeBlixRoutes";
import Animevostfr from "../src/routes/v1/anime/animevostfr/AnimevostfrRoutes";

/* Manga */
import comick from "@routes/manga/comick/ComickRoutes";
import inmanga from "@routes/manga/inmanga/InmangaRoutes";
import nhentai from "@routes/manga/nhentai/NhentaiRoutes"
import mangareader from "@routes/manga/mangareader/MangaReaderRoutes";
import manganelo from "@routes/manga/manganelo/ManganeloRoutes";
import comick from "../src/routes/v1/manga/comick/ComickRoutes";
import inmanga from "../src/routes/v1/manga/inmanga/InmangaRoutes";
import nhentai from "../src/routes/v1/manga/nhentai/NhentaiRoutes"
import mangareader from "../src/routes/v1/manga/mangareader/MangaReaderRoutes";
import manganelo from "../src/routes/v1/manga/manganelo/ManganeloRoutes";

const app = express();
const port = process.env.PORT || 3000;
Expand All @@ -47,7 +48,8 @@ app.use(monoschinos);
app.use(zoro);
app.use(tioanime)
app.use(WcoStream);
app.use(AnimeBlix);
//app.use(AnimeBlix);
app.use(Animevostfr);

/* anime */

Expand Down
3 changes: 2 additions & 1 deletion src/routes/v1/anime/animeblix/AnimeBlixRoutes.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Router } from "express";
import { AnimeBlix } from "../../../../scraper/sites/anime/AnimeBlix/AnimeBlix";
import { AnimeBlix } from "../../../../scraper/sites/anime/animeBlix/AnimeBlix";

Check failure on line 2 in src/routes/v1/anime/animeblix/AnimeBlixRoutes.ts

View workflow job for this annotation

GitHub Actions / build

Cannot find module '../../../../scraper/sites/anime/animeBlix/AnimeBlix' or its corresponding type declarations.

const Anime = new AnimeBlix();
const router = Router();

Expand Down
2 changes: 1 addition & 1 deletion src/routes/v1/anime/animelatinohd/AnimeLatinoHDRoutes.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Router } from "express";
import { AnimeLatinoHD } from "@providers/animelatinohd/AnimeLatinoHD";
import { AnimeLatinoHD } from "../../../../scraper/sites/anime/animelatinohd/AnimeLatinoHD";
const Anime = new AnimeLatinoHD();
const router = Router();

Expand Down
31 changes: 31 additions & 0 deletions src/routes/v1/anime/animevostfr/AnimevostfrRoutes.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { Router } from "express";
import { Animevostfr } from "../../../../scraper/sites/anime/animevostfr/Animevostfr";
const Anime = new Animevostfr();
const router = Router();

// Filter
router.get("/anime/animevostfr/filter", async (req, res) => {
const { search, type, page, year, genre } = req.query

const data = await Anime.GetAnimeByFilter(search as string, type as unknown as number, page as unknown as number, year as string, genre as string)
res.send(data)
});

// Anime Info +(Episodes list)
router.get("/anime/animevostfr/name/:name", async (req, res) => {

const { name } = req.params
const data = await Anime.GetAnimeInfo(name)
res.send(data)

});

// Episode Info +(Video Servers)
router.get("/anime/animevostfr/episode/:episode", async (req, res) => {
const { episode } = req.params
const data = await Anime.GetEpisodeServers(episode)
res.send(data)

});

export default router
4 changes: 2 additions & 2 deletions src/routes/v1/anime/wcostream/wcostreamRoutes.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { Router } from "express";
import { WcoStream } from "@providers/wcostream/WcoStream";
import { RuntimeUnpacked } from "@animetypes/utils";
import { WcoStream } from "../../../../scraper/sites/anime/wcostream/WcoStream";
import { RuntimeUnpacked } from "../../../../types/utils";
const Anime = new WcoStream();
const router = Router();

Expand Down
2 changes: 1 addition & 1 deletion src/routes/v1/doramas/dramanice/DramaniceRoutes.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Router } from "express";
import { Dramanice } from "@providers/dramanice/Dramanice";
import { Dramanice } from "../../../../scraper/sites/doramas/dramanice/Dramanice";
const Dorama = new Dramanice();
const router = Router();

Expand Down
2 changes: 1 addition & 1 deletion src/routes/v1/manga/comick/ComickRoutes.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Router } from "express";
import { Comick } from "@providers/comick/Comick";
import { Comick } from "../../../../scraper/sites/manga/comick/Comick";
const Manga = new Comick();
const router = Router();

Expand Down
2 changes: 1 addition & 1 deletion src/routes/v1/manga/inmanga/InmangaRoutes.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Router } from "express";
import { Inmanga } from "@providers/inmanga/Inmanga";
import { Inmanga } from "../../../../scraper/sites/manga/inmanga/Inmanga";
const Manga = new Inmanga();
const router = Router();

Expand Down
27 changes: 4 additions & 23 deletions src/scraper/sites/anime/AnimeBlix/AnimeBlix.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import * as cheerio from "cheerio";
import axios from "axios";
import { Anime } from "@animetypes/anime";
import { Episode, EpisodeServer } from "@animetypes/episode";
import { AnimeSearch, ResultSearch, IResultSearch, IAnimeSearch } from "@animetypes/search";
import { Anime } from "../../../../types/anime";
import { Episode, EpisodeServer } from "../../../../types/episode";
import { AnimeSearch, ResultSearch, IResultSearch, IAnimeSearch } from "../../../../types/search";
//import { Calendar } from "@animetypes/date";

/** List of Domains
Expand Down Expand Up @@ -91,26 +91,7 @@ export class AnimeBlix {

const { data } = await axios.get(`${this.url}/${anime.replace("ver-","")}-${number}`);
const $ = cheerio.load(data);
fetch("https://vwv.animeblix.org/back", {
"headers": {
"accept": "*/*",
"accept-language": "es-419,es;q=0.9,es-ES;q=0.8,en;q=0.7,en-GB;q=0.6,en-US;q=0.5",
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
"sec-ch-ua": "\"Not A(Brand\";v=\"99\", \"Microsoft Edge\";v=\"121\", \"Chromium\";v=\"121\"",
"sec-ch-ua-mobile": "?0",
"sec-ch-ua-platform": "\"Windows\"",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
"x-requested-with": "XMLHttpRequest",
"cookie": "dom3ic8zudi28v8lr6fgphwffqoz0j6c=85632e4b-e8b5-4427-be7b-8b3c7156a788%3A1%3A1; sb_main_47d33eb2af15845dedc4fb60a160b2b4=1; sb_count_47d33eb2af15845dedc4fb60a160b2b4=2; sb_onpage_47d33eb2af15845dedc4fb60a160b2b4=0; sb_page_47d33eb2af15845dedc4fb60a160b2b4=7; pp_main_325f99fa973f521d38ec7eea8396403e=1; pp_sub_325f99fa973f521d38ec7eea8396403e=1",

"Referrer-Policy": "strict-origin-when-cross-origin"
},
"body": "acc=opt&i=333334322d3132",
"method": "POST"
}).then((e) =>e).then(async(e) =>console.log(await e.text()));


const AnimeEpisodeInfo: Episode = {
name: number,
url: `/anime/animeblix/episode/${episode}`,
Expand Down
6 changes: 3 additions & 3 deletions src/scraper/sites/anime/animelatinohd/AnimeLatinoHD.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import * as cheerio from "cheerio";
import axios from "axios";
import { Anime } from "@animetypes/anime";
import { Episode, EpisodeServer } from "@animetypes/episode";
import { AnimeSearch, ResultSearch, IResultSearch, IAnimeSearch } from "@animetypes/search";
import { Anime } from "../../../../types/anime";
import { Episode, EpisodeServer } from "../../../../types/episode";
import { AnimeSearch, ResultSearch, IResultSearch, IAnimeSearch } from "../../../../types/search";

export class AnimeLatinoHD {
readonly url = "https://www.animelatinohd.com";
Expand Down
166 changes: 166 additions & 0 deletions src/scraper/sites/anime/animevostfr/Animevostfr.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
import * as cheerio from "cheerio";
import axios from "axios";
import { Anime } from "../../../../types/anime";
import { Episode, EpisodeServer } from "../../../../types/episode";
import { AnimeSearch, ResultSearch, IResultSearch, IAnimeSearch } from "../../../../types/search";
//import { Calendar } from "@animetypes/date";

/** List of Domains
*
* https://animevostfr.tv
*
*/

export class Animevostfr {
readonly url = "https://animevostfr.tv";
readonly api = "https://api.animelatinohd.com";

async GetAnimeInfo(anime: string): Promise<Anime> {
try {
const { data } = await axios.get(`${this.url}/${anime}`);
const $ = cheerio.load(data);


const AnimeTypes = $(".mvic-info .mvici-right p strong:contains(' Type:')").nextAll().text()
const AnimeStatus = $(".mvic-info .mvici-right p a[rel='tag']").first().text()
const AnimeDate = $(".mvic-info .mvici-right p strong:contains(' An:')").nextAll().text()
const AnimeDescription = $(".mvi-content .mvic-desc .desc p").html()




const AnimeInfo: Anime = {
name: $(".mvi-content .mvic-desc h1").text(),
url: `/anime/animevostfr/name/${anime}`,
synopsis: AnimeDescription.slice(AnimeDescription.indexOf("Synopsis:") + "Synopsis:".length, -1).trim(),
alt_name: [...AnimeDescription.slice(AnimeDescription.indexOf("Titre alternatif:") + "Titre alternatif:".length, AnimeDescription.indexOf("Synopsis:")).replace("<br>\n", "").split("/").map((n) => n.replace(/^\s+|\s+$|\s+(?=\s)/g, ""))],
image: {
url: $(".mvi-content .mvic-thumb img").attr("data-lazy-src")
},
genres: [...$(".mvic-info .mvici-left p").first().text().replace("\n Genres:\n ", "").split(",").map((n) => n.replace(/^\s+|\s+$|\s+(?=\s)/g, ""))],
type: AnimeTypes == "Anime" ? "Anime" : AnimeTypes == "MOVIE" ? "Movie" : "Null", //tv,pelicula,especial,ova
status: AnimeStatus == "En cours" ? true : false,
date: AnimeDate ? { year: AnimeDate } : null,
episodes: []
}

$("#seasonss .les-title").each((_i, e) => {

const number = $(e).find("a").attr("href").substring($(e).find("a").attr("href").lastIndexOf("-") + 1).replace("/", "")
const AnimeEpisode: Episode = {
name: "Episode " + number,
number: number,
image: "",
url: `/anime/animevostfr/episode/${anime + "-" + number}`
}

AnimeInfo.episodes.push(AnimeEpisode);
})

return AnimeInfo;

} catch (error) {
console.log(error)
}
}
async GetEpisodeServers(episode: string): Promise<Episode> {
try {

const number = episode.substring(episode.lastIndexOf("-") + 1)
const anime = episode.substring(0, episode.lastIndexOf("-"))

const { data } = await axios.get(`${this.url}/episode/${anime}-episode-${number}`);
const $ = cheerio.load(data);
const s = $('.form-group.list-server select option')
const e = $('.list-episodes select option')
const ListFilmId = []
const ListServer = []

s.map((_i, e) => ListServer.push($(e).val()))
e.map((_i, e) => ListFilmId.push($(e).attr("episodeid")))

/*
"SERVER_VIP"
"SERVER_HYDRAX"
"SERVER_PHOTOSS"
"SERVER_DOWNLOAD"
"SERVER_PHOTOS"
"SERVER_OPEN_LOAD"
"SERVER_OPEN_LOADS"
"SERVER_OPEN_CDN"
"SERVER_OPEN_CDNO"
"SERVER_PHOTO"
"SERVER_STREAM_MANGO"
"SERVER_RAPID_VIDEO"
*/

const AnimeEpisodeInfo: Episode = {
name: "Episode " + number,
url: `/anime/animevostfr/episode/${episode}`,
number: number,
image: "",
servers: []
}

await Promise.all(ListServer.map(async (n) => {
const servers = await axios.get(`${this.url}/ajax-get-link-stream/?server=${n}&filmId=${ListFilmId[0]}`)
let currentData = servers.data
if (n == "opencdn" || n == "photo") {
currentData = currentData.replace("?logo=https://animevostfr.tv/1234.png", "").replace("short.ink/", "abysscdn.com/?v=")
}
const Servers: EpisodeServer = {
name: n,
url: currentData,
}
AnimeEpisodeInfo.servers.push(Servers)
}))



AnimeEpisodeInfo.servers.sort((a: EpisodeServer, b: EpisodeServer) => a.name.length - b.name.length)
return AnimeEpisodeInfo;
} catch (error) {
console.log(error)
}
}

async GetAnimeByFilter(search?: string, type?: number, page?: number, year?: string, genre?: string): Promise<IResultSearch<IAnimeSearch>> {
try {
const { data } = await axios.get(`${this.api}/api/anime/list`, {
params: {
search: search,
type: type,
year: year,
genre: genre,
page: page
}
});

const animeSearchParseObj = data

const animeSearch: ResultSearch<IAnimeSearch> = {
nav: {
count: animeSearchParseObj.data.length,
current: animeSearchParseObj.current_page,
next: animeSearchParseObj.data.length < 28 ? 0 : animeSearchParseObj.current_page + 1,
hasNext: animeSearchParseObj.data.length < 28 ? false : true
},
results: []
}
animeSearchParseObj.data.map(e => {
const animeSearchData: AnimeSearch = {
name: e.name,
image: "https://www.themoviedb.org/t/p/original" + e.poster + "?&w=53&q=95",
url: `/anime/animelatinohd/name/${e.slug}`,
type: ""
}
animeSearch.results.push(animeSearchData)
})
return animeSearch;
} catch (error) {
console.log(error)
}
}

}

8 changes: 4 additions & 4 deletions src/scraper/sites/anime/wcostream/WcoStream.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import * as cheerio from "cheerio";
import axios from "axios";
import { Anime } from "@animetypes/anime";
import { Episode, EpisodeServer } from "@animetypes/episode";
import { IResultSearch, IAnimeSearch, ResultSearch, AnimeSearch } from "@animetypes/search";
import { UnPacked } from"@animetypes/utils";
import { Anime } from "../../../../types/anime";
import { Episode, EpisodeServer } from "../../../../types/episode";
import { IResultSearch, IAnimeSearch, ResultSearch, AnimeSearch } from "../../../../types/search";
import { UnPacked } from"../../../../types/utils";

/** List of Domains
* https://wcostream.tv
Expand Down
Loading

0 comments on commit 5bddd79

Please sign in to comment.