Skip to content

Feature/dockerising jobs#4

Merged
vector17002 merged 7 commits intomainfrom
feature/dockerising-jobs
Apr 18, 2026
Merged

Feature/dockerising jobs#4
vector17002 merged 7 commits intomainfrom
feature/dockerising-jobs

Conversation

@vector17002
Copy link
Copy Markdown
Owner

@vector17002 vector17002 commented Mar 29, 2026

Notion

Summary by CodeRabbit

  • New Features

    • Added logout functionality to the web interface
    • Implemented video transcoding with multiple resolution variants
    • Added HLS video segmentation and streaming asset generation
  • Infrastructure

    • Introduced Docker containerization with separate API and worker services
    • Refactored worker processes to run independently with job queuing
    • Integrated logging system

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 29, 2026

Warning

Rate limit exceeded

@vector17002 has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 16 minutes and 5 seconds before requesting another review.

Your organization is not enrolled in usage-based pricing. Contact your admin to enable usage-based pricing to continue reviews beyond the rate limit, or try again in 16 minutes and 5 seconds.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: ce2bc20d-5064-486b-9467-e262cd49ede7

📥 Commits

Reviewing files that changed from the base of the PR and between 13b85e0 and a2e1447.

📒 Files selected for processing (2)
  • .gitignore
  • server/Dockerfile
📝 Walkthrough

Walkthrough

Added Docker infrastructure with multi-stage builds and containerized services for transcoding and HLS processing. Introduced transcode and HLS service modules handling video download, processing via FFmpeg, and S3 uploads. Decoupled worker processes from main app startup, and added logout functionality to the frontend.

Changes

Cohort / File(s) Summary
Docker & Containerization
.gitignore, docker-compose.yml, server/.dockerignore, server/Dockerfile
Added Docker Compose configuration orchestrating redis, api, and worker services with health checks and dependency management. Introduced multi-stage Dockerfile with builder, prod-deps, api, and worker targets. Updated .gitignore patterns for downloads/hlsDownloads directories.
Transcoding Service
server/src/services/transcode.service.ts, server/src/workers/transcode.queue.ts, server/src/workers/transcode.worker.ts
New service module for S3 download, FFmpeg transcoding to 1080p/720p/480p/360p resolutions, and S3 re-upload. Updated queue with retry/backoff policies. Enhanced worker to execute full transcoding pipeline, clean up downloads directory, and enqueue downstream HLS jobs.
HLS Service
server/src/services/hls.service.ts, server/src/workers/hls.queue.ts, server/src/workers/hls.worker.ts
New service module for generating presigned URLs, downloading bitrate-specific MP4s, segmenting into HLS playlists, and uploading to S3. New queue with retry/backoff configuration. New worker processing per-bitrate HLS generation concurrently with cleanup.
Backend App Structure
server/src/app.ts, server/src/index.ts, server/src/worker.ts
Decoupled worker startup from Express app initialization. Added dedicated worker entrypoint loading both transcode and HLS worker modules. Added logger import to app initialization.
Build & Configuration
server/package.json, server/tsconfig.tsbuildinfo
Moved TypeScript @types to devDependencies. Added fluent-ffmpeg runtime dependency. Updated npm scripts with worker entry points and simplified build command. Updated build metadata with new service/worker files.
Logs & Frontend
server/logs/log.txt, web/index.html
Added runtime log demonstrating server startup, transcoding/HLS job lifecycle, error scenarios, and retry mechanisms. Added logout button to frontend with token/localStorage cleanup and UI state reset.

Sequence Diagram(s)

sequenceDiagram
    participant User as Transcode Job
    participant TWorker as Transcode Worker
    participant S3 as S3 Storage
    participant FFmpeg as FFmpeg
    participant Redis as Redis Queue

    User->>Redis: Enqueue transcode job (fileId, userId)
    TWorker->>S3: Get presigned URL for original MP4
    S3-->>TWorker: Presigned URL
    TWorker->>S3: Download original MP4
    S3-->>TWorker: MP4 file
    TWorker->>FFmpeg: Transcode to 4 resolutions (concurrent)
    FFmpeg-->>TWorker: 1080p, 720p, 480p, 360p MP4s
    TWorker->>S3: Upload transcoded files (4 objects)
    S3-->>TWorker: Upload confirmed
    TWorker->>Redis: Enqueue HLS job with fileId
    TWorker->>TWorker: Cleanup: rm -rf downloads/
Loading
sequenceDiagram
    participant HLSJob as HLS Job
    participant HWorker as HLS Worker
    participant S3 as S3 Storage
    participant FFmpeg as FFmpeg
    participant Cleanup as Local FS

    HLSJob->>S3: Get presigned URLs (4 bitrates)
    S3-->>HWorker: URLs for 1080p, 720p, 480p, 360p
    par Per-Bitrate Processing
        HWorker->>S3: Download 1080p MP4
        S3-->>HWorker: 1080p file
        HWorker->>FFmpeg: Segment to HLS playlist
        FFmpeg-->>HWorker: playlist.m3u8 + segments
        HWorker->>S3: Upload .m3u8 and .ts files
        S3-->>HWorker: Upload confirmed
    and
        HWorker->>S3: Download 720p MP4
        S3-->>HWorker: 720p file
        HWorker->>FFmpeg: Segment to HLS playlist
        FFmpeg-->>HWorker: playlist.m3u8 + segments
        HWorker->>S3: Upload .m3u8 and .ts files
        S3-->>HWorker: Upload confirmed
    and
        HWorker->>S3: Download 480p MP4
        S3-->>HWorker: 480p file
        HWorker->>FFmpeg: Segment to HLS playlist
        FFmpeg-->>HWorker: playlist.m3u8 + segments
        HWorker->>S3: Upload .m3u8 and .ts files
        S3-->>HWorker: Upload confirmed
    and
        HWorker->>S3: Download 360p MP4
        S3-->>HWorker: 360p file
        HWorker->>FFmpeg: Segment to HLS playlist
        FFmpeg-->>HWorker: playlist.m3u8 + segments
        HWorker->>S3: Upload .m3u8 and .ts files
        S3-->>HWorker: Upload confirmed
    end
    HWorker->>Cleanup: Cleanup: rm -rf hlsDownloads/
    Cleanup-->>HWorker: Directories removed
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Poem

🐰 Hop! Hop! The Docker's alive,
With workers transcoding, HLS thrives!
FFmpeg's dancing, S3 sings,
Redis queues all the video things,
And logout buttons—what joy they bring! 🎉

🚥 Pre-merge checks | ✅ 3
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title refers to a real and significant aspect of the changeset (dockerization of the job system), but does not capture the full scope of the PR, which also introduces substantial new transcoding and HLS processing services, updated worker architecture, and frontend logout functionality.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/dockerising-jobs

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@vector17002 vector17002 self-assigned this Mar 29, 2026
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 17

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
web/index.html (1)

312-324: ⚠️ Potential issue | 🟡 Minor

File input lacks an associated <label> element.

The static analysis tool correctly identifies that the file input at line 313 has no associated label, which impacts accessibility for screen reader users. The surrounding text divs are not semantically linked to the input.

Proposed fix to add proper labeling
         <div class="file-upload-wrapper" id="drop-zone">
-            <input type="file" id="file-input" required>
+            <input type="file" id="file-input" required aria-label="Choose file to upload">
             <div class="file-upload-icon">

Or use a proper label element:

         <div class="file-upload-wrapper" id="drop-zone">
+            <label for="file-input" class="visually-hidden">Choose file to upload</label>
             <input type="file" id="file-input" required>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/index.html` around lines 312 - 324, The file input with id "file-input"
is missing an associated label, harming accessibility; add a proper <label>
element linked via the input's id (or use aria-labelledby referencing an element
like the "file-upload-text" or "selected-file-name") so screen readers can
announce the control; update the DOM around the "file-input" (or the wrapper
with id "drop-zone") to include a descriptive label text (e.g., "Upload file")
and ensure the label uses for="file-input" or the input has aria-labelledby
pointing to the descriptive element, and verify required/disabled state remains
intact.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@server/.dockerignore`:
- Around line 1-12: The .dockerignore currently contains an entry for
".Dockerfile" which appears to be a typo; update the .dockerignore by either
removing the ".Dockerfile" entry entirely or replacing it with "Dockerfile" if
you intend to exclude the actual Dockerfile, ensuring the change targets the
".Dockerfile" line in the diff so only the intended file is excluded from the
build context.

In `@server/Dockerfile`:
- Around line 31-54: The runtime stages ("api" and "worker") run Node/FFmpeg as
root; create a non-root user and group (e.g., adduser/appuser), chown the /app
workspace and node_modules/dist to that user, and switch to that user with USER
before the CMD in both the api and worker stages; ensure the FFmpeg installation
step (apk add ffmpeg) and any files created earlier remain accessible to the
non-root account so that "dist/index.js" and "dist/worker.js" can be executed
without root privileges.

In `@server/logs/log.txt`:
- Around line 1-684: Summary: Committed runtime log server/logs/log.txt contains
sensitive runtime data and must be removed from the repo and ignored going
forward; update .gitignore to include logs/ (or server/logs/) so similar files
aren't committed. Fix: open .gitignore and add a line for logs/ (or
server/logs/) in addition to the existing *.log entry, then remove the committed
file from git tracking with git rm --cached server/logs/log.txt and commit the
changes (include a short commit message like "chore: remove committed logs and
ignore logs/"). Refer to server/logs/log.txt and the repository .gitignore entry
(*.log) when applying the change.

In `@server/package.json`:
- Line 9: The package.json contains a "build" script that runs "tsc -b" but
TypeScript is not declared in devDependencies; add "typescript" to
devDependencies (e.g., add a "typescript": "<appropriate-version>" entry) so tsc
is installed when running npm ci && npm run build outside Docker, ensuring the
build script works consistently; update package.json's devDependencies
accordingly (and regenerate lockfile if needed) so the "build" script and tsc
usage are properly declared.
- Around line 10-11: The dev scripts ("dev" and "dev:worker") only build once
then nodemon watches dist/*.js; change them to watch the TypeScript source and
trigger builds on source changes—e.g., update "dev" to run nodemon with --watch
src --ext ts --exec "npm run build && node dist/index.js" (and similarly update
"dev:worker" to exec the worker output), or replace with a tool like ts-node-dev
that restarts on src changes; ensure the modified scripts reference "dev" and
"dev:worker" so editing files under src triggers rebuild + restart
automatically.

In `@server/src/services/hls.service.ts`:
- Around line 120-137: The current use of Promise.all over files in the upload
block (files.map async ... where PutObjectCommand is sent via s3Client and
streams opened with fs.createReadStream from segmentDir into uploadedKeys)
launches all uploads concurrently and can exhaust file descriptors/sockets;
replace Promise.all with a bounded concurrency queue (e.g., use p-limit or an
async pool) to limit concurrent executions (suggest 10–20), and inside the
queued task keep the same logic that builds s3Key from s3BaseKey, creates the
PutObjectCommand, sends via s3Client.send, logs and pushes to uploadedKeys so
the rest of the flow is unchanged but uploads are rate-limited.
- Around line 47-65: The downloadObjectFromPreSignedUrlWithBitrate function
currently buffers the entire response (responseType: 'arraybuffer') causing high
memory use; change the axios request to stream the response (responseType:
'stream'), create the downloadsDir as before, open a writable stream with
fs.createWriteStream(localFilePath) and pipe the axios response.data stream into
it, then await stream completion (use stream.finished or promisify to wait) and
handle non-200 responses by rejecting/throwing so callers see failures; keep
existing logs (use job.id) and ensure proper error handling and stream cleanup
on error.

In `@server/src/services/transcode.service.ts`:
- Around line 27-45: The function downloadObjectFromPreSignedUrl currently uses
axios with responseType: 'arraybuffer' which buffers the entire video in memory;
change it to stream the response by calling axios with responseType: 'stream'
(or using a streaming GET) on videoDownloadSignedUrl, create the downloadsDir if
missing, pipe response.data into a fs.createWriteStream(localFilePath), await
the stream 'finish'/'error' events (or promisify stream pipeline) and handle
non-200 responses or request errors by rejecting/throwing with a clear log
referencing job.id and fileId; keep symbols: downloadObjectFromPreSignedUrl,
videoDownloadSignedUrl, fileId, job, downloadsDir, localFilePath.
- Around line 95-115: The current upload loop reads entire files into memory via
fs.readFileSync(filePath) causing high memory use; replace that with a streaming
upload by using fs.createReadStream(filePath) as the PutObjectCommand Body (in
the uploadPromises map) or, for better bounded concurrency and multipart
handling, swap to `@aws-sdk/lib-storage`'s Upload class with the same s3Client and
file stream; update the code that builds the command (references:
uploadPromises, filePath, fileBuffer, PutObjectCommand, s3Client.send,
uploadedKeys) to pass the stream as Body (or instantiate Upload) and ensure you
await the Upload.done() (or s3Client.send) and still push s3Key into
uploadedKeys and handle/propagate errors appropriately.

In `@server/src/workers/hls.queue.ts`:
- Around line 4-15: The code casts the ioredis client to any when constructing
new Queue (hlsQueue) because `@types/ioredis` is out-of-sync with runtime ioredis;
update the type package to a version compatible with ioredis v5 (or remove the
outdated `@types` package if ioredis ships its own types) and then remove the "as
any" cast from the Queue connection option (the new Queue("hlsQueue", {
connection: redis, ... }) in hls.queue.ts); apply the same change to the other
instances mentioned (hls.worker.ts, transcode.queue.ts, transcode.worker.ts) so
the Queue constructor accepts the typed ioredis client directly.

In `@server/src/workers/hls.worker.ts`:
- Around line 29-45: The current fire-and-forget exec("rm -rf hlsDownloads") in
hlsWorker.on("completed") causes races and leaks because artifacts are stored
under a shared hlsDownloads tree; instead, change the code to remove only the
job-specific directory (e.g., hlsDownloads/${job.id} or the exact path used by
server/src/services/hls.service.ts) and perform the removal with an awaited,
error-handled call (use fs.promises.rm or fs.rmSync wrapped in try/catch) inside
both hlsWorker.on("completed", (job) => {...}) and hlsWorker.on("failed", (job,
err) => {...}) so cleanup is deterministic, per-job, and any errors are logged
rather than fire-and-forget.

In `@server/src/workers/transcode.worker.ts`:
- Around line 89-100: The current cleanup handler in
transcodeWorker.on("completed", ...) races by removing the shared downloads/
root and misses failed jobs; change to per-job temp directories (e.g., derive
jobTempDir from the job id or fileId used in
server/src/services/transcode.service.ts) and ensure removal is done per-job in
an async, awaited finally block so it runs for both success and failure; replace
the fire-and-forget exec("rm -rf downloads") in the transcodeWorker completed
handler (and similar code at the 104-114 region) with an awaited
fs.promises.rm(jobTempDir, { recursive: true, force: true }) (or equivalent safe
removal) and add removal in the job failure handler so each job only deletes its
own temp folder and large artifacts are always cleaned up.
- Around line 72-73: The transcode worker currently calls hlsQueue.add("hls", {
fileId, userId }) which creates duplicate HLS jobs on transcode retries; make
the enqueue idempotent by supplying a deterministic jobId (e.g. using fileId and
userId or a stable prefix like `hls:${fileId}:${userId}`) as the third argument
to hlsQueue.add so retries reuse the same downstream job instead of creating
duplicates; update the call site where hlsQueue.add is invoked in
transcode.worker.ts and ensure the chosen jobId format is stable across retries
(and unique enough to avoid collisions).

In `@server/tsconfig.tsbuildinfo`:
- Line 1: The tsconfig.tsbuildinfo file is a generated TypeScript incremental
build artifact and should be ignored by VCS; add "tsconfig.tsbuildinfo" to the
repository .gitignore so it is not committed (or update .gitignore entries to
cover *.tsbuildinfo if you prefer), then remove the tracked file from the index
if already committed (e.g., git rm --cached tsconfig.tsbuildinfo) and commit the
updated .gitignore; ensure no code changes are required in functions or
classes—this is purely a VCS ignore/cleanup change.

In `@web/index.html`:
- Around line 436-437: The page currently writes the JWT to both document.cookie
and localStorage (document.cookie = `token=${data.token}...` and
localStorage.setItem('token', data.token)); stop exposing the token client-side
by removing localStorage.setItem('token', ...) and stop setting a cookie from
JavaScript without HttpOnly. Instead send the token to the server (or include it
in the API response) and have the server set the cookie via Set-Cookie with
HttpOnly; Secure; SameSite=Strict; if you must keep a client-side fix, at
minimum change the document.cookie assignment to include Secure and
SameSite=Strict, but prefer server-side Set-Cookie with HttpOnly and remove
localStorage usage.
- Around line 338-340: The logout button uses inline styles instead of a CSS
class; create a .btn-secondary CSS class (matching the inline rules: background:
var(--surface-color); color: var(--text-muted); border: 1px solid
var(--border-color); margin-top: 1rem;) in the page's <style> block and replace
the inline style on the element with that class (keep the existing id
"logout-btn" and base "btn" class) so the button uses ".btn btn-secondary" for
consistent styling and maintainability.
- Around line 596-610: Update the logoutBtn click handler to call the server
logout endpoint before clearing client state: read the JWT from cookie or
localStorage, POST to /auth/logout with the Authorization: Bearer <token> header
(handle network errors and non-2xx responses), then on success (or after
best-effort attempt) clear cookie/localStorage and toggle uploadView/authView
and inputs (emailInput, passwordInput) like today; additionally ensure the
server implements token revocation (e.g., Redis blacklist) and that
authMiddleware checks that blacklist so the JWT is invalidated server-side.

---

Outside diff comments:
In `@web/index.html`:
- Around line 312-324: The file input with id "file-input" is missing an
associated label, harming accessibility; add a proper <label> element linked via
the input's id (or use aria-labelledby referencing an element like the
"file-upload-text" or "selected-file-name") so screen readers can announce the
control; update the DOM around the "file-input" (or the wrapper with id
"drop-zone") to include a descriptive label text (e.g., "Upload file") and
ensure the label uses for="file-input" or the input has aria-labelledby pointing
to the descriptive element, and verify required/disabled state remains intact.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: ASSERTIVE

Plan: Pro

Run ID: 2fdb37c4-0179-4484-acff-401d77819734

📥 Commits

Reviewing files that changed from the base of the PR and between 385aa03 and 13b85e0.

⛔ Files ignored due to path filters (1)
  • server/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (17)
  • .gitignore
  • docker-compose.yml
  • server/.dockerignore
  • server/Dockerfile
  • server/logs/log.txt
  • server/package.json
  • server/src/app.ts
  • server/src/index.ts
  • server/src/services/hls.service.ts
  • server/src/services/transcode.service.ts
  • server/src/worker.ts
  • server/src/workers/hls.queue.ts
  • server/src/workers/hls.worker.ts
  • server/src/workers/transcode.queue.ts
  • server/src/workers/transcode.worker.ts
  • server/tsconfig.tsbuildinfo
  • web/index.html

Comment thread server/.dockerignore
Comment on lines +1 to +12
node_modules
dist
downloads
hlsDownloads
logs
.env
.env.*
!.env.example
.DS_Store
*.log
.git
.Dockerfile
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Check if there's actually a .Dockerfile file or if it should be Dockerfile
fd -H '\.?Dockerfile' server/

Repository: vector17002/video-transcoding

Length of output: 90


Remove or correct the .Dockerfile entry on line 12.

The .dockerignore file excludes a file named .Dockerfile (with leading dot), but the actual Dockerfile in the repository is named Dockerfile (without the dot). This entry is either a typo or unnecessary. If it was meant to exclude the Dockerfile from the build context, change it to Dockerfile; otherwise, remove it entirely.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/.dockerignore` around lines 1 - 12, The .dockerignore currently
contains an entry for ".Dockerfile" which appears to be a typo; update the
.dockerignore by either removing the ".Dockerfile" entry entirely or replacing
it with "Dockerfile" if you intend to exclude the actual Dockerfile, ensuring
the change targets the ".Dockerfile" line in the diff so only the intended file
is excluded from the build context.

Comment thread server/Dockerfile
Comment on lines +31 to +54
FROM node:22-alpine AS api

WORKDIR /app

COPY --from=prod-deps /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY package.json ./

CMD ["node", "dist/index.js"]


# ── Stage 3b: Worker (with FFmpeg for transcoding) ─────
FROM node:22-alpine AS worker

# Only workers need FFmpeg
RUN apk add --no-cache ffmpeg

WORKDIR /app

COPY --from=prod-deps /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY package.json ./

CMD ["node", "dist/worker.js"]
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Run the final images as a non-root user.

Both runtime stages execute Node/FFmpeg as root today, which unnecessarily widens the blast radius if either service is compromised.

Harden the runtime stages
 FROM node:22-alpine AS api

 WORKDIR /app

-COPY --from=prod-deps /app/node_modules ./node_modules
-COPY --from=builder /app/dist ./dist
-COPY package.json ./
+COPY --chown=node:node --from=prod-deps /app/node_modules ./node_modules
+COPY --chown=node:node --from=builder /app/dist ./dist
+COPY --chown=node:node package.json ./
+USER node
 FROM node:22-alpine AS worker

 # Only workers need FFmpeg
 RUN apk add --no-cache ffmpeg

 WORKDIR /app

-COPY --from=prod-deps /app/node_modules ./node_modules
-COPY --from=builder /app/dist ./dist
-COPY package.json ./
+COPY --chown=node:node --from=prod-deps /app/node_modules ./node_modules
+COPY --chown=node:node --from=builder /app/dist ./dist
+COPY --chown=node:node package.json ./
+USER node
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
FROM node:22-alpine AS api
WORKDIR /app
COPY --from=prod-deps /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY package.json ./
CMD ["node", "dist/index.js"]
# ── Stage 3b: Worker (with FFmpeg for transcoding) ─────
FROM node:22-alpine AS worker
# Only workers need FFmpeg
RUN apk add --no-cache ffmpeg
WORKDIR /app
COPY --from=prod-deps /app/node_modules ./node_modules
COPY --from=builder /app/dist ./dist
COPY package.json ./
CMD ["node", "dist/worker.js"]
FROM node:22-alpine AS api
WORKDIR /app
COPY --chown=node:node --from=prod-deps /app/node_modules ./node_modules
COPY --chown=node:node --from=builder /app/dist ./dist
COPY --chown=node:node package.json ./
USER node
CMD ["node", "dist/index.js"]
# ── Stage 3b: Worker (with FFmpeg for transcoding) ─────
FROM node:22-alpine AS worker
# Only workers need FFmpeg
RUN apk add --no-cache ffmpeg
WORKDIR /app
COPY --chown=node:node --from=prod-deps /app/node_modules ./node_modules
COPY --chown=node:node --from=builder /app/dist ./dist
COPY --chown=node:node package.json ./
USER node
CMD ["node", "dist/worker.js"]
🧰 Tools
🪛 Checkov (3.2.510)

[low] 1-54: Ensure that HEALTHCHECK instructions have been added to container images

(CKV_DOCKER_2)


[low] 1-54: Ensure that a user for the container has been created

(CKV_DOCKER_3)

🪛 Hadolint (2.14.0)

[warning] 46-46: Pin versions in apk add. Instead of apk add <package> use apk add <package>=<version>

(DL3018)

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/Dockerfile` around lines 31 - 54, The runtime stages ("api" and
"worker") run Node/FFmpeg as root; create a non-root user and group (e.g.,
adduser/appuser), chown the /app workspace and node_modules/dist to that user,
and switch to that user with USER before the CMD in both the api and worker
stages; ensure the FFmpeg installation step (apk add ffmpeg) and any files
created earlier remain accessible to the non-root account so that
"dist/index.js" and "dist/worker.js" can be executed without root privileges.

Comment thread server/logs/log.txt Outdated
Comment on lines +1 to +684
[2026-03-24T09:07:03.974Z] [LOG] Server is running on port 8080
[2026-03-24T09:08:20.935Z] [LOG] Server is running on port 8080
[2026-03-24T09:36:10.164Z] [LOG] 📽️ Processing job 2 for fileId bjc8kfmnke612us8g3gmn
[2026-03-24T09:36:10.164Z] [LOG] ✅ Transcoding completed for job 2
[2026-03-24T09:36:10.203Z] [LOG] Job 2 has completed successfully!
[2026-03-24T10:00:37.944Z] [LOG] Server is running on port 8080
[2026-03-24T10:01:07.829Z] [LOG] 📽️ Processing job 3 for fileId 0330of3lhf4nw4ykrn0ytr
[2026-03-24T10:01:07.829Z] [LOG] ✅ Transcoding completed for job 3
[2026-03-24T10:01:07.957Z] [LOG] Job 3 has completed successfully!
[2026-03-24T10:01:46.508Z] [LOG] Server is running on port 8080
[2026-03-24T10:02:04.022Z] [LOG] 📽️ Processing job 4 for fileId prxrlkm0nkh61wlyva9hpl
[2026-03-24T10:02:04.313Z] [LOG] Job 4 has failed with error: The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.
[2026-03-24T10:15:04.614Z] [LOG] Server is running on port 8080
[2026-03-24T10:15:47.344Z] [LOG] 📽️ Processing job 5 for fileId vehuheacw3aj3rsixbmber
[2026-03-24T10:15:47.655Z] [LOG] <Buffer ff d8 ff e0 00 10 4a 46 49 46 00 01 01 00 00 48 00 48 00 00 ff e1 14 47 45 78 69 66 00 00 4d 4d 00 2a 00 00 00 08 00 06 01 12 00 03 00 00 00 01 00 01 ... 70920 more bytes>
[2026-03-24T10:15:47.658Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/vehuheacw3aj3rsixbmber for job 5
[2026-03-24T10:15:47.713Z] [LOG] Job 5 has completed successfully!
[2026-03-24T11:23:38.742Z] [LOG] Server is running on port 8080
[2026-03-24T11:24:47.717Z] [LOG] 📽️ Processing job 6 for fileId 3ox4xjswfj3r4s6286mie
[2026-03-24T11:24:50.891Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/3ox4xjswfj3r4s6286mie for job 6
[2026-03-24T11:24:50.891Z] [LOG] ⏳ Initiating bulk FFmpeg transcodes for 3ox4xjswfj3r4s6286mie...
[2026-03-24T11:24:50.891Z] [LOG] ⏳ Starting transcode for 1080p (1920x1080)...
[2026-03-24T11:24:50.893Z] [LOG] ⏳ Starting transcode for 720p (1280x720)...
[2026-03-24T11:24:50.893Z] [LOG] ⏳ Starting transcode for 480p (854x480)...
[2026-03-24T11:24:50.893Z] [LOG] ⏳ Starting transcode for 360p (640x360)...
[2026-03-24T11:25:06.700Z] [LOG] ✅ Finished transcode for 360p
[2026-03-24T11:25:07.166Z] [LOG] ✅ Finished transcode for 480p
[2026-03-24T11:25:08.177Z] [LOG] ✅ Finished transcode for 720p
[2026-03-24T11:25:09.023Z] [LOG] ✅ Finished transcode for 1080p
[2026-03-24T11:25:09.023Z] [LOG] ✅ All transcoding finished for job 6. Outputs: /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/3ox4xjswfj3r4s6286mie_360p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/3ox4xjswfj3r4s6286mie_480p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/3ox4xjswfj3r4s6286mie_720p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/3ox4xjswfj3r4s6286mie_1080p.mp4
[2026-03-24T11:25:09.062Z] [LOG] Job 6 has completed successfully!
[2026-03-24T11:39:05.030Z] [LOG] Server is running on port 8080
[2026-03-24T11:40:20.483Z] [LOG] Server is running on port 8080
[2026-03-24T11:40:36.711Z] [LOG] 📽️ Processing job 7 for fileId 3pb9gh1ido4pu1hsysrep
[2026-03-24T11:40:37.932Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/3pb9gh1ido4pu1hsysrep for job 7
[2026-03-24T11:40:37.932Z] [LOG] ⏳ Initiating bulk FFmpeg transcodes for 3pb9gh1ido4pu1hsysrep...
[2026-03-24T11:40:37.932Z] [LOG] ⏳ Starting transcode for 1080p (1920x1080)...
[2026-03-24T11:40:37.934Z] [LOG] ⏳ Starting transcode for 720p (1280x720)...
[2026-03-24T11:40:37.934Z] [LOG] ⏳ Starting transcode for 480p (854x480)...
[2026-03-24T11:40:37.934Z] [LOG] ⏳ Starting transcode for 360p (640x360)...
[2026-03-24T11:40:46.811Z] [LOG] ✅ Finished transcode for 360p
[2026-03-24T11:40:46.994Z] [LOG] ✅ Finished transcode for 480p
[2026-03-24T11:40:47.546Z] [LOG] ✅ Finished transcode for 720p
[2026-03-24T11:40:48.532Z] [LOG] ✅ Finished transcode for 1080p
[2026-03-24T11:40:48.532Z] [LOG] ✅ All transcoding finished for job 7. Outputs: /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/3pb9gh1ido4pu1hsysrep_360p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/3pb9gh1ido4pu1hsysrep_480p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/3pb9gh1ido4pu1hsysrep_720p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/3pb9gh1ido4pu1hsysrep_1080p.mp4
[2026-03-24T11:40:48.532Z] [LOG] ☁️ Uploading transcoded files to S3 for 3pb9gh1ido4pu1hsysrep...
[2026-03-24T11:40:48.790Z] [LOG] ☁️ Uploaded 360p to S3: dev/users/w56kuucscxi1w740lalw7k/original/3pb9gh1ido4pu1hsysrep/360p.mp4
[2026-03-24T11:40:48.818Z] [LOG] ☁️ Uploaded 480p to S3: dev/users/w56kuucscxi1w740lalw7k/original/3pb9gh1ido4pu1hsysrep/480p.mp4
[2026-03-24T11:40:48.837Z] [LOG] ☁️ Uploaded 720p to S3: dev/users/w56kuucscxi1w740lalw7k/original/3pb9gh1ido4pu1hsysrep/720p.mp4
[2026-03-24T11:40:48.983Z] [LOG] ☁️ Uploaded 1080p to S3: dev/users/w56kuucscxi1w740lalw7k/original/3pb9gh1ido4pu1hsysrep/1080p.mp4
[2026-03-24T11:40:48.984Z] [LOG] ✅ All transcoded files uploaded to S3 for fileId: 3pb9gh1ido4pu1hsysrep
[2026-03-24T11:40:48.984Z] [LOG] ✅ All uploads complete for job 7. Keys: dev/users/w56kuucscxi1w740lalw7k/original/3pb9gh1ido4pu1hsysrep/360p.mp4, dev/users/w56kuucscxi1w740lalw7k/original/3pb9gh1ido4pu1hsysrep/480p.mp4, dev/users/w56kuucscxi1w740lalw7k/original/3pb9gh1ido4pu1hsysrep/720p.mp4, dev/users/w56kuucscxi1w740lalw7k/original/3pb9gh1ido4pu1hsysrep/1080p.mp4
[2026-03-24T11:40:49.024Z] [LOG] Job 7 has completed successfully!
[2026-03-24T11:48:24.802Z] [LOG] Server is running on port 8080
[2026-03-24T11:49:20.079Z] [LOG] 📽️ Processing job 8 for fileId nn57mm3xjs369lq4aeuzi
[2026-03-24T11:49:21.115Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/nn57mm3xjs369lq4aeuzi for job 8
[2026-03-24T11:49:21.115Z] [LOG] ⏳ Initiating bulk FFmpeg transcodes for nn57mm3xjs369lq4aeuzi...
[2026-03-24T11:49:21.115Z] [LOG] ⏳ Starting transcode for 1080p (1920x1080)...
[2026-03-24T11:49:21.116Z] [LOG] ⏳ Starting transcode for 720p (1280x720)...
[2026-03-24T11:49:21.117Z] [LOG] ⏳ Starting transcode for 480p (854x480)...
[2026-03-24T11:49:21.117Z] [LOG] ⏳ Starting transcode for 360p (640x360)...
[2026-03-24T11:49:31.021Z] [LOG] ✅ Finished transcode for 360p
[2026-03-24T11:49:31.276Z] [LOG] ✅ Finished transcode for 480p
[2026-03-24T11:49:31.874Z] [LOG] ✅ Finished transcode for 720p
[2026-03-24T11:49:32.889Z] [LOG] ✅ Finished transcode for 1080p
[2026-03-24T11:49:32.889Z] [LOG] ✅ All transcoding finished for job 8. Outputs: /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/nn57mm3xjs369lq4aeuzi_360p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/nn57mm3xjs369lq4aeuzi_480p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/nn57mm3xjs369lq4aeuzi_720p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/nn57mm3xjs369lq4aeuzi_1080p.mp4
[2026-03-24T11:49:32.889Z] [LOG] ☁️ Uploading transcoded files to S3 for nn57mm3xjs369lq4aeuzi...
[2026-03-24T11:49:33.177Z] [LOG] ☁️ Uploaded 360p to S3: dev/users/0psyy0j5hh1r2ybnxoyheb/original/nn57mm3xjs369lq4aeuzi/360p.mp4
[2026-03-24T11:49:33.236Z] [LOG] ☁️ Uploaded 480p to S3: dev/users/0psyy0j5hh1r2ybnxoyheb/original/nn57mm3xjs369lq4aeuzi/480p.mp4
[2026-03-24T11:49:33.253Z] [LOG] ☁️ Uploaded 720p to S3: dev/users/0psyy0j5hh1r2ybnxoyheb/original/nn57mm3xjs369lq4aeuzi/720p.mp4
[2026-03-24T11:49:33.475Z] [LOG] ☁️ Uploaded 1080p to S3: dev/users/0psyy0j5hh1r2ybnxoyheb/original/nn57mm3xjs369lq4aeuzi/1080p.mp4
[2026-03-24T11:49:33.475Z] [LOG] ✅ All transcoded files uploaded to S3 for fileId: nn57mm3xjs369lq4aeuzi
[2026-03-24T11:49:33.475Z] [LOG] ✅ All uploads complete for job 8. Keys: dev/users/0psyy0j5hh1r2ybnxoyheb/original/nn57mm3xjs369lq4aeuzi/360p.mp4, dev/users/0psyy0j5hh1r2ybnxoyheb/original/nn57mm3xjs369lq4aeuzi/480p.mp4, dev/users/0psyy0j5hh1r2ybnxoyheb/original/nn57mm3xjs369lq4aeuzi/720p.mp4, dev/users/0psyy0j5hh1r2ybnxoyheb/original/nn57mm3xjs369lq4aeuzi/1080p.mp4
[2026-03-24T11:49:33.517Z] [LOG] Job 8 has completed successfully!
[2026-03-24T11:49:33.518Z] [LOG] 📽️ Processing job 9 for fileId s4jwrqaneokp1g6k4lntt9
[2026-03-24T11:49:33.530Z] [LOG] Successfully cleaned up downloads directory
[2026-03-24T11:49:35.299Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/s4jwrqaneokp1g6k4lntt9 for job 9
[2026-03-24T11:49:35.299Z] [LOG] ⏳ Initiating bulk FFmpeg transcodes for s4jwrqaneokp1g6k4lntt9...
[2026-03-24T11:49:35.299Z] [LOG] ⏳ Starting transcode for 1080p (1920x1080)...
[2026-03-24T11:49:35.299Z] [LOG] ⏳ Starting transcode for 720p (1280x720)...
[2026-03-24T11:49:35.300Z] [LOG] ⏳ Starting transcode for 480p (854x480)...
[2026-03-24T11:49:35.300Z] [LOG] ⏳ Starting transcode for 360p (640x360)...
[2026-03-24T11:49:42.649Z] [LOG] ✅ Finished transcode for 360p
[2026-03-24T11:49:43.121Z] [LOG] ✅ Finished transcode for 480p
[2026-03-24T11:49:43.781Z] [LOG] ✅ Finished transcode for 720p
[2026-03-24T11:49:44.782Z] [LOG] ✅ Finished transcode for 1080p
[2026-03-24T11:49:44.782Z] [LOG] ✅ All transcoding finished for job 9. Outputs: /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/s4jwrqaneokp1g6k4lntt9_360p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/s4jwrqaneokp1g6k4lntt9_480p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/s4jwrqaneokp1g6k4lntt9_720p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/s4jwrqaneokp1g6k4lntt9_1080p.mp4
[2026-03-24T11:49:44.782Z] [LOG] ☁️ Uploading transcoded files to S3 for s4jwrqaneokp1g6k4lntt9...
[2026-03-24T11:49:45.068Z] [LOG] ☁️ Uploaded 360p to S3: dev/users/d7dghelm9zwgyeljm9o0o9/original/s4jwrqaneokp1g6k4lntt9/360p.mp4
[2026-03-24T11:49:45.073Z] [LOG] ☁️ Uploaded 480p to S3: dev/users/d7dghelm9zwgyeljm9o0o9/original/s4jwrqaneokp1g6k4lntt9/480p.mp4
[2026-03-24T11:49:45.153Z] [LOG] ☁️ Uploaded 720p to S3: dev/users/d7dghelm9zwgyeljm9o0o9/original/s4jwrqaneokp1g6k4lntt9/720p.mp4
[2026-03-24T11:49:45.191Z] [LOG] ☁️ Uploaded 1080p to S3: dev/users/d7dghelm9zwgyeljm9o0o9/original/s4jwrqaneokp1g6k4lntt9/1080p.mp4
[2026-03-24T11:49:45.191Z] [LOG] ✅ All transcoded files uploaded to S3 for fileId: s4jwrqaneokp1g6k4lntt9
[2026-03-24T11:49:45.191Z] [LOG] ✅ All uploads complete for job 9. Keys: dev/users/d7dghelm9zwgyeljm9o0o9/original/s4jwrqaneokp1g6k4lntt9/360p.mp4, dev/users/d7dghelm9zwgyeljm9o0o9/original/s4jwrqaneokp1g6k4lntt9/480p.mp4, dev/users/d7dghelm9zwgyeljm9o0o9/original/s4jwrqaneokp1g6k4lntt9/720p.mp4, dev/users/d7dghelm9zwgyeljm9o0o9/original/s4jwrqaneokp1g6k4lntt9/1080p.mp4
[2026-03-24T11:49:45.221Z] [LOG] Job 9 has completed successfully!
[2026-03-24T11:49:45.229Z] [LOG] Successfully cleaned up downloads directory
[2026-03-26T16:47:27.972Z] [LOG] Server is running on port 8080
[2026-03-26T16:47:56.392Z] [LOG] 📽️ Processing job 10 for fileId gjlpffjg44s925cfbjzkva
[2026-03-26T16:48:44.260Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/gjlpffjg44s925cfbjzkva for job 10
[2026-03-26T16:48:44.261Z] [LOG] ⏳ Initiating bulk FFmpeg transcodes for gjlpffjg44s925cfbjzkva...
[2026-03-26T16:48:44.262Z] [LOG] ⏳ Starting transcode for 1080p (1920x1080)...
[2026-03-26T16:48:44.264Z] [LOG] ⏳ Starting transcode for 720p (1280x720)...
[2026-03-26T16:48:44.264Z] [LOG] ⏳ Starting transcode for 480p (854x480)...
[2026-03-26T16:48:44.264Z] [LOG] ⏳ Starting transcode for 360p (640x360)...
[2026-03-26T16:48:53.754Z] [LOG] ✅ Finished transcode for 360p
[2026-03-26T16:48:53.757Z] [LOG] ✅ Finished transcode for 480p
[2026-03-26T16:48:54.798Z] [LOG] ✅ Finished transcode for 720p
[2026-03-26T16:48:55.916Z] [LOG] ✅ Finished transcode for 1080p
[2026-03-26T16:48:55.916Z] [LOG] ✅ All transcoding finished for job 10. Outputs: /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/gjlpffjg44s925cfbjzkva_360p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/gjlpffjg44s925cfbjzkva_480p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/gjlpffjg44s925cfbjzkva_720p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/gjlpffjg44s925cfbjzkva_1080p.mp4
[2026-03-26T16:48:55.916Z] [LOG] ☁️ Uploading transcoded files to S3 for gjlpffjg44s925cfbjzkva...
[2026-03-26T16:48:56.923Z] [LOG] ☁️ Uploaded 360p to S3: dev/users/7eth647c4ztcj86vkwwqpl/original/gjlpffjg44s925cfbjzkva/360p.mp4
[2026-03-26T16:48:57.473Z] [LOG] ☁️ Uploaded 480p to S3: dev/users/7eth647c4ztcj86vkwwqpl/original/gjlpffjg44s925cfbjzkva/480p.mp4
[2026-03-26T16:48:57.581Z] [LOG] ☁️ Uploaded 720p to S3: dev/users/7eth647c4ztcj86vkwwqpl/original/gjlpffjg44s925cfbjzkva/720p.mp4
[2026-03-26T16:48:58.565Z] [LOG] ☁️ Uploaded 1080p to S3: dev/users/7eth647c4ztcj86vkwwqpl/original/gjlpffjg44s925cfbjzkva/1080p.mp4
[2026-03-26T16:48:58.565Z] [LOG] ✅ All transcoded files uploaded to S3 for fileId: gjlpffjg44s925cfbjzkva
[2026-03-26T16:48:58.565Z] [LOG] ✅ All uploads complete for job 10. Keys: dev/users/7eth647c4ztcj86vkwwqpl/original/gjlpffjg44s925cfbjzkva/360p.mp4, dev/users/7eth647c4ztcj86vkwwqpl/original/gjlpffjg44s925cfbjzkva/480p.mp4, dev/users/7eth647c4ztcj86vkwwqpl/original/gjlpffjg44s925cfbjzkva/720p.mp4, dev/users/7eth647c4ztcj86vkwwqpl/original/gjlpffjg44s925cfbjzkva/1080p.mp4
[2026-03-26T16:48:58.623Z] [LOG] HLS job added for fileId gjlpffjg44s925cfbjzkva
[2026-03-26T16:48:58.863Z] [LOG] Job 10 has completed successfully!
[2026-03-26T16:48:58.880Z] [LOG] Successfully cleaned up downloads directory
[2026-03-26T18:01:09.146Z] [LOG] Server is running on port 8080
[2026-03-26T18:02:16.151Z] [LOG] 📽️ Processing job 11 for fileId 65sbgktk187hir9k4k3xtq
[2026-03-26T18:02:18.247Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/65sbgktk187hir9k4k3xtq for transcode job 11
[2026-03-26T18:02:18.247Z] [LOG] ⏳ Initiating bulk FFmpeg transcodes for 65sbgktk187hir9k4k3xtq...
[2026-03-26T18:02:18.247Z] [LOG] ⏳ Starting transcode for 1080p (1920x1080)...
[2026-03-26T18:02:18.249Z] [LOG] ⏳ Starting transcode for 720p (1280x720)...
[2026-03-26T18:02:18.249Z] [LOG] ⏳ Starting transcode for 480p (854x480)...
[2026-03-26T18:02:18.249Z] [LOG] ⏳ Starting transcode for 360p (640x360)...
[2026-03-26T18:02:29.169Z] [LOG] ✅ Finished transcode for 360p
[2026-03-26T18:02:29.235Z] [LOG] ✅ Finished transcode for 480p
[2026-03-26T18:02:30.306Z] [LOG] ✅ Finished transcode for 720p
[2026-03-26T18:02:31.340Z] [LOG] ✅ Finished transcode for 1080p
[2026-03-26T18:02:31.340Z] [LOG] ✅ All transcoding finished for job 11. Outputs: /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/65sbgktk187hir9k4k3xtq_360p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/65sbgktk187hir9k4k3xtq_480p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/65sbgktk187hir9k4k3xtq_720p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/65sbgktk187hir9k4k3xtq_1080p.mp4
[2026-03-26T18:02:31.340Z] [LOG] ☁️ Uploading transcoded files to S3 for 65sbgktk187hir9k4k3xtq...
[2026-03-26T18:02:31.869Z] [LOG] ☁️ Uploaded 360p to S3: dev/users/ze3ej8dp2v9j2bi43gm63/original/65sbgktk187hir9k4k3xtq/360p.mp4
[2026-03-26T18:02:31.913Z] [LOG] ☁️ Uploaded 480p to S3: dev/users/ze3ej8dp2v9j2bi43gm63/original/65sbgktk187hir9k4k3xtq/480p.mp4
[2026-03-26T18:02:31.981Z] [LOG] ☁️ Uploaded 1080p to S3: dev/users/ze3ej8dp2v9j2bi43gm63/original/65sbgktk187hir9k4k3xtq/1080p.mp4
[2026-03-26T18:02:31.985Z] [LOG] ☁️ Uploaded 720p to S3: dev/users/ze3ej8dp2v9j2bi43gm63/original/65sbgktk187hir9k4k3xtq/720p.mp4
[2026-03-26T18:02:31.985Z] [LOG] ✅ All transcoded files uploaded to S3 for fileId: 65sbgktk187hir9k4k3xtq
[2026-03-26T18:02:31.985Z] [LOG] ✅ All uploads complete for job 11. Keys: dev/users/ze3ej8dp2v9j2bi43gm63/original/65sbgktk187hir9k4k3xtq/360p.mp4, dev/users/ze3ej8dp2v9j2bi43gm63/original/65sbgktk187hir9k4k3xtq/480p.mp4, dev/users/ze3ej8dp2v9j2bi43gm63/original/65sbgktk187hir9k4k3xtq/1080p.mp4, dev/users/ze3ej8dp2v9j2bi43gm63/original/65sbgktk187hir9k4k3xtq/720p.mp4
[2026-03-26T18:02:32.036Z] [LOG] HLS job added for fileId 65sbgktk187hir9k4k3xtq
[2026-03-26T18:02:32.133Z] [LOG] Job 11 has completed successfully!
[2026-03-26T18:02:32.151Z] [LOG] Successfully cleaned up downloads directory
[2026-03-26T18:07:20.938Z] [LOG] Server is running on port 8080
[2026-03-26T18:07:21.345Z] [LOG] 📽️ Processing HLS job 2 for fileId 65sbgktk187hir9k4k3xtq
[2026-03-26T18:07:21.694Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/65sbgktk187hir9k4k3xtq/480p.mp4 for hls job 2
[2026-03-26T18:07:21.694Z] [LOG] ⏳ Initiating HLS segmenting for 65sbgktk187hir9k4k3xtq for 480p bitrate...
[2026-03-26T18:07:21.695Z] [LOG] ⏳ Starting HLS segmentation for 65sbgktk187hir9k4k3xtq [480p]...
[2026-03-26T18:07:21.719Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/65sbgktk187hir9k4k3xtq/720p.mp4 for hls job 2
[2026-03-26T18:07:21.719Z] [LOG] ⏳ Initiating HLS segmenting for 65sbgktk187hir9k4k3xtq for 720p bitrate...
[2026-03-26T18:07:21.720Z] [LOG] ⏳ Starting HLS segmentation for 65sbgktk187hir9k4k3xtq [720p]...
[2026-03-26T18:07:21.723Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/65sbgktk187hir9k4k3xtq/360p.mp4 for hls job 2
[2026-03-26T18:07:21.723Z] [LOG] ⏳ Initiating HLS segmenting for 65sbgktk187hir9k4k3xtq for 360p bitrate...
[2026-03-26T18:07:21.723Z] [LOG] ⏳ Starting HLS segmentation for 65sbgktk187hir9k4k3xtq [360p]...
[2026-03-26T18:07:21.833Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/65sbgktk187hir9k4k3xtq/1080p.mp4 for hls job 2
[2026-03-26T18:07:21.833Z] [LOG] ⏳ Initiating HLS segmenting for 65sbgktk187hir9k4k3xtq for 1080p bitrate...
[2026-03-26T18:07:21.833Z] [LOG] ⏳ Starting HLS segmentation for 65sbgktk187hir9k4k3xtq [1080p]...
[2026-03-26T18:07:21.968Z] [LOG] 📊 HLS [480p] progress: 100%
[2026-03-26T18:07:21.969Z] [LOG] ✅ HLS segmentation complete for 65sbgktk187hir9k4k3xtq [360p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/65sbgktk187hir9k4k3xtq/360p/360p.m3u8
[2026-03-26T18:07:21.969Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/65sbgktk187hir9k4k3xtq/360p/360p.m3u8
[2026-03-26T18:07:21.969Z] [LOG] ☁️ Uploading segmented files to S3 for 65sbgktk187hir9k4k3xtq with 360p bitrate...
[2026-03-26T18:07:21.973Z] [LOG] ✅ HLS segmentation complete for 65sbgktk187hir9k4k3xtq [480p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/65sbgktk187hir9k4k3xtq/480p/480p.m3u8
[2026-03-26T18:07:21.973Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/65sbgktk187hir9k4k3xtq/480p/480p.m3u8
[2026-03-26T18:07:21.973Z] [LOG] ☁️ Uploading segmented files to S3 for 65sbgktk187hir9k4k3xtq with 480p bitrate...
[2026-03-26T18:07:21.974Z] [LOG] 📊 HLS [720p] progress: 100%
[2026-03-26T18:07:21.975Z] [LOG] ✅ HLS segmentation complete for 65sbgktk187hir9k4k3xtq [720p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/65sbgktk187hir9k4k3xtq/720p/720p.m3u8
[2026-03-26T18:07:21.975Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/65sbgktk187hir9k4k3xtq/720p/720p.m3u8
[2026-03-26T18:07:21.975Z] [LOG] ☁️ Uploading segmented files to S3 for 65sbgktk187hir9k4k3xtq with 720p bitrate...
[2026-03-26T18:07:21.989Z] [LOG] 📊 HLS [1080p] progress: 100%
[2026-03-26T18:07:21.990Z] [LOG] ✅ HLS segmentation complete for 65sbgktk187hir9k4k3xtq [1080p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/65sbgktk187hir9k4k3xtq/1080p/1080p.m3u8
[2026-03-26T18:07:21.990Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/65sbgktk187hir9k4k3xtq/1080p/1080p.m3u8
[2026-03-26T18:07:21.990Z] [LOG] ☁️ Uploading segmented files to S3 for 65sbgktk187hir9k4k3xtq with 1080p bitrate...
[2026-03-26T18:07:22.142Z] [LOG] ✅ HLS playlist uploaded successfully to S3 for 65sbgktk187hir9k4k3xtq with 720p bitrate
[2026-03-26T18:07:22.142Z] [LOG] ✅ All hls uploads complete for job 2. Keys: dev/users/ze3ej8dp2v9j2bi43gm63/65sbgktk187hir9k4k3xtq/720p/720p.m3u8
[2026-03-26T18:07:22.144Z] [LOG] ✅ HLS playlist uploaded successfully to S3 for 65sbgktk187hir9k4k3xtq with 480p bitrate
[2026-03-26T18:07:22.144Z] [LOG] ✅ All hls uploads complete for job 2. Keys: dev/users/ze3ej8dp2v9j2bi43gm63/65sbgktk187hir9k4k3xtq/480p/480p.m3u8
[2026-03-26T18:07:22.156Z] [LOG] ✅ HLS playlist uploaded successfully to S3 for 65sbgktk187hir9k4k3xtq with 1080p bitrate
[2026-03-26T18:07:22.156Z] [LOG] ✅ All hls uploads complete for job 2. Keys: dev/users/ze3ej8dp2v9j2bi43gm63/65sbgktk187hir9k4k3xtq/1080p/1080p.m3u8
[2026-03-26T18:07:22.156Z] [LOG] ✅ HLS playlist uploaded successfully to S3 for 65sbgktk187hir9k4k3xtq with 360p bitrate
[2026-03-26T18:07:22.157Z] [LOG] ✅ All hls uploads complete for job 2. Keys: dev/users/ze3ej8dp2v9j2bi43gm63/65sbgktk187hir9k4k3xtq/360p/360p.m3u8
[2026-03-26T18:07:22.248Z] [LOG] Successfully cleaned up hlsDownloads directory
[2026-03-26T18:10:06.306Z] [LOG] Server is running on port 8080
[2026-03-26T18:10:55.341Z] [LOG] 📽️ Processing job 12 for fileId g6bn52zu2ralcgsqhpfy1
[2026-03-26T18:10:56.721Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/g6bn52zu2ralcgsqhpfy1 for transcode job 12
[2026-03-26T18:10:56.721Z] [LOG] ⏳ Initiating bulk FFmpeg transcodes for g6bn52zu2ralcgsqhpfy1...
[2026-03-26T18:10:56.721Z] [LOG] ⏳ Starting transcode for 1080p (1920x1080)...
[2026-03-26T18:10:56.724Z] [LOG] ⏳ Starting transcode for 720p (1280x720)...
[2026-03-26T18:10:56.724Z] [LOG] ⏳ Starting transcode for 480p (854x480)...
[2026-03-26T18:10:56.724Z] [LOG] ⏳ Starting transcode for 360p (640x360)...
[2026-03-26T18:11:06.368Z] [LOG] ✅ Finished transcode for 360p
[2026-03-26T18:11:06.577Z] [LOG] ✅ Finished transcode for 480p
[2026-03-26T18:11:07.162Z] [LOG] ✅ Finished transcode for 720p
[2026-03-26T18:11:08.179Z] [LOG] ✅ Finished transcode for 1080p
[2026-03-26T18:11:08.179Z] [LOG] ✅ All transcoding finished for job 12. Outputs: /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/g6bn52zu2ralcgsqhpfy1_360p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/g6bn52zu2ralcgsqhpfy1_480p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/g6bn52zu2ralcgsqhpfy1_720p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/g6bn52zu2ralcgsqhpfy1_1080p.mp4
[2026-03-26T18:11:08.179Z] [LOG] ☁️ Uploading transcoded files to S3 for g6bn52zu2ralcgsqhpfy1...
[2026-03-26T18:11:08.535Z] [LOG] ☁️ Uploaded 360p to S3: dev/users/ze3ej8dp2v9j2bi43gm63/original/g6bn52zu2ralcgsqhpfy1/360p.mp4
[2026-03-26T18:11:08.575Z] [LOG] ☁️ Uploaded 720p to S3: dev/users/ze3ej8dp2v9j2bi43gm63/original/g6bn52zu2ralcgsqhpfy1/720p.mp4
[2026-03-26T18:11:08.605Z] [LOG] ☁️ Uploaded 480p to S3: dev/users/ze3ej8dp2v9j2bi43gm63/original/g6bn52zu2ralcgsqhpfy1/480p.mp4
[2026-03-26T18:11:08.695Z] [LOG] ☁️ Uploaded 1080p to S3: dev/users/ze3ej8dp2v9j2bi43gm63/original/g6bn52zu2ralcgsqhpfy1/1080p.mp4
[2026-03-26T18:11:08.695Z] [LOG] ✅ All transcoded files uploaded to S3 for fileId: g6bn52zu2ralcgsqhpfy1
[2026-03-26T18:11:08.695Z] [LOG] ✅ All uploads complete for job 12. Keys: dev/users/ze3ej8dp2v9j2bi43gm63/original/g6bn52zu2ralcgsqhpfy1/360p.mp4, dev/users/ze3ej8dp2v9j2bi43gm63/original/g6bn52zu2ralcgsqhpfy1/720p.mp4, dev/users/ze3ej8dp2v9j2bi43gm63/original/g6bn52zu2ralcgsqhpfy1/480p.mp4, dev/users/ze3ej8dp2v9j2bi43gm63/original/g6bn52zu2ralcgsqhpfy1/1080p.mp4
[2026-03-26T18:11:08.741Z] [LOG] HLS job added for fileId g6bn52zu2ralcgsqhpfy1
[2026-03-26T18:11:08.784Z] [LOG] 📽️ Processing HLS job 3 for fileId g6bn52zu2ralcgsqhpfy1
[2026-03-26T18:11:08.835Z] [LOG] Job 12 has completed successfully!
[2026-03-26T18:11:08.844Z] [LOG] Successfully cleaned up downloads directory
[2026-03-26T18:11:09.071Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/g6bn52zu2ralcgsqhpfy1/480p.mp4 for hls job 3
[2026-03-26T18:11:09.071Z] [LOG] ⏳ Initiating HLS segmenting for g6bn52zu2ralcgsqhpfy1 for 480p bitrate...
[2026-03-26T18:11:09.072Z] [LOG] ⏳ Starting HLS segmentation for g6bn52zu2ralcgsqhpfy1 [480p]...
[2026-03-26T18:11:09.147Z] [LOG] 📊 HLS [480p] progress: 100%
[2026-03-26T18:11:09.148Z] [LOG] ✅ HLS segmentation complete for g6bn52zu2ralcgsqhpfy1 [480p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/g6bn52zu2ralcgsqhpfy1/480p/480p.m3u8
[2026-03-26T18:11:09.148Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/g6bn52zu2ralcgsqhpfy1/480p/480p.m3u8
[2026-03-26T18:11:09.207Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/g6bn52zu2ralcgsqhpfy1/360p.mp4 for hls job 3
[2026-03-26T18:11:09.207Z] [LOG] ⏳ Initiating HLS segmenting for g6bn52zu2ralcgsqhpfy1 for 360p bitrate...
[2026-03-26T18:11:09.207Z] [LOG] ⏳ Starting HLS segmentation for g6bn52zu2ralcgsqhpfy1 [360p]...
[2026-03-26T18:11:09.250Z] [LOG] 📊 HLS [360p] progress: 100%
[2026-03-26T18:11:09.251Z] [LOG] ✅ HLS segmentation complete for g6bn52zu2ralcgsqhpfy1 [360p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/g6bn52zu2ralcgsqhpfy1/360p/360p.m3u8
[2026-03-26T18:11:09.251Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/g6bn52zu2ralcgsqhpfy1/360p/360p.m3u8
[2026-03-26T18:11:09.514Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/g6bn52zu2ralcgsqhpfy1/720p.mp4 for hls job 3
[2026-03-26T18:11:09.514Z] [LOG] ⏳ Initiating HLS segmenting for g6bn52zu2ralcgsqhpfy1 for 720p bitrate...
[2026-03-26T18:11:09.514Z] [LOG] ⏳ Starting HLS segmentation for g6bn52zu2ralcgsqhpfy1 [720p]...
[2026-03-26T18:11:09.560Z] [LOG] 📊 HLS [720p] progress: 100%
[2026-03-26T18:11:09.561Z] [LOG] ✅ HLS segmentation complete for g6bn52zu2ralcgsqhpfy1 [720p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/g6bn52zu2ralcgsqhpfy1/720p/720p.m3u8
[2026-03-26T18:11:09.561Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/g6bn52zu2ralcgsqhpfy1/720p/720p.m3u8
[2026-03-26T18:11:09.861Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/g6bn52zu2ralcgsqhpfy1/1080p.mp4 for hls job 3
[2026-03-26T18:11:09.861Z] [LOG] ⏳ Initiating HLS segmenting for g6bn52zu2ralcgsqhpfy1 for 1080p bitrate...
[2026-03-26T18:11:09.861Z] [LOG] ⏳ Starting HLS segmentation for g6bn52zu2ralcgsqhpfy1 [1080p]...
[2026-03-26T18:11:09.908Z] [LOG] 📊 HLS [1080p] progress: 100%
[2026-03-26T18:11:09.908Z] [LOG] ✅ HLS segmentation complete for g6bn52zu2ralcgsqhpfy1 [1080p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/g6bn52zu2ralcgsqhpfy1/1080p/1080p.m3u8
[2026-03-26T18:11:09.908Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/g6bn52zu2ralcgsqhpfy1/1080p/1080p.m3u8
[2026-03-26T18:26:48.061Z] [LOG] Server is running on port 8080
[2026-03-26T18:27:08.901Z] [LOG] 📽️ Processing job 13 for fileId 7fj07hrkf3csvxqn1iham
[2026-03-26T18:27:10.743Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/7fj07hrkf3csvxqn1iham for transcode job 13
[2026-03-26T18:27:10.743Z] [LOG] ⏳ Initiating bulk FFmpeg transcodes for 7fj07hrkf3csvxqn1iham...
[2026-03-26T18:27:10.743Z] [LOG] ⏳ Starting transcode for 1080p (1920x1080)...
[2026-03-26T18:27:10.745Z] [LOG] ⏳ Starting transcode for 720p (1280x720)...
[2026-03-26T18:27:10.745Z] [LOG] ⏳ Starting transcode for 480p (854x480)...
[2026-03-26T18:27:10.745Z] [LOG] ⏳ Starting transcode for 360p (640x360)...
[2026-03-26T18:27:20.647Z] [LOG] ✅ Finished transcode for 360p
[2026-03-26T18:27:21.057Z] [LOG] ✅ Finished transcode for 480p
[2026-03-26T18:27:21.702Z] [LOG] ✅ Finished transcode for 720p
[2026-03-26T18:27:22.775Z] [LOG] ✅ Finished transcode for 1080p
[2026-03-26T18:27:22.775Z] [LOG] ✅ All transcoding finished for job 13. Outputs: /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/7fj07hrkf3csvxqn1iham_360p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/7fj07hrkf3csvxqn1iham_480p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/7fj07hrkf3csvxqn1iham_720p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/7fj07hrkf3csvxqn1iham_1080p.mp4
[2026-03-26T18:27:22.775Z] [LOG] ☁️ Uploading transcoded files to S3 for 7fj07hrkf3csvxqn1iham...
[2026-03-26T18:27:23.049Z] [LOG] ☁️ Uploaded 360p to S3: dev/users/ze3ej8dp2v9j2bi43gm63/original/7fj07hrkf3csvxqn1iham/360p.mp4
[2026-03-26T18:27:23.050Z] [LOG] ☁️ Uploaded 480p to S3: dev/users/ze3ej8dp2v9j2bi43gm63/original/7fj07hrkf3csvxqn1iham/480p.mp4
[2026-03-26T18:27:23.183Z] [LOG] ☁️ Uploaded 720p to S3: dev/users/ze3ej8dp2v9j2bi43gm63/original/7fj07hrkf3csvxqn1iham/720p.mp4
[2026-03-26T18:27:23.197Z] [LOG] ☁️ Uploaded 1080p to S3: dev/users/ze3ej8dp2v9j2bi43gm63/original/7fj07hrkf3csvxqn1iham/1080p.mp4
[2026-03-26T18:27:23.197Z] [LOG] ✅ All transcoded files uploaded to S3 for fileId: 7fj07hrkf3csvxqn1iham
[2026-03-26T18:27:23.197Z] [LOG] ✅ All uploads complete for job 13. Keys: dev/users/ze3ej8dp2v9j2bi43gm63/original/7fj07hrkf3csvxqn1iham/360p.mp4, dev/users/ze3ej8dp2v9j2bi43gm63/original/7fj07hrkf3csvxqn1iham/480p.mp4, dev/users/ze3ej8dp2v9j2bi43gm63/original/7fj07hrkf3csvxqn1iham/720p.mp4, dev/users/ze3ej8dp2v9j2bi43gm63/original/7fj07hrkf3csvxqn1iham/1080p.mp4
[2026-03-26T18:27:23.316Z] [LOG] HLS job added for fileId 7fj07hrkf3csvxqn1iham
[2026-03-26T18:27:23.357Z] [LOG] 📽️ Processing HLS job 4 for fileId 7fj07hrkf3csvxqn1iham
[2026-03-26T18:27:23.395Z] [LOG] Job 13 has completed successfully!
[2026-03-26T18:27:23.401Z] [LOG] Successfully cleaned up downloads directory
[2026-03-26T18:27:23.631Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/7fj07hrkf3csvxqn1iham/480p.mp4 for hls job 4
[2026-03-26T18:27:23.631Z] [LOG] ⏳ Initiating HLS segmenting for 7fj07hrkf3csvxqn1iham for 480p bitrate...
[2026-03-26T18:27:23.632Z] [LOG] ⏳ Starting HLS segmentation for 7fj07hrkf3csvxqn1iham [480p]...
[2026-03-26T18:27:23.669Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/7fj07hrkf3csvxqn1iham/360p.mp4 for hls job 4
[2026-03-26T18:27:23.669Z] [LOG] ⏳ Initiating HLS segmenting for 7fj07hrkf3csvxqn1iham for 360p bitrate...
[2026-03-26T18:27:23.670Z] [LOG] ⏳ Starting HLS segmentation for 7fj07hrkf3csvxqn1iham [360p]...
[2026-03-26T18:27:23.694Z] [LOG] 📊 HLS [480p] progress: 100%
[2026-03-26T18:27:23.694Z] [LOG] ✅ HLS segmentation complete for 7fj07hrkf3csvxqn1iham [480p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/7fj07hrkf3csvxqn1iham/480p/480p.m3u8
[2026-03-26T18:27:23.694Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/7fj07hrkf3csvxqn1iham/480p/480p.m3u8
[2026-03-26T18:27:23.695Z] [LOG] ☁️ Uploading segmented files to S3 for 7fj07hrkf3csvxqn1iham with 480p bitrate...
[2026-03-26T18:27:23.696Z] [ERROR] UNCAUGHT EXCEPTION: ENOENT: no such file or directory, open '/Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/7fj07hrkf3csvxqn1iham/480p/480p.m3u8'
Error: ENOENT: no such file or directory, open '/Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/7fj07hrkf3csvxqn1iham/480p/480p.m3u8'
[2026-03-26T18:27:23.712Z] [LOG] 📊 HLS [360p] progress: 100%
[2026-03-26T18:27:23.712Z] [LOG] ✅ HLS segmentation complete for 7fj07hrkf3csvxqn1iham [360p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/7fj07hrkf3csvxqn1iham/360p/360p.m3u8
[2026-03-26T18:27:23.712Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/7fj07hrkf3csvxqn1iham/360p/360p.m3u8
[2026-03-26T18:27:23.712Z] [LOG] ☁️ Uploading segmented files to S3 for 7fj07hrkf3csvxqn1iham with 360p bitrate...
[2026-03-26T18:27:23.712Z] [ERROR] UNCAUGHT EXCEPTION: ENOENT: no such file or directory, open '/Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/7fj07hrkf3csvxqn1iham/360p/360p.m3u8'
Error: ENOENT: no such file or directory, open '/Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/7fj07hrkf3csvxqn1iham/360p/360p.m3u8'
[2026-03-26T18:27:23.722Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/7fj07hrkf3csvxqn1iham/1080p.mp4 for hls job 4
[2026-03-26T18:27:23.722Z] [LOG] ⏳ Initiating HLS segmenting for 7fj07hrkf3csvxqn1iham for 1080p bitrate...
[2026-03-26T18:27:23.722Z] [LOG] ⏳ Starting HLS segmentation for 7fj07hrkf3csvxqn1iham [1080p]...
[2026-03-26T18:27:23.723Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/7fj07hrkf3csvxqn1iham/720p.mp4 for hls job 4
[2026-03-26T18:27:23.723Z] [LOG] ⏳ Initiating HLS segmenting for 7fj07hrkf3csvxqn1iham for 720p bitrate...
[2026-03-26T18:27:23.723Z] [LOG] ⏳ Starting HLS segmentation for 7fj07hrkf3csvxqn1iham [720p]...
[2026-03-26T18:27:23.730Z] [LOG] Job 4 has failed with error: Function not implemented.
[2026-03-26T18:27:23.770Z] [LOG] 📊 HLS [720p] progress: 100%
[2026-03-26T18:27:23.771Z] [LOG] ✅ HLS segmentation complete for 7fj07hrkf3csvxqn1iham [720p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/7fj07hrkf3csvxqn1iham/720p/720p.m3u8
[2026-03-26T18:27:23.771Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/7fj07hrkf3csvxqn1iham/720p/720p.m3u8
[2026-03-26T18:27:23.771Z] [LOG] ☁️ Uploading segmented files to S3 for 7fj07hrkf3csvxqn1iham with 720p bitrate...
[2026-03-26T18:27:23.771Z] [ERROR] UNCAUGHT EXCEPTION: ENOENT: no such file or directory, open '/Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/7fj07hrkf3csvxqn1iham/720p/720p.m3u8'
Error: ENOENT: no such file or directory, open '/Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/7fj07hrkf3csvxqn1iham/720p/720p.m3u8'
[2026-03-26T18:27:23.772Z] [LOG] 📊 HLS [1080p] progress: 100%
[2026-03-26T18:27:23.773Z] [LOG] ✅ HLS segmentation complete for 7fj07hrkf3csvxqn1iham [1080p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/7fj07hrkf3csvxqn1iham/1080p/1080p.m3u8
[2026-03-26T18:27:23.773Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/7fj07hrkf3csvxqn1iham/1080p/1080p.m3u8
[2026-03-26T18:27:23.773Z] [LOG] ☁️ Uploading segmented files to S3 for 7fj07hrkf3csvxqn1iham with 1080p bitrate...
[2026-03-26T18:27:23.773Z] [ERROR] UNCAUGHT EXCEPTION: ENOENT: no such file or directory, open '/Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/7fj07hrkf3csvxqn1iham/1080p/1080p.m3u8'
Error: ENOENT: no such file or directory, open '/Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/7fj07hrkf3csvxqn1iham/1080p/1080p.m3u8'
[2026-03-26T18:30:55.922Z] [LOG] Server is running on port 8080
[2026-03-26T18:31:40.104Z] [LOG] 📽️ Processing job 14 for fileId 47a76ddw00p27bcieb6lpj
[2026-03-26T18:31:42.695Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/47a76ddw00p27bcieb6lpj for transcode job 14
[2026-03-26T18:31:42.695Z] [LOG] ⏳ Initiating bulk FFmpeg transcodes for 47a76ddw00p27bcieb6lpj...
[2026-03-26T18:31:42.695Z] [LOG] ⏳ Starting transcode for 1080p (1920x1080)...
[2026-03-26T18:31:42.697Z] [LOG] ⏳ Starting transcode for 720p (1280x720)...
[2026-03-26T18:31:42.697Z] [LOG] ⏳ Starting transcode for 480p (854x480)...
[2026-03-26T18:31:42.697Z] [LOG] ⏳ Starting transcode for 360p (640x360)...
[2026-03-26T18:31:51.199Z] [LOG] ✅ Finished transcode for 360p
[2026-03-26T18:31:51.382Z] [LOG] ✅ Finished transcode for 480p
[2026-03-26T18:31:52.215Z] [LOG] ✅ Finished transcode for 720p
[2026-03-26T18:31:53.122Z] [LOG] ✅ Finished transcode for 1080p
[2026-03-26T18:31:53.122Z] [LOG] ✅ All transcoding finished for job 14. Outputs: /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/47a76ddw00p27bcieb6lpj_360p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/47a76ddw00p27bcieb6lpj_480p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/47a76ddw00p27bcieb6lpj_720p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/47a76ddw00p27bcieb6lpj_1080p.mp4
[2026-03-26T18:31:53.122Z] [LOG] ☁️ Uploading transcoded files to S3 for 47a76ddw00p27bcieb6lpj...
[2026-03-26T18:31:53.431Z] [LOG] ☁️ Uploaded 480p to S3: dev/users/ze3ej8dp2v9j2bi43gm63/original/47a76ddw00p27bcieb6lpj/480p.mp4
[2026-03-26T18:31:53.432Z] [LOG] ☁️ Uploaded 360p to S3: dev/users/ze3ej8dp2v9j2bi43gm63/original/47a76ddw00p27bcieb6lpj/360p.mp4
[2026-03-26T18:31:53.578Z] [LOG] ☁️ Uploaded 720p to S3: dev/users/ze3ej8dp2v9j2bi43gm63/original/47a76ddw00p27bcieb6lpj/720p.mp4
[2026-03-26T18:31:53.663Z] [LOG] ☁️ Uploaded 1080p to S3: dev/users/ze3ej8dp2v9j2bi43gm63/original/47a76ddw00p27bcieb6lpj/1080p.mp4
[2026-03-26T18:31:53.664Z] [LOG] ✅ All transcoded files uploaded to S3 for fileId: 47a76ddw00p27bcieb6lpj
[2026-03-26T18:31:53.664Z] [LOG] ✅ All uploads complete for job 14. Keys: dev/users/ze3ej8dp2v9j2bi43gm63/original/47a76ddw00p27bcieb6lpj/480p.mp4, dev/users/ze3ej8dp2v9j2bi43gm63/original/47a76ddw00p27bcieb6lpj/360p.mp4, dev/users/ze3ej8dp2v9j2bi43gm63/original/47a76ddw00p27bcieb6lpj/720p.mp4, dev/users/ze3ej8dp2v9j2bi43gm63/original/47a76ddw00p27bcieb6lpj/1080p.mp4
[2026-03-26T18:31:53.699Z] [LOG] HLS job added for fileId 47a76ddw00p27bcieb6lpj
[2026-03-26T18:31:53.787Z] [LOG] Job 14 has completed successfully!
[2026-03-26T18:31:53.789Z] [LOG] 📽️ Processing HLS job 5 for fileId 47a76ddw00p27bcieb6lpj
[2026-03-26T18:31:53.810Z] [LOG] Successfully cleaned up downloads directory
[2026-03-26T18:31:54.202Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/47a76ddw00p27bcieb6lpj/480p.mp4 for hls job 5
[2026-03-26T18:31:54.202Z] [LOG] ⏳ Initiating HLS segmenting for 47a76ddw00p27bcieb6lpj for 480p bitrate...
[2026-03-26T18:31:54.203Z] [LOG] ⏳ Starting HLS segmentation for 47a76ddw00p27bcieb6lpj [480p]...
[2026-03-26T18:31:54.279Z] [LOG] 📊 HLS [480p] progress: 100%
[2026-03-26T18:31:54.280Z] [LOG] ✅ HLS segmentation complete for 47a76ddw00p27bcieb6lpj [480p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/47a76ddw00p27bcieb6lpj/480p/480p.m3u8
[2026-03-26T18:31:54.280Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/47a76ddw00p27bcieb6lpj/480p/480p.m3u8
[2026-03-26T18:31:54.280Z] [LOG] ☁️ Uploading segmented files to S3 for 47a76ddw00p27bcieb6lpj with 480p bitrate...
[2026-03-26T18:31:54.325Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/47a76ddw00p27bcieb6lpj/360p.mp4 for hls job 5
[2026-03-26T18:31:54.325Z] [LOG] ⏳ Initiating HLS segmenting for 47a76ddw00p27bcieb6lpj for 360p bitrate...
[2026-03-26T18:31:54.326Z] [LOG] ⏳ Starting HLS segmentation for 47a76ddw00p27bcieb6lpj [360p]...
[2026-03-26T18:31:54.368Z] [LOG] 📊 HLS [360p] progress: 100%
[2026-03-26T18:31:54.369Z] [LOG] ✅ HLS segmentation complete for 47a76ddw00p27bcieb6lpj [360p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/47a76ddw00p27bcieb6lpj/360p/360p.m3u8
[2026-03-26T18:31:54.369Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/47a76ddw00p27bcieb6lpj/360p/360p.m3u8
[2026-03-26T18:31:54.369Z] [LOG] ☁️ Uploading segmented files to S3 for 47a76ddw00p27bcieb6lpj with 360p bitrate...
[2026-03-26T18:31:54.567Z] [LOG] ☁️ Uploaded 480p.m3u8 to S3: dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/480p/480p.m3u8
[2026-03-26T18:31:54.597Z] [LOG] ☁️ Uploaded segment_001.ts to S3: dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/480p/segment_001.ts
[2026-03-26T18:31:54.647Z] [LOG] ☁️ Uploaded 360p.m3u8 to S3: dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/360p/360p.m3u8
[2026-03-26T18:31:54.656Z] [LOG] ☁️ Uploaded segment_001.ts to S3: dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/360p/segment_001.ts
[2026-03-26T18:31:54.666Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/47a76ddw00p27bcieb6lpj/720p.mp4 for hls job 5
[2026-03-26T18:31:54.666Z] [LOG] ⏳ Initiating HLS segmenting for 47a76ddw00p27bcieb6lpj for 720p bitrate...
[2026-03-26T18:31:54.666Z] [LOG] ⏳ Starting HLS segmentation for 47a76ddw00p27bcieb6lpj [720p]...
[2026-03-26T18:31:54.673Z] [LOG] ☁️ Uploaded segment_000.ts to S3: dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/480p/segment_000.ts
[2026-03-26T18:31:54.673Z] [LOG] ✅ All HLS files uploaded to S3 for 47a76ddw00p27bcieb6lpj [480p]
[2026-03-26T18:31:54.673Z] [LOG] ✅ All hls uploads complete for job 5. Keys: dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/480p/480p.m3u8,dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/480p/segment_001.ts,dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/480p/segment_000.ts
[2026-03-26T18:31:54.726Z] [LOG] 📊 HLS [720p] progress: 100%
[2026-03-26T18:31:54.727Z] [LOG] ✅ HLS segmentation complete for 47a76ddw00p27bcieb6lpj [720p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/47a76ddw00p27bcieb6lpj/720p/720p.m3u8
[2026-03-26T18:31:54.727Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/47a76ddw00p27bcieb6lpj/720p/720p.m3u8
[2026-03-26T18:31:54.727Z] [LOG] ☁️ Uploading segmented files to S3 for 47a76ddw00p27bcieb6lpj with 720p bitrate...
[2026-03-26T18:31:54.745Z] [LOG] ☁️ Uploaded segment_000.ts to S3: dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/360p/segment_000.ts
[2026-03-26T18:31:54.745Z] [LOG] ✅ All HLS files uploaded to S3 for 47a76ddw00p27bcieb6lpj [360p]
[2026-03-26T18:31:54.745Z] [LOG] ✅ All hls uploads complete for job 5. Keys: dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/360p/360p.m3u8,dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/360p/segment_001.ts,dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/360p/segment_000.ts
[2026-03-26T18:31:54.840Z] [LOG] ☁️ Uploaded 720p.m3u8 to S3: dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/720p/720p.m3u8
[2026-03-26T18:31:54.882Z] [LOG] ☁️ Uploaded segment_001.ts to S3: dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/720p/segment_001.ts
[2026-03-26T18:31:55.075Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/47a76ddw00p27bcieb6lpj/1080p.mp4 for hls job 5
[2026-03-26T18:31:55.075Z] [LOG] ⏳ Initiating HLS segmenting for 47a76ddw00p27bcieb6lpj for 1080p bitrate...
[2026-03-26T18:31:55.075Z] [LOG] ⏳ Starting HLS segmentation for 47a76ddw00p27bcieb6lpj [1080p]...
[2026-03-26T18:31:55.086Z] [LOG] ☁️ Uploaded segment_000.ts to S3: dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/720p/segment_000.ts
[2026-03-26T18:31:55.087Z] [LOG] ✅ All HLS files uploaded to S3 for 47a76ddw00p27bcieb6lpj [720p]
[2026-03-26T18:31:55.087Z] [LOG] ✅ All hls uploads complete for job 5. Keys: dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/720p/720p.m3u8,dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/720p/segment_001.ts,dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/720p/segment_000.ts
[2026-03-26T18:31:55.131Z] [LOG] 📊 HLS [1080p] progress: 100%
[2026-03-26T18:31:55.132Z] [LOG] ✅ HLS segmentation complete for 47a76ddw00p27bcieb6lpj [1080p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/47a76ddw00p27bcieb6lpj/1080p/1080p.m3u8
[2026-03-26T18:31:55.132Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/47a76ddw00p27bcieb6lpj/1080p/1080p.m3u8
[2026-03-26T18:31:55.132Z] [LOG] ☁️ Uploading segmented files to S3 for 47a76ddw00p27bcieb6lpj with 1080p bitrate...
[2026-03-26T18:31:55.218Z] [LOG] ☁️ Uploaded 1080p.m3u8 to S3: dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/1080p/1080p.m3u8
[2026-03-26T18:31:55.341Z] [LOG] ☁️ Uploaded segment_000.ts to S3: dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/1080p/segment_000.ts
[2026-03-26T18:31:55.601Z] [LOG] ☁️ Uploaded segment_001.ts to S3: dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/1080p/segment_001.ts
[2026-03-26T18:31:55.601Z] [LOG] ✅ All HLS files uploaded to S3 for 47a76ddw00p27bcieb6lpj [1080p]
[2026-03-26T18:31:55.601Z] [LOG] ✅ All hls uploads complete for job 5. Keys: dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/1080p/1080p.m3u8,dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/1080p/segment_000.ts,dev/users/ze3ej8dp2v9j2bi43gm63/47a76ddw00p27bcieb6lpj/1080p/segment_001.ts
[2026-03-26T18:31:55.641Z] [LOG] Successfully cleaned up hlsDownloads directory
[2026-03-29T14:41:48.831Z] [LOG] Server is running on port 8080
[2026-03-29T14:44:16.549Z] [LOG] 📽️ Processing job 1 for fileId xcolv0ia3bezijeod8nhcj
[2026-03-29T14:44:40.469Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/xcolv0ia3bezijeod8nhcj for transcode job 1
[2026-03-29T14:44:40.469Z] [LOG] ⏳ Initiating bulk FFmpeg transcodes for xcolv0ia3bezijeod8nhcj...
[2026-03-29T14:44:40.469Z] [LOG] ⏳ Starting transcode for 1080p (1920x1080)...
[2026-03-29T14:44:40.471Z] [LOG] ⏳ Starting transcode for 720p (1280x720)...
[2026-03-29T14:44:40.472Z] [LOG] ⏳ Starting transcode for 480p (854x480)...
[2026-03-29T14:44:40.473Z] [LOG] ⏳ Starting transcode for 360p (640x360)...
[2026-03-29T14:44:52.263Z] [LOG] ✅ Finished transcode for 360p
[2026-03-29T14:44:52.607Z] [LOG] ✅ Finished transcode for 480p
[2026-03-29T14:44:53.191Z] [LOG] ✅ Finished transcode for 720p
[2026-03-29T14:44:54.438Z] [LOG] ✅ Finished transcode for 1080p
[2026-03-29T14:44:54.438Z] [LOG] ✅ All transcoding finished for job 1. Outputs: /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/xcolv0ia3bezijeod8nhcj_360p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/xcolv0ia3bezijeod8nhcj_480p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/xcolv0ia3bezijeod8nhcj_720p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/xcolv0ia3bezijeod8nhcj_1080p.mp4
[2026-03-29T14:44:54.438Z] [LOG] ☁️ Uploading transcoded files to S3 for xcolv0ia3bezijeod8nhcj...
[2026-03-29T14:44:54.936Z] [LOG] ☁️ Uploaded 360p to S3: dev/users/y3ki145rneqxikqntm95in/original/xcolv0ia3bezijeod8nhcj/360p.mp4
[2026-03-29T14:44:55.123Z] [LOG] ☁️ Uploaded 720p to S3: dev/users/y3ki145rneqxikqntm95in/original/xcolv0ia3bezijeod8nhcj/720p.mp4
[2026-03-29T14:44:55.477Z] [LOG] ☁️ Uploaded 480p to S3: dev/users/y3ki145rneqxikqntm95in/original/xcolv0ia3bezijeod8nhcj/480p.mp4
[2026-03-29T14:44:56.301Z] [LOG] ☁️ Uploaded 1080p to S3: dev/users/y3ki145rneqxikqntm95in/original/xcolv0ia3bezijeod8nhcj/1080p.mp4
[2026-03-29T14:44:56.301Z] [LOG] ✅ All transcoded files uploaded to S3 for fileId: xcolv0ia3bezijeod8nhcj
[2026-03-29T14:44:56.301Z] [LOG] ✅ All uploads complete for job 1. Keys: dev/users/y3ki145rneqxikqntm95in/original/xcolv0ia3bezijeod8nhcj/360p.mp4, dev/users/y3ki145rneqxikqntm95in/original/xcolv0ia3bezijeod8nhcj/720p.mp4, dev/users/y3ki145rneqxikqntm95in/original/xcolv0ia3bezijeod8nhcj/480p.mp4, dev/users/y3ki145rneqxikqntm95in/original/xcolv0ia3bezijeod8nhcj/1080p.mp4
[2026-03-29T14:44:56.358Z] [LOG] HLS job added for fileId xcolv0ia3bezijeod8nhcj
[2026-03-29T14:44:56.415Z] [LOG] 📽️ Processing HLS job 1 for fileId xcolv0ia3bezijeod8nhcj
[2026-03-29T14:44:56.448Z] [LOG] Job 1 has completed successfully!
[2026-03-29T14:44:56.457Z] [LOG] Successfully cleaned up downloads directory
[2026-03-29T14:44:56.789Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/xcolv0ia3bezijeod8nhcj/360p.mp4 for hls job 1
[2026-03-29T14:44:56.789Z] [LOG] ⏳ Initiating HLS segmenting for xcolv0ia3bezijeod8nhcj for 360p bitrate...
[2026-03-29T14:44:56.789Z] [LOG] ⏳ Starting HLS segmentation for xcolv0ia3bezijeod8nhcj [360p]...
[2026-03-29T14:44:56.820Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/xcolv0ia3bezijeod8nhcj/480p.mp4 for hls job 1
[2026-03-29T14:44:56.820Z] [LOG] ⏳ Initiating HLS segmenting for xcolv0ia3bezijeod8nhcj for 480p bitrate...
[2026-03-29T14:44:56.820Z] [LOG] ⏳ Starting HLS segmentation for xcolv0ia3bezijeod8nhcj [480p]...
[2026-03-29T14:44:56.839Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/xcolv0ia3bezijeod8nhcj/720p.mp4 for hls job 1
[2026-03-29T14:44:56.839Z] [LOG] ⏳ Initiating HLS segmenting for xcolv0ia3bezijeod8nhcj for 720p bitrate...
[2026-03-29T14:44:56.839Z] [LOG] ⏳ Starting HLS segmentation for xcolv0ia3bezijeod8nhcj [720p]...
[2026-03-29T14:44:56.850Z] [LOG] ✅ HLS segmentation complete for xcolv0ia3bezijeod8nhcj [360p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/xcolv0ia3bezijeod8nhcj/360p/360p.m3u8
[2026-03-29T14:44:56.850Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/xcolv0ia3bezijeod8nhcj/360p/360p.m3u8
[2026-03-29T14:44:56.850Z] [LOG] ☁️ Uploading segmented files to S3 for xcolv0ia3bezijeod8nhcj with 360p bitrate...
[2026-03-29T14:44:56.877Z] [LOG] 📊 HLS [480p] progress: 100%
[2026-03-29T14:44:56.878Z] [LOG] ✅ HLS segmentation complete for xcolv0ia3bezijeod8nhcj [480p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/xcolv0ia3bezijeod8nhcj/480p/480p.m3u8
[2026-03-29T14:44:56.878Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/xcolv0ia3bezijeod8nhcj/480p/480p.m3u8
[2026-03-29T14:44:56.878Z] [LOG] ☁️ Uploading segmented files to S3 for xcolv0ia3bezijeod8nhcj with 480p bitrate...
[2026-03-29T14:44:56.889Z] [LOG] 📊 HLS [720p] progress: 100%
[2026-03-29T14:44:56.889Z] [LOG] ✅ HLS segmentation complete for xcolv0ia3bezijeod8nhcj [720p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/xcolv0ia3bezijeod8nhcj/720p/720p.m3u8
[2026-03-29T14:44:56.889Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/xcolv0ia3bezijeod8nhcj/720p/720p.m3u8
[2026-03-29T14:44:56.889Z] [LOG] ☁️ Uploading segmented files to S3 for xcolv0ia3bezijeod8nhcj with 720p bitrate...
[2026-03-29T14:44:57.146Z] [LOG] ☁️ Uploaded 480p.m3u8 to S3: dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/480p/480p.m3u8
[2026-03-29T14:44:57.150Z] [LOG] ☁️ Uploaded 360p.m3u8 to S3: dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/360p/360p.m3u8
[2026-03-29T14:44:57.197Z] [LOG] ☁️ Uploaded 720p.m3u8 to S3: dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/720p/720p.m3u8
[2026-03-29T14:44:57.243Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/xcolv0ia3bezijeod8nhcj/1080p.mp4 for hls job 1
[2026-03-29T14:44:57.243Z] [LOG] ⏳ Initiating HLS segmenting for xcolv0ia3bezijeod8nhcj for 1080p bitrate...
[2026-03-29T14:44:57.243Z] [LOG] ⏳ Starting HLS segmentation for xcolv0ia3bezijeod8nhcj [1080p]...
[2026-03-29T14:44:57.252Z] [LOG] ☁️ Uploaded segment_001.ts to S3: dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/360p/segment_001.ts
[2026-03-29T14:44:57.279Z] [LOG] ☁️ Uploaded segment_001.ts to S3: dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/720p/segment_001.ts
[2026-03-29T14:44:57.281Z] [LOG] ☁️ Uploaded segment_001.ts to S3: dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/480p/segment_001.ts
[2026-03-29T14:44:57.292Z] [LOG] 📊 HLS [1080p] progress: 100%
[2026-03-29T14:44:57.292Z] [LOG] ✅ HLS segmentation complete for xcolv0ia3bezijeod8nhcj [1080p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/xcolv0ia3bezijeod8nhcj/1080p/1080p.m3u8
[2026-03-29T14:44:57.292Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/xcolv0ia3bezijeod8nhcj/1080p/1080p.m3u8
[2026-03-29T14:44:57.292Z] [LOG] ☁️ Uploading segmented files to S3 for xcolv0ia3bezijeod8nhcj with 1080p bitrate...
[2026-03-29T14:44:57.434Z] [LOG] ☁️ Uploaded segment_000.ts to S3: dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/360p/segment_000.ts
[2026-03-29T14:44:57.435Z] [LOG] ✅ All HLS files uploaded to S3 for xcolv0ia3bezijeod8nhcj [360p]
[2026-03-29T14:44:57.435Z] [LOG] ✅ All hls uploads complete for job 1. Keys: dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/360p/360p.m3u8,dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/360p/segment_001.ts,dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/360p/segment_000.ts
[2026-03-29T14:44:57.457Z] [LOG] ☁️ Uploaded 1080p.m3u8 to S3: dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/1080p/1080p.m3u8
[2026-03-29T14:44:57.468Z] [LOG] ☁️ Uploaded segment_000.ts to S3: dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/480p/segment_000.ts
[2026-03-29T14:44:57.468Z] [LOG] ✅ All HLS files uploaded to S3 for xcolv0ia3bezijeod8nhcj [480p]
[2026-03-29T14:44:57.468Z] [LOG] ✅ All hls uploads complete for job 1. Keys: dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/480p/480p.m3u8,dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/480p/segment_001.ts,dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/480p/segment_000.ts
[2026-03-29T14:44:57.521Z] [LOG] ☁️ Uploaded segment_001.ts to S3: dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/1080p/segment_001.ts
[2026-03-29T14:44:57.794Z] [LOG] ☁️ Uploaded segment_000.ts to S3: dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/1080p/segment_000.ts
[2026-03-29T14:44:57.794Z] [LOG] ✅ All HLS files uploaded to S3 for xcolv0ia3bezijeod8nhcj [1080p]
[2026-03-29T14:44:57.794Z] [LOG] ✅ All hls uploads complete for job 1. Keys: dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/1080p/1080p.m3u8,dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/1080p/segment_001.ts,dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/1080p/segment_000.ts
[2026-03-29T14:44:58.035Z] [LOG] ☁️ Uploaded segment_000.ts to S3: dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/720p/segment_000.ts
[2026-03-29T14:44:58.036Z] [LOG] ✅ All HLS files uploaded to S3 for xcolv0ia3bezijeod8nhcj [720p]
[2026-03-29T14:44:58.036Z] [LOG] ✅ All hls uploads complete for job 1. Keys: dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/720p/720p.m3u8,dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/720p/segment_001.ts,dev/users/y3ki145rneqxikqntm95in/xcolv0ia3bezijeod8nhcj/720p/segment_000.ts
[2026-03-29T14:44:58.102Z] [LOG] Successfully cleaned up hlsDownloads directory
[2026-03-29T14:51:08.567Z] [LOG] Server is running on port 8080
[2026-03-29T14:51:38.246Z] [LOG]
============================================================
[2026-03-29T14:51:38.246Z] [LOG] 📽️ Processing job 2 | fileId: erizscz8cof0w7o9roswsci
[2026-03-29T14:51:38.246Z] [LOG] 🔄 Attempt 1 / 5
[2026-03-29T14:51:38.246Z] [LOG] ⏰ Timestamp: 2026-03-29T14:51:38.246Z
[2026-03-29T14:51:38.246Z] [LOG] ============================================================
[2026-03-29T14:51:38.246Z] [LOG] ❌ 🧪 SIMULATED FAILURE on attempt 1. Will succeed on attempt 3. Next retry in ~5s (exponential backoff).
[2026-03-29T14:51:38.341Z] [LOG]
❌ Job 2 FAILED on attempt 1/5
[2026-03-29T14:51:38.342Z] [LOG] Error: 🧪 SIMULATED FAILURE on attempt 1. Will succeed on attempt 3. Next retry in ~5s (exponential backoff).
[2026-03-29T14:51:38.343Z] [LOG] ⏳ Next retry in ~5s (exponential backoff: 5s × 2^0)
[2026-03-29T14:51:43.482Z] [LOG]
============================================================
[2026-03-29T14:51:43.482Z] [LOG] 📽️ Processing job 2 | fileId: erizscz8cof0w7o9roswsci
[2026-03-29T14:51:43.482Z] [LOG] 🔄 Attempt 2 / 5
[2026-03-29T14:51:43.482Z] [LOG] ⏰ Timestamp: 2026-03-29T14:51:43.482Z
[2026-03-29T14:51:43.482Z] [LOG] ============================================================
[2026-03-29T14:51:43.482Z] [LOG] ❌ 🧪 SIMULATED FAILURE on attempt 2. Will succeed on attempt 3. Next retry in ~10s (exponential backoff).
[2026-03-29T14:51:43.531Z] [LOG]
❌ Job 2 FAILED on attempt 2/5
[2026-03-29T14:51:43.531Z] [LOG] Error: 🧪 SIMULATED FAILURE on attempt 2. Will succeed on attempt 3. Next retry in ~10s (exponential backoff).
[2026-03-29T14:51:43.531Z] [LOG] ⏳ Next retry in ~10s (exponential backoff: 5s × 2^1)
[2026-03-29T14:51:53.592Z] [LOG]
============================================================
[2026-03-29T14:51:53.593Z] [LOG] 📽️ Processing job 2 | fileId: erizscz8cof0w7o9roswsci
[2026-03-29T14:51:53.593Z] [LOG] 🔄 Attempt 3 / 5
[2026-03-29T14:51:53.593Z] [LOG] ⏰ Timestamp: 2026-03-29T14:51:53.593Z
[2026-03-29T14:51:53.593Z] [LOG] ============================================================
[2026-03-29T14:51:53.593Z] [LOG] ✅ 🧪 Attempt 3 — past simulated failure threshold, proceeding normally!
[2026-03-29T14:52:00.960Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/erizscz8cof0w7o9roswsci for transcode job 2
[2026-03-29T14:52:00.960Z] [LOG] ⏳ Initiating bulk FFmpeg transcodes for erizscz8cof0w7o9roswsci...
[2026-03-29T14:52:00.960Z] [LOG] ⏳ Starting transcode for 1080p (1920x1080)...
[2026-03-29T14:52:00.962Z] [LOG] ⏳ Starting transcode for 720p (1280x720)...
[2026-03-29T14:52:00.962Z] [LOG] ⏳ Starting transcode for 480p (854x480)...
[2026-03-29T14:52:00.963Z] [LOG] ⏳ Starting transcode for 360p (640x360)...
[2026-03-29T14:52:11.077Z] [LOG] ✅ Finished transcode for 360p
[2026-03-29T14:52:11.314Z] [LOG] ✅ Finished transcode for 480p
[2026-03-29T14:52:12.071Z] [LOG] ✅ Finished transcode for 720p
[2026-03-29T14:52:13.097Z] [LOG] ✅ Finished transcode for 1080p
[2026-03-29T14:52:13.097Z] [LOG] ✅ All transcoding finished for job 2. Outputs: /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/erizscz8cof0w7o9roswsci_360p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/erizscz8cof0w7o9roswsci_480p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/erizscz8cof0w7o9roswsci_720p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/erizscz8cof0w7o9roswsci_1080p.mp4
[2026-03-29T14:52:13.097Z] [LOG] ☁️ Uploading transcoded files to S3 for erizscz8cof0w7o9roswsci...
[2026-03-29T14:52:13.662Z] [LOG] ☁️ Uploaded 480p to S3: dev/users/ux6kt6r36hoidrle0a0tmc/original/erizscz8cof0w7o9roswsci/480p.mp4
[2026-03-29T14:52:13.744Z] [LOG] ☁️ Uploaded 720p to S3: dev/users/ux6kt6r36hoidrle0a0tmc/original/erizscz8cof0w7o9roswsci/720p.mp4
[2026-03-29T14:52:14.101Z] [LOG] ☁️ Uploaded 1080p to S3: dev/users/ux6kt6r36hoidrle0a0tmc/original/erizscz8cof0w7o9roswsci/1080p.mp4
[2026-03-29T14:52:14.130Z] [LOG] ☁️ Uploaded 360p to S3: dev/users/ux6kt6r36hoidrle0a0tmc/original/erizscz8cof0w7o9roswsci/360p.mp4
[2026-03-29T14:52:14.130Z] [LOG] ✅ All transcoded files uploaded to S3 for fileId: erizscz8cof0w7o9roswsci
[2026-03-29T14:52:14.130Z] [LOG] ✅ All uploads complete for job 2. Keys: dev/users/ux6kt6r36hoidrle0a0tmc/original/erizscz8cof0w7o9roswsci/480p.mp4, dev/users/ux6kt6r36hoidrle0a0tmc/original/erizscz8cof0w7o9roswsci/720p.mp4, dev/users/ux6kt6r36hoidrle0a0tmc/original/erizscz8cof0w7o9roswsci/1080p.mp4, dev/users/ux6kt6r36hoidrle0a0tmc/original/erizscz8cof0w7o9roswsci/360p.mp4
[2026-03-29T14:52:14.204Z] [LOG] HLS job added for fileId erizscz8cof0w7o9roswsci
[2026-03-29T14:52:14.303Z] [LOG] Job 2 has completed successfully!
[2026-03-29T14:52:14.319Z] [LOG] Successfully cleaned up downloads directory
[2026-03-29T14:52:14.520Z] [LOG] 📽️ Processing HLS job 2 for fileId erizscz8cof0w7o9roswsci
[2026-03-29T14:52:15.118Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/1080p.mp4 for hls job 2
[2026-03-29T14:52:15.118Z] [LOG] ⏳ Initiating HLS segmenting for erizscz8cof0w7o9roswsci for 1080p bitrate...
[2026-03-29T14:52:15.119Z] [LOG] ⏳ Starting HLS segmentation for erizscz8cof0w7o9roswsci [1080p]...
[2026-03-29T14:52:15.186Z] [LOG] 📊 HLS [1080p] progress: 100%
[2026-03-29T14:52:15.186Z] [LOG] ✅ HLS segmentation complete for erizscz8cof0w7o9roswsci [1080p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/1080p/1080p.m3u8
[2026-03-29T14:52:15.187Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/1080p/1080p.m3u8
[2026-03-29T14:52:15.187Z] [LOG] ☁️ Uploading segmented files to S3 for erizscz8cof0w7o9roswsci with 1080p bitrate...
[2026-03-29T14:52:15.195Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/480p.mp4 for hls job 2
[2026-03-29T14:52:15.195Z] [LOG] ⏳ Initiating HLS segmenting for erizscz8cof0w7o9roswsci for 480p bitrate...
[2026-03-29T14:52:15.196Z] [LOG] ⏳ Starting HLS segmentation for erizscz8cof0w7o9roswsci [480p]...
[2026-03-29T14:52:15.235Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/360p.mp4 for hls job 2
[2026-03-29T14:52:15.235Z] [LOG] ⏳ Initiating HLS segmenting for erizscz8cof0w7o9roswsci for 360p bitrate...
[2026-03-29T14:52:15.235Z] [LOG] ⏳ Starting HLS segmentation for erizscz8cof0w7o9roswsci [360p]...
[2026-03-29T14:52:15.236Z] [LOG] 📊 HLS [480p] progress: 100%
[2026-03-29T14:52:15.237Z] [LOG] ✅ HLS segmentation complete for erizscz8cof0w7o9roswsci [480p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/480p/480p.m3u8
[2026-03-29T14:52:15.237Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/480p/480p.m3u8
[2026-03-29T14:52:15.237Z] [LOG] ☁️ Uploading segmented files to S3 for erizscz8cof0w7o9roswsci with 480p bitrate...
[2026-03-29T14:52:15.275Z] [LOG] 📊 HLS [360p] progress: 100%
[2026-03-29T14:52:15.276Z] [LOG] ✅ HLS segmentation complete for erizscz8cof0w7o9roswsci [360p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/360p/360p.m3u8
[2026-03-29T14:52:15.276Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/360p/360p.m3u8
[2026-03-29T14:52:15.276Z] [LOG] ☁️ Uploading segmented files to S3 for erizscz8cof0w7o9roswsci with 360p bitrate...
[2026-03-29T14:52:15.375Z] [WARN] An error was encountered in a non-retryable streaming request.
[2026-03-29T14:52:15.448Z] [WARN] An error was encountered in a non-retryable streaming request.
[2026-03-29T14:52:15.464Z] [LOG] Job 2 has failed with error: read ECONNRESET
[2026-03-29T14:52:15.546Z] [LOG] ☁️ Uploaded 480p.m3u8 to S3: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/480p/480p.m3u8
[2026-03-29T14:52:15.547Z] [LOG] ☁️ Uploaded 1080p.m3u8 to S3: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/1080p/1080p.m3u8
[2026-03-29T14:52:15.574Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/720p.mp4 for hls job 2
[2026-03-29T14:52:15.574Z] [LOG] ⏳ Initiating HLS segmenting for erizscz8cof0w7o9roswsci for 720p bitrate...
[2026-03-29T14:52:15.574Z] [LOG] ⏳ Starting HLS segmentation for erizscz8cof0w7o9roswsci [720p]...
[2026-03-29T14:52:15.626Z] [LOG] ☁️ Uploaded segment_001.ts to S3: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/480p/segment_001.ts
[2026-03-29T14:52:15.629Z] [LOG] 📊 HLS [720p] progress: 100%
[2026-03-29T14:52:15.630Z] [LOG] ✅ HLS segmentation complete for erizscz8cof0w7o9roswsci [720p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/720p/720p.m3u8
[2026-03-29T14:52:15.630Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/720p/720p.m3u8
[2026-03-29T14:52:15.630Z] [LOG] ☁️ Uploading segmented files to S3 for erizscz8cof0w7o9roswsci with 720p bitrate...
[2026-03-29T14:52:15.687Z] [LOG] ☁️ Uploaded segment_001.ts to S3: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/1080p/segment_001.ts
[2026-03-29T14:52:15.759Z] [LOG] ☁️ Uploaded 720p.m3u8 to S3: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/720p/720p.m3u8
[2026-03-29T14:52:15.793Z] [LOG] ☁️ Uploaded segment_000.ts to S3: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/480p/segment_000.ts
[2026-03-29T14:52:15.794Z] [LOG] ✅ All HLS files uploaded to S3 for erizscz8cof0w7o9roswsci [480p]
[2026-03-29T14:52:15.794Z] [LOG] ✅ All hls uploads complete for job 2. Keys: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/480p/480p.m3u8,dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/480p/segment_001.ts,dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/480p/segment_000.ts
[2026-03-29T14:52:15.820Z] [LOG] ☁️ Uploaded 360p.m3u8 to S3: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/360p/360p.m3u8
[2026-03-29T14:52:16.066Z] [LOG] ☁️ Uploaded segment_000.ts to S3: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/720p/segment_000.ts
[2026-03-29T14:52:16.179Z] [LOG] ☁️ Uploaded segment_001.ts to S3: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/720p/segment_001.ts
[2026-03-29T14:52:16.179Z] [LOG] ✅ All HLS files uploaded to S3 for erizscz8cof0w7o9roswsci [720p]
[2026-03-29T14:52:16.179Z] [LOG] ✅ All hls uploads complete for job 2. Keys: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/720p/720p.m3u8,dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/720p/segment_000.ts,dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/720p/segment_001.ts
[2026-03-29T14:52:16.451Z] [LOG] ☁️ Uploaded segment_000.ts to S3: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/360p/segment_000.ts
[2026-03-29T14:52:20.518Z] [LOG] 📽️ Processing HLS job 2 for fileId erizscz8cof0w7o9roswsci
[2026-03-29T14:52:20.908Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/480p.mp4 for hls job 2
[2026-03-29T14:52:20.909Z] [LOG] ⏳ Initiating HLS segmenting for erizscz8cof0w7o9roswsci for 480p bitrate...
[2026-03-29T14:52:20.909Z] [LOG] ⏳ Starting HLS segmentation for erizscz8cof0w7o9roswsci [480p]...
[2026-03-29T14:52:20.919Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/360p.mp4 for hls job 2
[2026-03-29T14:52:20.919Z] [LOG] ⏳ Initiating HLS segmenting for erizscz8cof0w7o9roswsci for 360p bitrate...
[2026-03-29T14:52:20.919Z] [LOG] ⏳ Starting HLS segmentation for erizscz8cof0w7o9roswsci [360p]...
[2026-03-29T14:52:20.979Z] [LOG] 📊 HLS [480p] progress: 100%
[2026-03-29T14:52:20.980Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/720p.mp4 for hls job 2
[2026-03-29T14:52:20.980Z] [LOG] ⏳ Initiating HLS segmenting for erizscz8cof0w7o9roswsci for 720p bitrate...
[2026-03-29T14:52:20.980Z] [LOG] ⏳ Starting HLS segmentation for erizscz8cof0w7o9roswsci [720p]...
[2026-03-29T14:52:20.981Z] [LOG] ✅ HLS segmentation complete for erizscz8cof0w7o9roswsci [480p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/480p/480p.m3u8
[2026-03-29T14:52:20.981Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/480p/480p.m3u8
[2026-03-29T14:52:20.981Z] [LOG] ☁️ Uploading segmented files to S3 for erizscz8cof0w7o9roswsci with 480p bitrate...
[2026-03-29T14:52:20.982Z] [LOG] 📊 HLS [360p] progress: 100%
[2026-03-29T14:52:20.983Z] [LOG] ✅ HLS segmentation complete for erizscz8cof0w7o9roswsci [360p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/360p/360p.m3u8
[2026-03-29T14:52:20.983Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/360p/360p.m3u8
[2026-03-29T14:52:20.983Z] [LOG] ☁️ Uploading segmented files to S3 for erizscz8cof0w7o9roswsci with 360p bitrate...
[2026-03-29T14:52:21.026Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/1080p.mp4 for hls job 2
[2026-03-29T14:52:21.026Z] [LOG] ⏳ Initiating HLS segmenting for erizscz8cof0w7o9roswsci for 1080p bitrate...
[2026-03-29T14:52:21.026Z] [LOG] ⏳ Starting HLS segmentation for erizscz8cof0w7o9roswsci [1080p]...
[2026-03-29T14:52:21.027Z] [LOG] 📊 HLS [720p] progress: 100%
[2026-03-29T14:52:21.027Z] [LOG] ✅ HLS segmentation complete for erizscz8cof0w7o9roswsci [720p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/720p/720p.m3u8
[2026-03-29T14:52:21.027Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/720p/720p.m3u8
[2026-03-29T14:52:21.027Z] [LOG] ☁️ Uploading segmented files to S3 for erizscz8cof0w7o9roswsci with 720p bitrate...
[2026-03-29T14:52:21.071Z] [LOG] 📊 HLS [1080p] progress: 100%
[2026-03-29T14:52:21.071Z] [LOG] ✅ HLS segmentation complete for erizscz8cof0w7o9roswsci [1080p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/1080p/1080p.m3u8
[2026-03-29T14:52:21.071Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/erizscz8cof0w7o9roswsci/1080p/1080p.m3u8
[2026-03-29T14:52:21.071Z] [LOG] ☁️ Uploading segmented files to S3 for erizscz8cof0w7o9roswsci with 1080p bitrate...
[2026-03-29T14:52:21.105Z] [LOG] ☁️ Uploaded segment_001.ts to S3: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/480p/segment_001.ts
[2026-03-29T14:52:21.135Z] [LOG] ☁️ Uploaded 480p.m3u8 to S3: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/480p/480p.m3u8
[2026-03-29T14:52:21.139Z] [LOG] ☁️ Uploaded 360p.m3u8 to S3: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/360p/360p.m3u8
[2026-03-29T14:52:21.164Z] [LOG] ☁️ Uploaded segment_001.ts to S3: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/360p/segment_001.ts
[2026-03-29T14:52:21.199Z] [LOG] ☁️ Uploaded segment_000.ts to S3: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/360p/segment_000.ts
[2026-03-29T14:52:21.199Z] [LOG] ✅ All HLS files uploaded to S3 for erizscz8cof0w7o9roswsci [360p]
[2026-03-29T14:52:21.199Z] [LOG] ✅ All hls uploads complete for job 2. Keys: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/360p/360p.m3u8,dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/360p/segment_001.ts,dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/360p/segment_000.ts
[2026-03-29T14:52:21.201Z] [LOG] ☁️ Uploaded 720p.m3u8 to S3: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/720p/720p.m3u8
[2026-03-29T14:52:21.312Z] [LOG] ☁️ Uploaded 1080p.m3u8 to S3: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/1080p/1080p.m3u8
[2026-03-29T14:52:21.356Z] [LOG] ☁️ Uploaded segment_001.ts to S3: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/720p/segment_001.ts
[2026-03-29T14:52:21.562Z] [LOG] ☁️ Uploaded segment_000.ts to S3: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/720p/segment_000.ts
[2026-03-29T14:52:21.562Z] [LOG] ✅ All HLS files uploaded to S3 for erizscz8cof0w7o9roswsci [720p]
[2026-03-29T14:52:21.562Z] [LOG] ✅ All hls uploads complete for job 2. Keys: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/720p/720p.m3u8,dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/720p/segment_001.ts,dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/720p/segment_000.ts
[2026-03-29T14:52:21.633Z] [LOG] ☁️ Uploaded segment_001.ts to S3: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/1080p/segment_001.ts
[2026-03-29T14:52:21.721Z] [LOG] ☁️ Uploaded segment_000.ts to S3: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/480p/segment_000.ts
[2026-03-29T14:52:21.721Z] [LOG] ✅ All HLS files uploaded to S3 for erizscz8cof0w7o9roswsci [480p]
[2026-03-29T14:52:21.721Z] [LOG] ✅ All hls uploads complete for job 2. Keys: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/480p/segment_001.ts,dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/480p/480p.m3u8,dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/480p/segment_000.ts
[2026-03-29T14:52:22.216Z] [LOG] ☁️ Uploaded segment_000.ts to S3: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/1080p/segment_000.ts
[2026-03-29T14:52:22.216Z] [LOG] ✅ All HLS files uploaded to S3 for erizscz8cof0w7o9roswsci [1080p]
[2026-03-29T14:52:22.216Z] [LOG] ✅ All hls uploads complete for job 2. Keys: dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/1080p/1080p.m3u8,dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/1080p/segment_001.ts,dev/users/ux6kt6r36hoidrle0a0tmc/erizscz8cof0w7o9roswsci/1080p/segment_000.ts
[2026-03-29T14:52:22.288Z] [LOG] Successfully cleaned up hlsDownloads directory
[2026-03-29T14:57:08.843Z] [LOG] Server is running on port 8080
[2026-03-29T14:57:36.935Z] [LOG]
============================================================
[2026-03-29T14:57:36.936Z] [LOG] 📽️ Processing job 3 | fileId: i79oyab6j9o6x8kbfedx
[2026-03-29T14:57:36.936Z] [LOG] 🔄 Attempt 1 / 5
[2026-03-29T14:57:36.936Z] [LOG] ⏰ Timestamp: 2026-03-29T14:57:36.936Z
[2026-03-29T14:57:36.936Z] [LOG] ============================================================
[2026-03-29T14:57:36.936Z] [LOG] ❌ 🧪 SIMULATED FAILURE on attempt 1. Will succeed on attempt 3. Next retry in ~3.0s (exponential backoff).
[2026-03-29T14:57:37.020Z] [LOG]
❌ Job 3 FAILED on attempt 1/5
[2026-03-29T14:57:37.020Z] [LOG] Error: 🧪 SIMULATED FAILURE on attempt 1. Will succeed on attempt 3. Next retry in ~3.0s (exponential backoff).
[2026-03-29T14:57:37.020Z] [LOG] ⏳ Next retry in ~3.0s (exponential backoff: 3s × 2^0)
[2026-03-29T14:57:40.455Z] [LOG]
============================================================
[2026-03-29T14:57:40.455Z] [LOG] 📽️ Processing job 3 | fileId: i79oyab6j9o6x8kbfedx
[2026-03-29T14:57:40.456Z] [LOG] 🔄 Attempt 2 / 5
[2026-03-29T14:57:40.456Z] [LOG] ⏰ Timestamp: 2026-03-29T14:57:40.456Z
[2026-03-29T14:57:40.456Z] [LOG] ⏱️ Time since last attempt: 3.5s (expected: ~3.0s)
[2026-03-29T14:57:40.456Z] [LOG] ============================================================
[2026-03-29T14:57:40.456Z] [LOG] ❌ 🧪 SIMULATED FAILURE on attempt 2. Will succeed on attempt 3. Next retry in ~6.0s (exponential backoff).
[2026-03-29T14:57:40.522Z] [LOG]
❌ Job 3 FAILED on attempt 2/5
[2026-03-29T14:57:40.522Z] [LOG] Error: 🧪 SIMULATED FAILURE on attempt 2. Will succeed on attempt 3. Next retry in ~6.0s (exponential backoff).
[2026-03-29T14:57:40.522Z] [LOG] ⏳ Next retry in ~6.0s (exponential backoff: 3s × 2^1)
[2026-03-29T14:57:46.618Z] [LOG]
============================================================
[2026-03-29T14:57:46.618Z] [LOG] 📽️ Processing job 3 | fileId: i79oyab6j9o6x8kbfedx
[2026-03-29T14:57:46.618Z] [LOG] 🔄 Attempt 3 / 5
[2026-03-29T14:57:46.618Z] [LOG] ⏰ Timestamp: 2026-03-29T14:57:46.618Z
[2026-03-29T14:57:46.618Z] [LOG] ⏱️ Time since last attempt: 6.2s (expected: ~6.0s)
[2026-03-29T14:57:46.618Z] [LOG] ============================================================
[2026-03-29T14:57:46.618Z] [LOG] ✅ 🧪 Attempt 3 — past simulated failure threshold, proceeding normally!
[2026-03-29T14:58:25.107Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/i79oyab6j9o6x8kbfedx for transcode job 3
[2026-03-29T14:58:25.107Z] [LOG] ⏳ Initiating bulk FFmpeg transcodes for i79oyab6j9o6x8kbfedx...
[2026-03-29T14:58:25.107Z] [LOG] ⏳ Starting transcode for 1080p (1920x1080)...
[2026-03-29T14:58:25.109Z] [LOG] ⏳ Starting transcode for 720p (1280x720)...
[2026-03-29T14:58:25.109Z] [LOG] ⏳ Starting transcode for 480p (854x480)...
[2026-03-29T14:58:25.109Z] [LOG] ⏳ Starting transcode for 360p (640x360)...
[2026-03-29T14:58:36.024Z] [LOG] ✅ Finished transcode for 360p
[2026-03-29T14:58:36.066Z] [LOG] ✅ Finished transcode for 480p
[2026-03-29T14:58:37.067Z] [LOG] ✅ Finished transcode for 720p
[2026-03-29T14:58:38.001Z] [LOG] ✅ Finished transcode for 1080p
[2026-03-29T14:58:38.001Z] [LOG] ✅ All transcoding finished for job 3. Outputs: /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/i79oyab6j9o6x8kbfedx_360p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/i79oyab6j9o6x8kbfedx_480p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/i79oyab6j9o6x8kbfedx_720p.mp4, /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/downloads/i79oyab6j9o6x8kbfedx_1080p.mp4
[2026-03-29T14:58:38.001Z] [LOG] ☁️ Uploading transcoded files to S3 for i79oyab6j9o6x8kbfedx...
[2026-03-29T14:58:38.534Z] [LOG] ☁️ Uploaded 360p to S3: dev/users/i0bcemn4itomyvyx5hhhvk/original/i79oyab6j9o6x8kbfedx/360p.mp4
[2026-03-29T14:58:38.572Z] [LOG] ☁️ Uploaded 480p to S3: dev/users/i0bcemn4itomyvyx5hhhvk/original/i79oyab6j9o6x8kbfedx/480p.mp4
[2026-03-29T14:58:38.960Z] [LOG] ☁️ Uploaded 720p to S3: dev/users/i0bcemn4itomyvyx5hhhvk/original/i79oyab6j9o6x8kbfedx/720p.mp4
[2026-03-29T14:58:39.019Z] [LOG] ☁️ Uploaded 1080p to S3: dev/users/i0bcemn4itomyvyx5hhhvk/original/i79oyab6j9o6x8kbfedx/1080p.mp4
[2026-03-29T14:58:39.020Z] [LOG] ✅ All transcoded files uploaded to S3 for fileId: i79oyab6j9o6x8kbfedx
[2026-03-29T14:58:39.020Z] [LOG] ✅ All uploads complete for job 3. Keys: dev/users/i0bcemn4itomyvyx5hhhvk/original/i79oyab6j9o6x8kbfedx/360p.mp4, dev/users/i0bcemn4itomyvyx5hhhvk/original/i79oyab6j9o6x8kbfedx/480p.mp4, dev/users/i0bcemn4itomyvyx5hhhvk/original/i79oyab6j9o6x8kbfedx/720p.mp4, dev/users/i0bcemn4itomyvyx5hhhvk/original/i79oyab6j9o6x8kbfedx/1080p.mp4
[2026-03-29T14:58:39.063Z] [LOG] HLS job added for fileId i79oyab6j9o6x8kbfedx
[2026-03-29T14:58:39.066Z] [LOG] 📽️ Processing HLS job 3 for fileId i79oyab6j9o6x8kbfedx
[2026-03-29T14:58:39.150Z] [LOG] Job 3 has completed successfully!
[2026-03-29T14:58:39.156Z] [LOG] Successfully cleaned up downloads directory
[2026-03-29T14:58:39.346Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/i79oyab6j9o6x8kbfedx/360p.mp4 for hls job 3
[2026-03-29T14:58:39.346Z] [LOG] ⏳ Initiating HLS segmenting for i79oyab6j9o6x8kbfedx for 360p bitrate...
[2026-03-29T14:58:39.347Z] [LOG] ⏳ Starting HLS segmentation for i79oyab6j9o6x8kbfedx [360p]...
[2026-03-29T14:58:39.413Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/i79oyab6j9o6x8kbfedx/480p.mp4 for hls job 3
[2026-03-29T14:58:39.413Z] [LOG] ⏳ Initiating HLS segmenting for i79oyab6j9o6x8kbfedx for 480p bitrate...
[2026-03-29T14:58:39.413Z] [LOG] ⏳ Starting HLS segmentation for i79oyab6j9o6x8kbfedx [480p]...
[2026-03-29T14:58:39.415Z] [LOG] 📊 HLS [360p] progress: 100%
[2026-03-29T14:58:39.416Z] [LOG] ✅ HLS segmentation complete for i79oyab6j9o6x8kbfedx [360p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/i79oyab6j9o6x8kbfedx/360p/360p.m3u8
[2026-03-29T14:58:39.416Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/i79oyab6j9o6x8kbfedx/360p/360p.m3u8
[2026-03-29T14:58:39.416Z] [LOG] ☁️ Uploading segmented files to S3 for i79oyab6j9o6x8kbfedx with 360p bitrate...
[2026-03-29T14:58:39.437Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/i79oyab6j9o6x8kbfedx/720p.mp4 for hls job 3
[2026-03-29T14:58:39.438Z] [LOG] ⏳ Initiating HLS segmenting for i79oyab6j9o6x8kbfedx for 720p bitrate...
[2026-03-29T14:58:39.438Z] [LOG] ⏳ Starting HLS segmentation for i79oyab6j9o6x8kbfedx [720p]...
[2026-03-29T14:58:39.457Z] [LOG] 📊 HLS [480p] progress: 100%
[2026-03-29T14:58:39.458Z] [LOG] ✅ HLS segmentation complete for i79oyab6j9o6x8kbfedx [480p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/i79oyab6j9o6x8kbfedx/480p/480p.m3u8
[2026-03-29T14:58:39.458Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/i79oyab6j9o6x8kbfedx/480p/480p.m3u8
[2026-03-29T14:58:39.458Z] [LOG] ☁️ Uploading segmented files to S3 for i79oyab6j9o6x8kbfedx with 480p bitrate...
[2026-03-29T14:58:39.481Z] [LOG] 📊 HLS [720p] progress: 100%
[2026-03-29T14:58:39.482Z] [LOG] ✅ HLS segmentation complete for i79oyab6j9o6x8kbfedx [720p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/i79oyab6j9o6x8kbfedx/720p/720p.m3u8
[2026-03-29T14:58:39.482Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/i79oyab6j9o6x8kbfedx/720p/720p.m3u8
[2026-03-29T14:58:39.482Z] [LOG] ☁️ Uploading segmented files to S3 for i79oyab6j9o6x8kbfedx with 720p bitrate...
[2026-03-29T14:58:39.593Z] [LOG] ✅ Video downloaded successfully to /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/i79oyab6j9o6x8kbfedx/1080p.mp4 for hls job 3
[2026-03-29T14:58:39.593Z] [LOG] ⏳ Initiating HLS segmenting for i79oyab6j9o6x8kbfedx for 1080p bitrate...
[2026-03-29T14:58:39.593Z] [LOG] ⏳ Starting HLS segmentation for i79oyab6j9o6x8kbfedx [1080p]...
[2026-03-29T14:58:39.639Z] [LOG] ☁️ Uploaded 480p.m3u8 to S3: dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/480p/480p.m3u8
[2026-03-29T14:58:39.641Z] [LOG] 📊 HLS [1080p] progress: 100%
[2026-03-29T14:58:39.642Z] [LOG] ✅ HLS segmentation complete for i79oyab6j9o6x8kbfedx [1080p] → /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/i79oyab6j9o6x8kbfedx/1080p/1080p.m3u8
[2026-03-29T14:58:39.642Z] [LOG] ✅ HLS playlist created at /Users/anshkumain/Developer/POC/videoThumbnailProcessingPOC/server/hlsDownloads/i79oyab6j9o6x8kbfedx/1080p/1080p.m3u8
[2026-03-29T14:58:39.642Z] [LOG] ☁️ Uploading segmented files to S3 for i79oyab6j9o6x8kbfedx with 1080p bitrate...
[2026-03-29T14:58:39.651Z] [LOG] ☁️ Uploaded 360p.m3u8 to S3: dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/360p/360p.m3u8
[2026-03-29T14:58:39.661Z] [LOG] ☁️ Uploaded 720p.m3u8 to S3: dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/720p/720p.m3u8
[2026-03-29T14:58:39.685Z] [LOG] ☁️ Uploaded segment_001.ts to S3: dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/480p/segment_001.ts
[2026-03-29T14:58:39.706Z] [LOG] ☁️ Uploaded segment_001.ts to S3: dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/360p/segment_001.ts
[2026-03-29T14:58:39.806Z] [LOG] ☁️ Uploaded 1080p.m3u8 to S3: dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/1080p/1080p.m3u8
[2026-03-29T14:58:39.862Z] [LOG] ☁️ Uploaded segment_000.ts to S3: dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/360p/segment_000.ts
[2026-03-29T14:58:39.862Z] [LOG] ✅ All HLS files uploaded to S3 for i79oyab6j9o6x8kbfedx [360p]
[2026-03-29T14:58:39.862Z] [LOG] ✅ All hls uploads complete for job 3. Keys: dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/360p/360p.m3u8,dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/360p/segment_001.ts,dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/360p/segment_000.ts
[2026-03-29T14:58:39.907Z] [LOG] ☁️ Uploaded segment_000.ts to S3: dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/720p/segment_000.ts
[2026-03-29T14:58:39.911Z] [LOG] ☁️ Uploaded segment_000.ts to S3: dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/480p/segment_000.ts
[2026-03-29T14:58:39.911Z] [LOG] ✅ All HLS files uploaded to S3 for i79oyab6j9o6x8kbfedx [480p]
[2026-03-29T14:58:39.911Z] [LOG] ✅ All hls uploads complete for job 3. Keys: dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/480p/480p.m3u8,dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/480p/segment_001.ts,dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/480p/segment_000.ts
[2026-03-29T14:58:39.974Z] [LOG] ☁️ Uploaded segment_001.ts to S3: dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/720p/segment_001.ts
[2026-03-29T14:58:39.974Z] [LOG] ✅ All HLS files uploaded to S3 for i79oyab6j9o6x8kbfedx [720p]
[2026-03-29T14:58:39.974Z] [LOG] ✅ All hls uploads complete for job 3. Keys: dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/720p/720p.m3u8,dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/720p/segment_000.ts,dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/720p/segment_001.ts
[2026-03-29T14:58:40.058Z] [LOG] ☁️ Uploaded segment_001.ts to S3: dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/1080p/segment_001.ts
[2026-03-29T14:58:40.307Z] [LOG] ☁️ Uploaded segment_000.ts to S3: dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/1080p/segment_000.ts
[2026-03-29T14:58:40.307Z] [LOG] ✅ All HLS files uploaded to S3 for i79oyab6j9o6x8kbfedx [1080p]
[2026-03-29T14:58:40.307Z] [LOG] ✅ All hls uploads complete for job 3. Keys: dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/1080p/1080p.m3u8,dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/1080p/segment_001.ts,dev/users/i0bcemn4itomyvyx5hhhvk/i79oyab6j9o6x8kbfedx/1080p/segment_000.ts
[2026-03-29T14:58:40.390Z] [LOG] Successfully cleaned up hlsDownloads directory
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Do not commit log files to version control.

This log file contains runtime output with potentially sensitive information including:

  • Local filesystem paths exposing developer usernames
  • User IDs and file IDs from S3 paths
  • Stack traces revealing internal implementation details

The .gitignore has *.log but this file is log.txt. Add logs/ directory to .gitignore and remove this file from the repository.

📝 Proposed fix for .gitignore
 *.log
+logs/
 downloads/
 hlsDownloads/

Then remove the committed file:

git rm --cached server/logs/log.txt
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/logs/log.txt` around lines 1 - 684, Summary: Committed runtime log
server/logs/log.txt contains sensitive runtime data and must be removed from the
repo and ignored going forward; update .gitignore to include logs/ (or
server/logs/) so similar files aren't committed. Fix: open .gitignore and add a
line for logs/ (or server/logs/) in addition to the existing *.log entry, then
remove the committed file from git tracking with git rm --cached
server/logs/log.txt and commit the changes (include a short commit message like
"chore: remove committed logs and ignore logs/"). Refer to server/logs/log.txt
and the repository .gitignore entry (*.log) when applying the change.

Comment thread server/package.json
"dev": "npm run build && nodemon dist/index.js"
"start": "node dist/index.js",
"start:worker": "node dist/worker.js",
"build": "tsc -b",
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

cat -n server/package.json | head -30

Repository: vector17002/video-transcoding

Length of output: 1108


🏁 Script executed:

cat server/Dockerfile | grep -n typescript -i

Repository: vector17002/video-transcoding

Length of output: 134


🏁 Script executed:

cat server/Dockerfile

Repository: vector17002/video-transcoding

Length of output: 1305


🏁 Script executed:

cat server/package.json | grep -A 20 '"devDependencies"'

Repository: vector17002/video-transcoding

Length of output: 429


Add typescript to devDependencies before using tsc in the build script.

The "build": "tsc -b" script requires the TypeScript compiler, but typescript is not declared in devDependencies. The ad-hoc RUN npm i typescript in the Dockerfile masks this dependency gap instead of fixing it, causing npm ci && npm run build to fail outside Docker.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/package.json` at line 9, The package.json contains a "build" script
that runs "tsc -b" but TypeScript is not declared in devDependencies; add
"typescript" to devDependencies (e.g., add a "typescript":
"<appropriate-version>" entry) so tsc is installed when running npm ci && npm
run build outside Docker, ensuring the build script works consistently; update
package.json's devDependencies accordingly (and regenerate lockfile if needed)
so the "build" script and tsc usage are properly declared.

Comment thread server/package.json
Comment on lines +10 to +11
"dev": "npm run build && nodemon dist/index.js",
"dev:worker": "npm run build && nodemon dist/worker.js"
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

cd server && cat -n package.json | head -30

Repository: vector17002/video-transcoding

Length of output: 1108


🏁 Script executed:

cd server && ls -la | grep -E "tsconfig|build" && cat -n tsconfig.json

Repository: vector17002/video-transcoding

Length of output: 1632


🏁 Script executed:

cd server && cat -n package.json | grep -A 2 -B 2 '"build"'

Repository: vector17002/video-transcoding

Length of output: 321


Dev scripts don't rebuild on TypeScript source changes.

The current setup compiles once with npm run build, then nodemon only watches the compiled dist/*.js files. Any edits to src/ require manually restarting the command.

Rebuild on source changes
-    "dev": "npm run build && nodemon dist/index.js",
-    "dev:worker": "npm run build && nodemon dist/worker.js"
+    "dev": "nodemon --watch src --watch tsconfig.json --ext ts --exec \"npm run build && node dist/index.js\"",
+    "dev:worker": "nodemon --watch src --watch tsconfig.json --ext ts --exec \"npm run build && node dist/worker.js\""
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"dev": "npm run build && nodemon dist/index.js",
"dev:worker": "npm run build && nodemon dist/worker.js"
"dev": "nodemon --watch src --watch tsconfig.json --ext ts --exec \"npm run build && node dist/index.js\"",
"dev:worker": "nodemon --watch src --watch tsconfig.json --ext ts --exec \"npm run build && node dist/worker.js\""
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/package.json` around lines 10 - 11, The dev scripts ("dev" and
"dev:worker") only build once then nodemon watches dist/*.js; change them to
watch the TypeScript source and trigger builds on source changes—e.g., update
"dev" to run nodemon with --watch src --ext ts --exec "npm run build && node
dist/index.js" (and similarly update "dev:worker" to exec the worker output), or
replace with a tool like ts-node-dev that restarts on src changes; ensure the
modified scripts reference "dev" and "dev:worker" so editing files under src
triggers rebuild + restart automatically.

Comment on lines 89 to +100
transcodeWorker.on("completed", (job) => {
exec("rm -rf downloads", (error, stdout, stderr) => {
if (error) {
console.error(`exec error: ${error.message}`);
return;
}
if (stderr) {
console.error(`stderr: ${stderr}`);
return;
}
console.log('Successfully cleaned up downloads directory');
})
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

The temp cleanup is racy and misses failed jobs.

server/src/services/transcode.service.ts writes every job into the shared downloads/ root. This fire-and-forget rm -rf downloads can overlap the next job, and nothing removes large artifacts when the job fails.

Safer cleanup pattern
const jobTempDir = path.join(downloadsRoot, fileId);

try {
  // download, transcode, upload, enqueue HLS
} finally {
  await fs.promises.rm(jobTempDir, { recursive: true, force: true });
}

Also applies to: 104-114

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/src/workers/transcode.worker.ts` around lines 89 - 100, The current
cleanup handler in transcodeWorker.on("completed", ...) races by removing the
shared downloads/ root and misses failed jobs; change to per-job temp
directories (e.g., derive jobTempDir from the job id or fileId used in
server/src/services/transcode.service.ts) and ensure removal is done per-job in
an async, awaited finally block so it runs for both success and failure; replace
the fire-and-forget exec("rm -rf downloads") in the transcodeWorker completed
handler (and similar code at the 104-114 region) with an awaited
fs.promises.rm(jobTempDir, { recursive: true, force: true }) (or equivalent safe
removal) and add removal in the job failure handler so each job only deletes its
own temp folder and large artifacts are always cleaned up.

@@ -1 +1 @@
{"root":["./src/app.ts","./src/index.ts","./src/server.ts","./src/config/redis.ts","./src/config/s3.ts","./src/controllers/auth.controller.ts","./src/middleware/auth.middleware.ts","./src/routes/auth.routes.ts","./src/routes/s3.routes.ts","./src/services/auth.service.ts","./src/services/s3.service.ts","./src/services/user.store.ts","./src/utils/generateid.ts","./src/utils/getpresignedurl.ts","./src/utils/jwt.ts","./src/utils/logger.ts","./src/workers/transcode.queue.ts","./src/workers/transcode.worker.ts"],"version":"5.9.3"} No newline at end of file
{"root":["./src/app.ts","./src/index.ts","./src/server.ts","./src/config/redis.ts","./src/config/s3.ts","./src/controllers/auth.controller.ts","./src/middleware/auth.middleware.ts","./src/routes/auth.routes.ts","./src/routes/s3.routes.ts","./src/services/auth.service.ts","./src/services/hls.service.ts","./src/services/s3.service.ts","./src/services/transcode.service.ts","./src/services/user.store.ts","./src/utils/generateid.ts","./src/utils/getpresignedurl.ts","./src/utils/jwt.ts","./src/utils/logger.ts","./src/workers/hls.queue.ts","./src/workers/hls.worker.ts","./src/workers/transcode.queue.ts","./src/workers/transcode.worker.ts"],"version":"5.9.3"} No newline at end of file
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

Consider adding tsconfig.tsbuildinfo to .gitignore.

This file is auto-generated by the TypeScript compiler during incremental builds. Committing it can cause unnecessary merge conflicts and churn. It's typically excluded from version control.

📝 Add to .gitignore
 downloads/
 hlsDownloads/
+*.tsbuildinfo
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@server/tsconfig.tsbuildinfo` at line 1, The tsconfig.tsbuildinfo file is a
generated TypeScript incremental build artifact and should be ignored by VCS;
add "tsconfig.tsbuildinfo" to the repository .gitignore so it is not committed
(or update .gitignore entries to cover *.tsbuildinfo if you prefer), then remove
the tracked file from the index if already committed (e.g., git rm --cached
tsconfig.tsbuildinfo) and commit the updated .gitignore; ensure no code changes
are required in functions or classes—this is purely a VCS ignore/cleanup change.

Comment thread web/index.html
Comment on lines +338 to +340
<button type="button" class="btn" id="logout-btn" style="background: var(--surface-color); color: var(--text-muted); border: 1px solid var(--border-color); margin-top: 1rem;">
Logout
</button>
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick | 🔵 Trivial

Logout button styling uses inline styles.

The button uses inline style attribute while the rest of the page uses CSS classes. Consider adding a .btn-secondary class for consistency and maintainability.

Proposed refactor to use CSS class

Add to the <style> block:

.btn-secondary {
    background: var(--surface-color);
    color: var(--text-muted);
    border: 1px solid var(--border-color);
    margin-top: 1rem;
}

Then update the button:

-        <button type="button" class="btn" id="logout-btn" style="background: var(--surface-color); color: var(--text-muted); border: 1px solid var(--border-color); margin-top: 1rem;">
+        <button type="button" class="btn btn-secondary" id="logout-btn">
             Logout
         </button>
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
<button type="button" class="btn" id="logout-btn" style="background: var(--surface-color); color: var(--text-muted); border: 1px solid var(--border-color); margin-top: 1rem;">
Logout
</button>
<button type="button" class="btn btn-secondary" id="logout-btn">
Logout
</button>
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/index.html` around lines 338 - 340, The logout button uses inline styles
instead of a CSS class; create a .btn-secondary CSS class (matching the inline
rules: background: var(--surface-color); color: var(--text-muted); border: 1px
solid var(--border-color); margin-top: 1rem;) in the page's <style> block and
replace the inline style on the element with that class (keep the existing id
"logout-btn" and base "btn" class) so the button uses ".btn btn-secondary" for
consistent styling and maintainability.

Comment thread web/index.html
Comment on lines 436 to 437
document.cookie = `token=${data.token}; path=/; max-age=3600`;
localStorage.setItem('token', data.token);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Token stored in both localStorage and a non-HttpOnly cookie exposes it to XSS.

Storing the JWT in localStorage and a client-set cookie (without HttpOnly, Secure, or SameSite attributes) means any XSS vulnerability can exfiltrate the token. Consider:

  1. Having the server set the cookie with HttpOnly; Secure; SameSite=Strict via Set-Cookie header
  2. Removing localStorage storage entirely, relying solely on the secure cookie
  3. Or at minimum, add Secure and SameSite=Strict to the client-set cookie
Minimal improvement: Add Secure and SameSite attributes
-                document.cookie = `token=${data.token}; path=/; max-age=3600`;
-                localStorage.setItem('token', data.token);
+                // Note: For production, the server should set HttpOnly cookie instead
+                document.cookie = `token=${data.token}; path=/; max-age=3600; SameSite=Strict; Secure`;
+                localStorage.setItem('token', data.token);
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
document.cookie = `token=${data.token}; path=/; max-age=3600`;
localStorage.setItem('token', data.token);
// Note: For production, the server should set HttpOnly cookie instead
document.cookie = `token=${data.token}; path=/; max-age=3600; SameSite=Strict; Secure`;
localStorage.setItem('token', data.token);
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/index.html` around lines 436 - 437, The page currently writes the JWT to
both document.cookie and localStorage (document.cookie =
`token=${data.token}...` and localStorage.setItem('token', data.token)); stop
exposing the token client-side by removing localStorage.setItem('token', ...)
and stop setting a cookie from JavaScript without HttpOnly. Instead send the
token to the server (or include it in the API response) and have the server set
the cookie via Set-Cookie with HttpOnly; Secure; SameSite=Strict; if you must
keep a client-side fix, at minimum change the document.cookie assignment to
include Secure and SameSite=Strict, but prefer server-side Set-Cookie with
HttpOnly and remove localStorage usage.

Comment thread web/index.html
Comment on lines +596 to +610
// Handle Logout
const logoutBtn = document.getElementById('logout-btn');
if (logoutBtn) {
logoutBtn.addEventListener('click', () => {
document.cookie = 'token=; Max-Age=0; path=/;';
localStorage.removeItem('token');
uploadView.classList.add('hidden');
authView.classList.remove('hidden');
// Clear inputs
emailInput.value = '';
passwordInput.value = '';
hideStatus(authStatus);
hideStatus(uploadStatus);
});
}
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

Client-side logout doesn't invalidate the JWT server-side.

The logout handler only clears local storage and cookies on the client. The JWT remains valid on the server until its natural 1-hour expiration. An attacker who captured the token (e.g., via XSS) can continue using it after the user "logs out."

Consider calling the server's existing /auth/logout endpoint and implementing server-side token revocation (e.g., a Redis-backed blacklist checked by authMiddleware).

Proposed fix to call server logout endpoint
         if (logoutBtn) {
-            logoutBtn.addEventListener('click', () => {
+            logoutBtn.addEventListener('click', async () => {
+                try {
+                    await fetch(`${API_BASE}/auth/logout`, {
+                        method: 'POST',
+                        headers: {
+                            'Authorization': `Bearer ${localStorage.getItem('token') || ''}`
+                        },
+                        credentials: 'include'
+                    });
+                } catch (e) {
+                    console.error('Logout request failed', e);
+                }
                 document.cookie = 'token=; Max-Age=0; path=/;';
                 localStorage.removeItem('token');

Note: Even with this fix, true token invalidation requires the server to maintain a revocation list and check it in authMiddleware.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@web/index.html` around lines 596 - 610, Update the logoutBtn click handler to
call the server logout endpoint before clearing client state: read the JWT from
cookie or localStorage, POST to /auth/logout with the Authorization: Bearer
<token> header (handle network errors and non-2xx responses), then on success
(or after best-effort attempt) clear cookie/localStorage and toggle
uploadView/authView and inputs (emailInput, passwordInput) like today;
additionally ensure the server implements token revocation (e.g., Redis
blacklist) and that authMiddleware checks that blacklist so the JWT is
invalidated server-side.

@vector17002 vector17002 merged commit a2e1447 into main Apr 18, 2026
1 check failed
@vector17002 vector17002 deleted the feature/dockerising-jobs branch April 18, 2026 13:43
@coderabbitai coderabbitai Bot mentioned this pull request Apr 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant