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