Spaces:
Running
Running
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 | |
} | |
}) | |
} |