diff --git a/src/main/actions/SyncPublisherStatsAction.ts b/src/main/actions/SyncPublisherStatsAction.ts index d587197..1f149af 100644 --- a/src/main/actions/SyncPublisherStatsAction.ts +++ b/src/main/actions/SyncPublisherStatsAction.ts @@ -1,3 +1,4 @@ +import { describeStatsFailure, type PublisherStatsProblem } from '../services/publisherStatsProblem.js'; import axios from 'axios'; import { BaseAction } from './BaseAction.js'; import { AppDataSource } from '../data-source.js'; @@ -34,8 +35,19 @@ export interface SyncPublisherStatsOutput { * will recommend deleting the whole library the first time it runs. */ countingSince: string | null; + /** + * Why there are no numbers, when there are none for a reason. + * + * This used to answer every failure with zeros, which is the one answer that + * cannot be told from an empty publisher: a server that was off, a wrong + * address, a token that no longer matched and a container older than the + * counter all drew "0 published, 0 B" and the page's own "could not reach" + * state never appeared. Null when the publisher answered. + */ + problem: PublisherStatsProblem | null; } + /** * Bring the publisher's view counts back onto the rows. * @@ -60,6 +72,7 @@ export class SyncPublisherStatsAction extends BaseAction [stat.filename, stat])); @@ -108,6 +121,7 @@ export class SyncPublisherStatsAction extends BaseAction diff --git a/src/renderer/src/components/Settings/RecordingSettings.vue b/src/renderer/src/components/Settings/RecordingSettings.vue index 932fbf4..dd0c1f0 100644 --- a/src/renderer/src/components/Settings/RecordingSettings.vue +++ b/src/renderer/src/components/Settings/RecordingSettings.vue @@ -399,8 +399,18 @@ function openGuide(): void {

OBS is still recording at {{ qualityInObs ?? 'something else' }}. This lands the next time the setup is written, which cannot happen while OBS is - open. + >. + + +

import BasePanel from '@renderer/components/Base/BasePanel.vue'; import { computed } from 'vue'; -import { Icon } from '@iconify/vue'; -import { ICON_BOX, SECTION_HEADER } from '@renderer/components/Base/geometry'; +import { SECTION_HEADER } from '@renderer/components/Base/geometry'; import BaseButton from '@renderer/components/Base/BaseButton.vue'; import StorageClipTile from './StorageClipTile.vue'; import { useFormat } from '@renderer/composables/ui/useFormat'; @@ -83,11 +82,11 @@ const publishedDoomed = computed(() => doomed.value.filter((clip) => clip.publis - Delete the other {{ doomed.length }} diff --git a/src/renderer/src/components/Storage/BurstSection.vue b/src/renderer/src/components/Storage/BurstSection.vue index 3d48c70..63d96e7 100644 --- a/src/renderer/src/components/Storage/BurstSection.vue +++ b/src/renderer/src/components/Storage/BurstSection.vue @@ -54,7 +54,15 @@ const emit = defineEmits<{