Skip to content

Commit

Permalink
ci
Browse files Browse the repository at this point in the history
  • Loading branch information
tachibana-shin committed Aug 12, 2023
1 parent 378fc3a commit 39d6885
Show file tree
Hide file tree
Showing 6 changed files with 85 additions and 25 deletions.
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ Free and ad-free private online Manga, manhua, manhwa reading app!
> The app is in development
The app currently supports:

- Android APK (native app)
- SPA
- PWA
Expand Down
2 changes: 1 addition & 1 deletion src/components/ImageView.vue
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ const srcImage = ref("")
watch(srcImage, (n, o) => {
if (o?.startsWith("blob:")) URL.revokeObjectURL(o)
})
function onLoad(event: Event) {
function onLoad() {
if (srcImage.value.startsWith("blob:")) URL.revokeObjectURL(srcImage.value)
}
Expand Down
14 changes: 10 additions & 4 deletions src/components/library/LibraryTabOffline.vue
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@
<li v-for="item in list" :key="item.ref.ep_id" class="py-2">
<EpControl
:data="item.ref"
:downloading="item.downloading"
@stop="item.stop"
@resume="IDMStore.resumeDownload(item)"
:downloading="(item as unknown as TaskDownload).downloading"
@stop=";(item as unknown as TaskDownload).stop"
@resume="IDMStore.resumeDownload(metaMangaShowInfo, item)"
/>
</li>
</ul>
Expand All @@ -63,6 +63,10 @@
</template>

<script lang="ts" setup>
import type { UnwrapRef } from "vue"

type TaskDownload = ReturnType<typeof createTaskDownloadEpisode>

const IDMStore = useIDMStore()

IDMStore.runLoadInMemory()
Expand All @@ -86,7 +90,9 @@ const listEpDownloading = computed(() => {

const list = computed(() => {
return [
...(listEpDownloading.value?.values() ?? []),
...((listEpDownloading.value?.values() ?? []) as UnwrapRef<
ReturnType<typeof createTaskDownloadEpisode>
>[]),
...(listEpDownloaded.value?.map((ref) => ({ ref })) ?? []),
].sort((a, b) => b.ref.start_download_at - a.ref.start_download_at)
})
Expand Down
23 changes: 18 additions & 5 deletions src/logic/download-manager.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
/* eslint-disable functional/no-throw-statement */
/* eslint-disable camelcase */
import hashSum from "hash-sum"

Expand Down Expand Up @@ -82,6 +83,8 @@ async function downloadFiles(
await downloadFile(src, path, downloading)

onprogress(index, sources.length, PROTOCOL_OFFLINE + path)

return false
},
5
)
Expand All @@ -106,7 +109,9 @@ async function saveMetaManga(metaManga: MetaManga): Promise<MetaMangaOnDisk> {
} catch {}

const pathPoster = `${DIR_POSTER}/${hash_id}`
await downloadFile(metaManga.manga_image, pathPoster)
await downloadFile(metaManga.manga_image, pathPoster, {
value: true,
} as Ref<boolean>)

const metaOnDisk: MetaMangaOnDisk = {
...metaManga,
Expand All @@ -126,7 +131,14 @@ async function saveMetaManga(metaManga: MetaManga): Promise<MetaMangaOnDisk> {
export function createTaskDownloadEpisode(
metaMannga: MetaManga,
metaEp: MetaEpisode
) {
): {
ref: Ref<MetaEpisodeRunning>
startSaveMetaManga: () => Promise<MetaMangaOnDisk>
downloading: Ref<boolean>
start: () => Promise<void>
stop: () => void
resume: () => Promise<void>
} {
const hashIDEp = hashSum(metaEp.ep_id)

const downloading = ref(false)
Expand Down Expand Up @@ -203,7 +215,6 @@ export function createTaskDownloadEpisode(
).catch(async (err) => {
await saveMeta()
downloading.value = false
// eslint-disable-next-line functional/no-throw-statement
throw err
})

Expand Down Expand Up @@ -245,7 +256,8 @@ export async function getListManga() {

return list
} catch (err) {
if (err?.message === "Folder does not exist.") return []
if ((err as Error | undefined)?.message === "Folder does not exist.")
return []

throw err
}
Expand All @@ -262,7 +274,8 @@ export async function getCountEpisodes(manga_id: number) {

return files.length
} catch (err) {
if (err?.message === "Folder does not exist.") return 0
if ((err as Error | undefined)?.message === "Folder does not exist.")
return 0

throw err
}
Expand Down
2 changes: 1 addition & 1 deletion src/pages/truyen-tranh/[zlug]/index.vue
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ meta:
v-if="isCapacitor && $q.screen.lt.md"
class="fixed top-0 left-0 w-full h-full z--1"
:class="{
'before-filter-blur': data?.image
'before-filter-blur': data?.image,
}"
:style="{
'--data-src': `url('${data?.image}')`,
Expand Down
68 changes: 54 additions & 14 deletions src/stores/IDM.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,17 +5,30 @@ import type {
MetaManga,
MetaMangaOnDisk,
} from "src/logic/download-manager"
import type { ShallowReactive } from "vue"

export const useIDMStore = defineStore("IDM", () => {
const loadingDataInMemory = ref(false)

const mapMetaManga = reactive<Map<number, MetaEpisodeOnDisk>>(new Map())
const mapMetaManga = reactive<
Map<
number,
ShallowReactive<
MetaMangaOnDisk & {
count_ep: number
}
>
>
>(new Map())
const queue = reactive<
Map<number, Map<number, ReturnType<typeof createTaskDownloadEpisode>>>
>(new Map())
const listMangaSorted = reactive<MetaEpisodeOnDisk[]>([])
const listMangaSorted = reactive<
(MetaMangaOnDisk & {
count_ep: number
})[]
>([])

let gettedList = false
async function runLoadInMemory() {
let gettedList = false
if (!gettedList) {
Expand All @@ -24,8 +37,14 @@ export const useIDMStore = defineStore("IDM", () => {
getListManga().then(async (list) => {
await Promise.all(
list.map(async (item) => {
const itemReactive = shallowReactive(item)
item.count_ep = await getCountEpisodes(item.manga_id)
const itemReactive = shallowReactive<
MetaMangaOnDisk & {
count_ep: number
}
>({
...item,
count_ep: await getCountEpisodes(item.manga_id),
})
mapMetaManga.set(item.manga_id, itemReactive)
listMangaSorted.push(itemReactive)
})
Expand All @@ -41,30 +60,50 @@ export const useIDMStore = defineStore("IDM", () => {
const task = createTaskDownloadEpisode(metaManga, metaEp)

if (!mapMetaManga.has(metaManga.manga_id)) {
const manga = shallowReactive(await task.startSaveMetaManga())
manga.count_ep = 0
const manga = shallowReactive({
...(await task.startSaveMetaManga()),
count_ep: 0,
})
mapMetaManga.set(manga.manga_id, manga)
listMangaSorted.unshift(manga)
}

let store = queue.get(metaManga.manga_id)
if (store) {
store.set(metaEp.ep_id, task)
} else queue.set(metaManga.manga_id,store= new Map([[metaEp.ep_id, task]]))
} else
queue.set(metaManga.manga_id, (store = new Map([[metaEp.ep_id, task]])))

await task.start()
mapMetaManga.get(metaManga.manga_id).count_ep++
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
mapMetaManga.get(metaManga.manga_id)!.count_ep++
store.delete(metaEp.ep_id)

return task
}

async function resumeDownload(metaManga: MetaManga, task: Awaited<ReturnType<typeof download>> | {
ref: MetaEpisodeOnDisk
}) {
if (typeof task.resume === "function") return task.resume()
async function resumeDownload(
metaManga: MetaManga,
task:
| Awaited<ReturnType<typeof download>>
| {
ref: MetaEpisodeOnDisk
}
) {
if (
typeof (task as Awaited<ReturnType<typeof download>>).resume ===
"function"
)
return (task as Awaited<ReturnType<typeof download>>).resume()

return download(metaManga, task)
return download(
metaManga,
(
task as {
ref: MetaEpisodeOnDisk
}
).ref
)
}

return {
Expand All @@ -74,5 +113,6 @@ export const useIDMStore = defineStore("IDM", () => {
queue,
runLoadInMemory,
download,
resumeDownload,
}
})

0 comments on commit 39d6885

Please sign in to comment.