Adv Upload

Upload advertisement videos (.mp4) to the server

{isAdbConnected ? 'Machine connected' : 'Machine offline'} {#if !isAdbConnected} {/if} {#if files.length > 0} {/if}
Upload Settings
{COUNTRIES.find((c) => c.value === selectedCountry)?.label || 'Select country'} {#each COUNTRIES as country} {country.label} {/each}
Naming & Size Rules

taobin_adv_menu_*.mp4

Menu banner ad

1080 × 380

taobin_adv_*.mp4

Fullscreen / Idle ad

1080 × 608
{#if pushingToMachine}
0 ? (pushProgress.current / pushProgress.total) * 100 : 0} max={100} class="h-2" />

Sending to machine ({pushProgress.current}/{pushProgress.total}): {pushProgress.name}

{/if} {#if uploading}
0 ? (uploadProgress.current / uploadProgress.total) * 100 : 0} max={100} class="h-2" />

Uploading: {uploadProgress.current} / {uploadProgress.total}

{/if} {#if generatingManifest}

Generating sync_1.file on machine and uploading...

{/if} {#if files.length > 0} Selected Files ({files.length})
{#if files.some((f) => f.status === 'success')} {files.filter((f) => f.status === 'success').length} uploaded {/if} {#if files.some((f) => f.status === 'error')} {files.filter((f) => f.status === 'error').length} invalid/failed {/if}
{#each files as item (item.id)}
{#if item.status === 'uploading'}
{:else if item.status === 'success'}
{/if} {#if item.status !== 'uploading'} {/if}

{item.file.name}

{item.category === 'menu' ? 'Menu banner' : 'Fullscreen'} {#if !item.dimChecked} Reading… {:else if item.dimOk} {item.width}×{item.height} {:else} {item.width ?? '?'}×{item.height ?? '?'} {/if} {(item.file.size / (1024 * 1024)).toFixed(1)} MB

Expected {item.expectedWidth}×{item.expectedHeight}

{#if item.error}

{item.error}

{/if}
{/each}
{/if}