Skip to content

Commit fa4da50

Browse files
authored
Merge pull request #436 from arabcoders/dev
Fixes issue with simple view and background toggle
2 parents 851124a + b51bc94 commit fa4da50

File tree

14 files changed

+1754
-1339
lines changed

14 files changed

+1754
-1339
lines changed

API.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -585,7 +585,8 @@ or on error
585585
"title": "Example title",
586586
"archive_id": "generic 1",
587587
"metadata": {
588-
"source_task": "...",
588+
"source_id": "...",
589+
"source_name": "...",
589590
"source_handler": "GenericTaskHandler"
590591
}
591592
}

Dockerfile

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,12 @@ RUN mkdir /config /downloads && ln -snf /usr/share/zoneinfo/${TZ} /etc/localtime
5151
ARCH="$(dpkg --print-architecture)" && \
5252
EXTRA_PACKAGES="" && \
5353
if [ "$ARCH" = "amd64" ]; then EXTRA_PACKAGES="intel-media-va-driver i965-va-driver libmfx-gen1.2"; fi && \
54-
apt-get install -y --no-install-recommends \
54+
apt-get install -y --no-install-recommends locales \
5555
bash mkvtoolnix patch aria2 curl ca-certificates xz-utils git sqlite3 tzdata file libmagic1 vainfo ${EXTRA_PACKAGES} \
56-
&& useradd -u ${USER_ID:-1000} -U -d /app -s /bin/bash app \
56+
&& useradd -u ${USER_ID:-1000} -U -d /app -s /bin/bash app && \
57+
sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \
58+
dpkg-reconfigure --frontend=noninteractive locales && \
59+
update-locale LANG=en_US.UTF-8 \
5760
&& rm -rf /var/lib/apt/lists/*
5861

5962
COPY entrypoint.sh /
@@ -70,6 +73,9 @@ COPY --from=denoland/deno:latest /usr/bin/deno /usr/bin/deno
7073
COPY --chown=app:app ./healthcheck.sh /usr/local/bin/healthcheck
7174

7275
ENV PATH="/opt/python/bin:$PATH"
76+
ENV LANG=en_US.UTF-8
77+
ENV LANGUAGE=en_US:en
78+
ENV LC_ALL=en_US.UTF-8
7379

7480
RUN chown -R app:app /config /downloads && \
7581
chmod +x /usr/local/bin/healthcheck /usr/bin/mp4box /usr/bin/ffmpeg /usr/bin/ffprobe /usr/bin/deno

app/library/Tasks.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -525,6 +525,11 @@ async def _runner(self, task: Task) -> None:
525525
"template": template,
526526
"cli": cli,
527527
"auto_start": task.auto_start,
528+
"extras": {
529+
"source_name": task.name,
530+
"source_id": task.id,
531+
"source_handler": __class__.__name__,
532+
},
528533
}
529534
)
530535
)
@@ -778,7 +783,7 @@ async def dispatch(self, task: Task, handler: type | None = None, **kwargs) -> T
778783
"template": task.template or "",
779784
"cli": task.cli or "",
780785
"auto_start": task.auto_start,
781-
"extras": {"source_task": task.id, "source_handler": handler.__name__},
786+
"extras": {"source_name": task.name, "source_id": task.id, "source_handler": handler.__name__},
782787
}
783788
)
784789

@@ -876,11 +881,9 @@ async def inspect(
876881
if extraction.metadata:
877882
combined_failure_metadata.update(extraction.metadata)
878883

879-
failure_error = extraction.error if extraction.error else extraction.message
880-
881884
return TaskFailure(
882885
message=extraction.message,
883-
error=failure_error,
886+
error=extraction.error if extraction.error else extraction.message,
884887
metadata=combined_failure_metadata,
885888
)
886889

@@ -918,22 +921,22 @@ def _discover(self) -> list[type]:
918921
return handlers
919922

920923
async def _handle_item_error(self, event, _name, **_kwargs):
921-
item = getattr(event, "data", None)
924+
item: ItemDTO | None = getattr(event, "data", None)
922925
if not isinstance(item, ItemDTO):
923926
return
924927

925-
extras = getattr(item, "extras", {}) or {}
926-
handler_name = extras.get("source_handler")
928+
extras: dict[Any, Any] = getattr(item, "extras", {}) or {}
929+
handler_name: Any | None = extras.get("source_handler")
927930
if not handler_name:
928931
return
929932

930-
archive_id = item.archive_id
933+
archive_id: str | None = item.archive_id
931934
if not archive_id:
932935
return
933936

934-
queued = self._queued.get(handler_name)
937+
queued: set[str] | None = self._queued.get(handler_name)
935938
if queued:
936939
queued.discard(archive_id)
937940

938-
failures = self._failure_count.setdefault(handler_name, {})
941+
failures: dict[str, int] = self._failure_count.setdefault(handler_name, {})
939942
failures[archive_id] = failures.get(archive_id, 0) + 1

app/tests/test_tasks.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -773,6 +773,11 @@ async def test_tasks_runner_success(
773773
"template": "test_template",
774774
"cli": "--write-info-json",
775775
"auto_start": True,
776+
"extras": {
777+
"source_name": "Test Task",
778+
"source_id": "task1",
779+
"source_handler": "Tasks",
780+
},
776781
}
777782
)
778783

ui/app/components/Connection.vue

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<template>
2+
<Message message_class="p-2 m-2 is-success has-background-warning-90 has-text-dark" v-if="status === 'disconnected'">
3+
<span class="icon"><i class="fas fa-info-circle" /></span>
4+
<span>
5+
Connection lost, <NuxtLink class="is-bold" @click.prevent="() => $emit('reconnect')">Click here</NuxtLink>
6+
to reconnect.
7+
</span>
8+
</Message>
9+
</template>
10+
11+
<script setup lang="ts">
12+
import Message from '~/components/Message.vue'
13+
import type { connectionStatus } from '~/stores/SocketStore'
14+
defineProps<{ 'status': connectionStatus }>()
15+
defineEmits<{ (e: "reconnect"): void }>()
16+
</script>

ui/app/components/Settings.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,8 @@
1919
</label>
2020
<div class="control">
2121
<div class="control">
22-
<input id="random_bg" type="checkbox" class="switch is-success" v-model="simpleMode">
23-
<label for="random_bg" class="is-unselectable">
22+
<input id="view_mode" type="checkbox" class="switch is-success" v-model="simpleMode">
23+
<label for="view_mode" class="is-unselectable">
2424
&nbsp;{{ simpleMode ? 'Simple View' : 'Regular View' }}
2525
</label>
2626
</div>

ui/app/components/Simple.vue

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
<label class="label" for="download-url">
77
What you would like to download?
88
<span class="is-pulled-right">
9-
<span class="icon has-text-primary is-pointer" @click="$emit('show_settings')" v-tooltip="'WebUI Settings'"><i
10-
class="fas fa-cogs" /></span>
9+
<span class="icon is-pointer" :class="connectionStatusColor" @click="$emit('show_settings')"
10+
v-tooltip="'WebUI Settings'">
11+
<i class="fas fa-cogs" /></span>
1112
</span>
1213
</label>
1314
<div class="field has-addons">
@@ -542,6 +543,18 @@ const showMessage = (item: StoreItem) => {
542543
}
543544
return (item.msg?.length || 0) > 0
544545
}
546+
547+
const connectionStatusColor = computed(() => {
548+
switch (socketStore.connectionStatus) {
549+
case 'connected':
550+
return 'has-text-success'
551+
case 'connecting':
552+
return 'has-text-warning fa-spin'
553+
case 'disconnected':
554+
default:
555+
return 'has-text-danger'
556+
}
557+
})
545558
</script>
546559

547560
<style scoped>

ui/app/layouts/default.vue

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<template>
22

33
<template v-if="simpleMode">
4+
<Connection :status="socket.connectionStatus" @reconnect="() => socket.reconnect()" />
45
<Simple @show_settings="() => show_settings = true" />
56
</template>
67

@@ -15,14 +16,18 @@
1516
<Shutdown v-if="app_shutdown" />
1617
<div id="main_container" class="container" v-else>
1718
<NewVersion v-if="newVersionIsAvailable" />
19+
<Connection :status="socket.connectionStatus" @reconnect="() => socket.reconnect()" />
1820
<nav class="navbar is-mobile is-dark">
1921

2022
<div class="navbar-brand pl-5">
2123
<NuxtLink class="navbar-item is-text-overflow" to="/" @click.prevent="(e: MouseEvent) => changeRoute(e)"
2224
v-tooltip="socket.isConnected ? 'Connected' : 'Connecting'">
2325
<span class="is-text-overflow">
24-
<span class="icon"><i class="fas fa-home" /></span>
25-
<span class="has-text-bold" :class="`has-text-${socket.isConnected ? 'success' : 'danger'}`">
26+
<span class="icon">
27+
<i v-if="'connecting' === socket.connectionStatus" class="fas fa-arrows-rotate fa-spin" />
28+
<i v-else class="fas fa-home" />
29+
</span>
30+
<span class="has-text-bold" :class="connectionStatusColor">
2631
YTPTube
2732
</span>
2833
<span class="has-text-bold" v-if="config?.app?.instance_title">: {{ config.app.instance_title }}</span>
@@ -191,6 +196,7 @@ import Dialog from '~/components/Dialog.vue'
191196
import Simple from '~/components/Simple.vue'
192197
import Shutdown from '~/components/shutdown.vue'
193198
import Markdown from '~/components/Markdown.vue'
199+
import Connection from '~/components/Connection.vue'
194200
195201
const Year = new Date().getFullYear()
196202
const selectedTheme = useStorage('theme', 'auto')
@@ -470,4 +476,16 @@ const shutdownApp = async () => {
470476
}
471477
}
472478
479+
const connectionStatusColor = computed(() => {
480+
switch (socket.connectionStatus) {
481+
case 'connected':
482+
return 'has-text-success'
483+
case 'connecting':
484+
return 'has-text-warning'
485+
case 'disconnected':
486+
default:
487+
return 'has-text-danger'
488+
}
489+
})
490+
473491
</script>

ui/app/pages/console.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
<span class="icon">
2626
<i class="fa-solid fa-desktop" />
2727
</span>
28-
<span class="ml-2">Console Output</span>
28+
<span class="ml-2">Output</span>
2929
</p>
3030
<p class="card-header-icon">
3131
<span v-tooltip.top="'Clear console window'" class="icon" @click="clearOutput()">

ui/app/stores/SocketStore.ts

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ import { io, type Socket as IOSocket, type SocketOptions, type ManagerOptions }
22
import type { ConfigState } from "~/types/config";
33
import type { StoreItem } from "~/types/store";
44

5+
export type connectionStatus = 'connected' | 'disconnected' | 'connecting';
6+
57
export const useSocketStore = defineStore('socket', () => {
68
const runtimeConfig = useRuntimeConfig()
79
const config = useConfigStore()
@@ -10,6 +12,7 @@ export const useSocketStore = defineStore('socket', () => {
1012

1113
const socket = ref<IOSocket | null>(null)
1214
const isConnected = ref<boolean>(false)
15+
const connectionStatus = ref<connectionStatus>('disconnected')
1316

1417
const emit = (event: string, data?: any): any => socket.value?.emit(event, data)
1518
const on = (event: string | string[], callback: (...args: any[]) => void, withEvent: boolean = false) => {
@@ -26,6 +29,24 @@ export const useSocketStore = defineStore('socket', () => {
2629
event.forEach(e => socket.value?.off(e, callback));
2730
}
2831

32+
const reconnect = () => {
33+
if (true === isConnected.value) {
34+
return;
35+
}
36+
connect();
37+
connectionStatus.value = 'connecting';
38+
}
39+
40+
const disconnect = () => {
41+
if (null === socket.value) {
42+
return;
43+
}
44+
socket.value.disconnect();
45+
socket.value = null;
46+
isConnected.value = false;
47+
connectionStatus.value = 'disconnected';
48+
}
49+
2950
const connect = () => {
3051
const opts = {
3152
transports: ['websocket', 'polling'],
@@ -44,10 +65,18 @@ export const useSocketStore = defineStore('socket', () => {
4465
window.ws = socket.value;
4566
}
4667

68+
connectionStatus.value = 'connecting';
4769
socket.value = io(url, opts)
4870

49-
socket.value.on('connect', () => isConnected.value = true);
50-
socket.value.on('disconnect', () => isConnected.value = false);
71+
socket.value.on('connect', () => {
72+
isConnected.value = true
73+
connectionStatus.value = 'connected';
74+
});
75+
76+
socket.value.on('disconnect', () => {
77+
isConnected.value = false
78+
connectionStatus.value = 'disconnected';
79+
});
5180

5281
socket.value.on('connected', stream => {
5382
const json = JSON.parse(stream)
@@ -187,6 +216,10 @@ export const useSocketStore = defineStore('socket', () => {
187216
connect();
188217
}
189218

190-
191-
return { connect, on, off, emit, socket, isConnected };
219+
return {
220+
connect, reconnect, disconnect,
221+
on, off, emit,
222+
socket, isConnected,
223+
connectionStatus: readonly(connectionStatus) as Readonly<Ref<connectionStatus>>,
224+
};
192225
});

0 commit comments

Comments
 (0)