rzkfyn / otakudesu-scraper

unofficial otakudesu.cam rest api
https://otakudesu-unofficial-api.vercel.app/v1/
MIT License
42 stars 25 forks source link

REQUEST UPDATE episode.ts #2

Closed Sisableng closed 1 year ago

Sisableng commented 1 year ago

bang maaf, kalo boleh saya ngasi saran buat update src/utils/episode.ts untuk get /api/v1/anime/:slug/episodes/:episode soalnya saya rasa kurang akurat, untuk contoh kasus di episode one piece total episode nya kan same 1073 episode cuma karna ada pembatas episode dari otakudesunya jadi kalo di total dari http://localhost:8080/api/v2/anime/op-sub-indo/episodes length data nya itu ada 376, untuk kode abang kan ngabil dari length data nya ya, saya nyoba ubah jadi by episode slug nya, ngubah number jadi string jadi untuk get episode /api/v1/anime/op-sub-indo/episodes/wpoiec-episode-1079-sub-indo

ini saya edit episodeByEpisodeNumberHandler buat hapus

if (!parseInt(episode))
    return res.status(400).json({
      status: "Error",
      message: "The episode NUMBER parameter must be a NUMBER!",
    });
  if (parseInt(episode) < 1)
    return res.status(400).json({
      status: "Error",
      message: "The episode number parameter must be greater than 0!",
    });

sama edit pengkondisian animeSlug di src/utils/episode.ts, juga ngubah episodeNumber ke string

iimport axios from "axios";
import episodes from "./episodes.js";
import scrapeEpisode from "../lib/scrapeEpisode.js";

const { BASEURL } = process.env;
const episode = async ({
  episodeSlug,
  animeSlug,
  episodeNumber,
}: {
  episodeSlug?: string | undefined;
  animeSlug?: string | undefined;
  episodeNumber?: string | undefined;
}) => {
  let slug: any = "";

  if (episodeSlug) slug = episodeSlug;
  if (animeSlug) {
    const episodeLists = await episodes(animeSlug);
    // Find the episode with the matching slug and episode number
    const matchingEpisode = episodeLists?.find(
      (episode) => episode.slug === episodeNumber
    );

    if (!matchingEpisode) {
      return undefined; // Episode not found
    }

    slug = matchingEpisode.slug;
  }

  const { data } = await axios.get(`${BASEURL}/episode/${slug}`);
  const result = scrapeEpisode(data);

  return result;
};

export default episode;

dan untuk penggunaan parameter nya jadi /api/v1/anime/op-sub-indo/episodes/wpoiec-episode-1073-sub-indo

dan ini result nya

{
  "status": "Ok",
  "data": {
    "episode": "One Piece Episode 1073 Subtitle Indonesia",
    "anime": {
      "slug": "https:/otakudesu.lol/episode/wpoiec-episode-1072-sub-indo/",
       ....
     }
   }
}

kalo seperti ini kan lebih akurat parameter sama data nya juga, mungkin solusi ini bisa lebih effisien bang buat ngambil berdasarkan slug nya lagsung, bukan dari total episode length nya

rzkfyn commented 1 year ago

mohon maaf baru saya respon, terimakasih banyak atas temuannya mas. namun endpoint /api/v1/anime/:slug/episodes/:episode tujuannya untuk mendapatkan episode dengan episode number nya, bukan episode slug nya. jika saran yang mas wildan saya gunakan, sekalian saja endpoint /api/v1/anime/:slug/episodes/:episodeNumber dihapus dan hanya gunakan /api/v1/episode/:episodeSlug. namun tenang, saya rasa saya punya solusi yang cukup baik.

jika diperhatikan, episode slug di otakudesu selalu berpola sama pada prefix nya<prefix-episode-slug>-episode-<episodeNumber>-sub-indo, jadi untuk resolve masalah yang mas wildan paparkan di atas, bisa dengan

if (animeSlug && episodeNumber) {
  const episodeLists = await episodes(animeSlug);
  if (!episodeLists) return undefined;

  const splittedEpisodeSlug = episodeLists[0].slug?.split('-episode-') as string[];
  const prefixEpisodeSlug = splittedEpisodeSlug[0];
  const firstEpisodeNumber = splittedEpisodeSlug[1].replace('-sub-indo', '');

  slug = `${prefixEpisodeSlug}-episode-${episodeNumber - (parseInt(firstEpisodeNumber) == 0 ? 1 : 0)}-sub-indo`;
}

di atas juga sudah ditambahkan pengecekan, jika episode pertamanya itu episode 0, maka episodeNumber akan dikurangi sejumlah satu dari number yang ditambahkan pada parameter.

dengan perubahan tersebut, case yang mas wildan temukan diatas, tidak akan terjadi lagi tanpa mengubah apa tujuan awal dari endpoint /api/v1/anime/:slug/episodes/:episodeNumber.

image
rzkfyn commented 1 year ago

sudah di fix di #3 ya, sekali lagi terima kasih mas.