BloodyInside's picture
12-09-2024
8f79bc5
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/storages/storage';
import ComicStorage from '@/constants/module/storages/comic_storage';
import ImageCacheStorage from '@/constants/module/storages/image_cache_storage';
import ChapterStorage from '@/constants/module/storages/chapter_storage';
import ChapterDataStorage from '@/constants/module/storages/chapter_data_storage';
import CoverStorage from '@/constants/module/storages/cover_storage';
import {blobToBase64} from '@/constants/module/file_manager';
import { getImageLayout } 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
console.log("EEE",response)
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) {
await ComicStorage.updateInfo(source,DATA.id, {
title:DATA.title,
author:DATA.author,
category:DATA.category,
status:DATA.status,
synopsis:DATA.synopsis,
updated:DATA.updated,
})
await store_comic_cover(setShowCloudflareTurnstile,signal,source,id,DATA)
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",
});
}catch (error: any) {
console.log("store_comic_cover: ", error)
}
}else {
CoverStorage.store(`${source}-${comic_id}`,result)
// return result
}
}
export const get_requested_info = async (
setShowCloudflareTurnstile:any,
chapter_requested:any,
chapter_to_download: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
chapter_requested.current = 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,
state: chapter_to_download.current[key]?.state,
}
}
}
chapter_to_download.current = 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[],
chapter_requested:any,
chapter_to_download:any,
download_progress:any,
signal:any
) => {
const API_BASE = await Storage.get("IN_USE_API_BASE")
const [chapter_id, request_info]:any = Object.entries(chapter_to_download.current)[0];
const stored_chapter = await ChapterStorage.get(`${source}-${comic_id}`,chapter_id)
if (stored_chapter.data_state === "completed") {
const stored_chapter_requested = (await ComicStorage.getByID(source,comic_id)).chapter_requested
const new_chapter_requested = stored_chapter_requested.filter((item:any) => item.chapter_id !== chapter_id);
await ComicStorage.updateChapterQueue(source,comic_id,new_chapter_requested)
delete chapter_requested.current[chapter_id]
delete chapter_to_download.current[chapter_id]
delete download_progress.current[chapter_id]
isDownloading.current = false
return
}
var progress_lenth:number = 0
var total_length:number = 0
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) + (_total_length as number)*0.25
if (progress_lenth === 0) {
download_progress.current = {
...download_progress.current,
[chapter_id]:{progress:progress_lenth,
total:total_length
}}
chapter_to_download.current = {
...chapter_to_download.current,
[chapter_id]:{...chapter_to_download.current[chapter_id],
state:"downloading"
}}
progress_lenth = progressEvent.loaded;
}else{
progress_lenth = progressEvent.loaded;
download_progress.current = {...download_progress.current, [chapter_id]:{progress:progress_lenth, total:total_length}}
}
}
},
timeout: 600000,
signal:signal,
}).then(async (response) => {
const DATA = response.data
if (Platform.OS === "web"){
const zip = new JSZip();
const zipContent = await zip.loadAsync(DATA);
const MAX_PAGE = Object.keys(zipContent.files).length
let page = 0;
for (const fileName of Object.keys(zipContent.files).sort((a,b) => parseInt(a, 10) - parseInt(b, 10))) {
if (zipContent.files[fileName].dir) {
continue; // Skip directories
}
page += 1
const fileData = await zipContent.files[fileName].async('blob');
const layout = await getImageLayout(await blobToBase64(fileData, "image/png"));
await ChapterDataStorage.store(`${source}-${comic_id}-${request_info.chapter_idx}-${page}`,comic_id,request_info.chapter_idx, fileData, layout)
const current_progress = progress_lenth + ((total_length-progress_lenth)*page)/MAX_PAGE
download_progress.current = {...download_progress.current, [chapter_id]:{progress:current_progress, total:total_length}}
}
await ChapterStorage.update(`${source}-${comic_id}`,chapter_id, "completed", page)
}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")
}
// download_progress.current = {...download_progress.current, [chapter_id]:{progress:total_length, total:total_length}}
}).catch(async (error) => {
console.log(error)
if (error.status === 511) setShowCloudflareTurnstile(true)
else {
delete chapter_requested.current[chapter_id]
delete chapter_to_download.current[chapter_id]
const stored_chapter_requested = (await ComicStorage.getByID(source,comic_id)).chapter_requested
const new_chapter_requested = stored_chapter_requested.filter((item:any) => item.chapter_id !== chapter_id);
await ComicStorage.updateChapterQueue(source,comic_id,new_chapter_requested)
isDownloading.current = false
}
})
}