BloodyInside's picture
firsty
947c08e
raw
history blame
9.28 kB
import axios from 'axios';
import JSZip from 'jszip';
import * as FileSystem from 'expo-file-system';
import { Platform } from 'react-native';
import translator from '@/constants/module/translator';
import Storage from '@/constants/module/storage';
import ComicStorage from '@/constants/module/comic_storage';
import ImageCacheStorage from '@/constants/module/image_cache_storage';
import ChapterStorage from '@/constants/module/chapter_storage';
import {blobToBase64} from '@/constants/module/file_manager';
export const get = async (setShowCloudflareTurnstile:any,setIsLoading:any,signal:AbortSignal,translate:any,setFeedBack:any,source:any,id:any,SET_CONTENT:any) => {
const API_BASE = await Storage.get("IN_USE_API_BASE")
axios({
method: 'post',
url: `${API_BASE}/api/web_scrap/get/`,
headers: {
'X-CLOUDFLARE-TURNSTILE-TOKEN': await Storage.get("cloudflare-turnstile-token")
},
data: {
id:id,
source:source,
},
timeout: 60000,
signal:signal,
}).then((response) => {(async () =>{
const DATA = response.data.data
if (Object.keys(DATA).length) setFeedBack("")
else{
setFeedBack("No content found!")
return
}
DATA["cover"] = {uri:`${API_BASE}${DATA.cover}`}
DATA["category"] = DATA.category.join(" | ")
if (translate.state){
DATA["title"] = await translator(translate.from,translate.to,DATA.title)
DATA["author"] = await translator(translate.from,translate.to,DATA.author)
DATA["status"] = await translator(translate.from,translate.to,DATA.status)
DATA["category"] = await translator(translate.from,translate.to,DATA.category)
DATA["synopsis"] = await translator(translate.from,translate.to,DATA.synopsis)
SET_CONTENT(DATA)
}
else {
SET_CONTENT(DATA)
}
// Store in local if bookmarked.
const stored_comic = await ComicStorage.getByID(source,DATA.id)
if (stored_comic) {
const cover_result:any = await store_comic_cover(setShowCloudflareTurnstile,signal,source,id,DATA)
await ComicStorage.updateInfo(source,DATA.id, {
cover:cover_result,
title:DATA.title,
author:DATA.author,
category:DATA.category,
status:DATA.status,
synopsis:DATA.synopsis,
updated:DATA.updated,
})
for (const chapter of DATA.chapters) {
const stored_chapter = await ChapterStorage.get(`${source}-${DATA.id}`,chapter.id)
if (!stored_chapter) await ChapterStorage.add(`${source}-${DATA.id}`, chapter.idx, chapter.id, chapter.title, {});
}
}
setIsLoading(false)
})()}).catch((error) => {
console.log(error)
if (error.status === 511) setShowCloudflareTurnstile(true)
setFeedBack("Error unable to fetch data! Try request again.")
setIsLoading(false)
})
}
export const store_comic_cover = async (
setShowCloudflareTurnstile:any,
signal:any,
source:string | string[],
comic_id:string| string[],
CONTENT:any
) => {
const result = await ImageCacheStorage.get(setShowCloudflareTurnstile,CONTENT.cover.uri,signal);
if (result.type === "file_path"){
const from_path = result.data
const storage_dir = FileSystem.documentDirectory + "ComicMTL/" + `${source}/` + `${comic_id}/`;
try{
const dirInfo = await FileSystem.getInfoAsync(storage_dir);
if (!dirInfo.exists) await FileSystem.makeDirectoryAsync(storage_dir, { intermediates: true });
await FileSystem.copyAsync({
from: from_path,
to: storage_dir + "cover.png",
});
return {type:"file_path",data:storage_dir + "cover.png"}
}catch (error: any) {
console.log("store_comic_cover: ", error)
return { type: "error", data: null };
}
}else return result
}
export const get_requested_info = async (
setShowCloudflareTurnstile:any,
setChapterRequested:any,
setChapterToDownload:any,
signal:any,
source:any,
comic_id:any,
) => {
const API_BASE = await Storage.get("IN_USE_API_BASE")
const socket_info = await Storage.get("SOCKET_INFO")
const stored_comic = await ComicStorage.getByID(source,comic_id)
await axios({
method: 'post',
url: `${API_BASE}/api/queue/request_info/`,
headers: {
'X-CLOUDFLARE-TURNSTILE-TOKEN': await Storage.get("cloudflare-turnstile-token")
},
data: {
socket_id: socket_info.id,
source:source,
comic_id:comic_id,
chapter_requested:stored_comic.chapter_requested,
},
timeout: 30000,
signal:signal,
}).then((response) => {
const DATA = response.data
setChapterRequested(DATA)
const new_obj:any = {}
for (const [key, value] of Object.entries(DATA) as any) {
if (value.state === "ready") {
new_obj[key] = {
chapter_idx: value.chapter_idx,
options: value.options,
}
}
}
console.log(new_obj)
setChapterToDownload(new_obj)
}).catch((error) => {
console.log(error)
if (error.status === 511) setShowCloudflareTurnstile(true)
})
}
export const download_chapter = async (
setShowCloudflareTurnstile:any,
isDownloading:any,
source:string | string[],
comic_id:string | string[],
chapterRequested:any,
setChapterRequested:any,
chapterToDownload:any,
setChapterToDownload:any,
downloadProgress:any,
setDownloadProgress:any,
signal:any
) => {
const API_BASE = await Storage.get("IN_USE_API_BASE")
const [chapter_id, request_info]:any = Object.entries(chapterToDownload)[0];
var progress_lenth:number = 0
var total_length:number = 100
setDownloadProgress({...downloadProgress, [chapter_id]:{progress:progress_lenth, total:total_length}})
setChapterToDownload({...chapterToDownload,[chapter_id]:{...chapterToDownload[chapter_id],state:"downloading"}})
await axios({
method: 'post',
url: `${API_BASE}/api/stream_file/download_chapter/`,
responseType: 'blob',
headers: {
'X-CLOUDFLARE-TURNSTILE-TOKEN': await Storage.get("cloudflare-turnstile-token")
},
data: {
source:source,
comic_id:comic_id,
chapter_id:chapter_id,
chapter_idx:request_info.chapter_idx,
options:request_info.options,
},
onDownloadProgress: (progressEvent) => {
const _total_length = progressEvent.total
if (total_length !== undefined && progressEvent.loaded !== progress_lenth) {
total_length = _total_length as number + 5
progress_lenth = progressEvent.loaded;
setDownloadProgress({...downloadProgress, [chapter_id]:{progress:progress_lenth, total:total_length}})
}
},
timeout: 600000,
signal:signal,
}).then(async (response) => {
const DATA = response.data
if (Platform.OS === "web"){
await ChapterStorage.update(`${source}-${comic_id}`,chapter_id,{type:"blob", value:DATA}, "completed")
}else{
const chapter_dir = FileSystem.documentDirectory + "ComicMTL/" + `${source}/` + `${comic_id}/` + `chapters/`;
const dirInfo = await FileSystem.getInfoAsync(chapter_dir);
if (!dirInfo.exists) await FileSystem.makeDirectoryAsync(chapter_dir, { intermediates: true });
await FileSystem.writeAsStringAsync(chapter_dir + `${request_info.chapter_idx}.zip`, (await blobToBase64(DATA)).split(',')[1], {
encoding: FileSystem.EncodingType.Base64,
});
await ChapterStorage.update(`${source}-${comic_id}`,chapter_id,{type:"file_path", value:chapter_dir + `${request_info.chapter_idx}.zip`}, "completed")
}
setDownloadProgress({...downloadProgress, [chapter_id]:{progress:progress_lenth+5, total:total_length}})
}).catch(async (error) => {
console.log(error)
if (error.status === 511) setShowCloudflareTurnstile(true)
else {
const chapter_to_download = chapterToDownload
delete chapter_to_download[chapter_id]
setChapterToDownload(chapter_to_download)
const chapter_requested = (await ComicStorage.getByID(source,comic_id)).chapter_requested
const new_chapter_requested = chapter_requested.filter((item:any) => item.chapter_id !== chapter_id);
await ComicStorage.updateChapterQueue(source,comic_id,new_chapter_requested)
isDownloading.current = false
}
})
}