Skip to content

Feature/exponential backoff implementation#3

Merged
vector17002 merged 5 commits intomainfrom
feature/exponential-backoff-implementation
Mar 29, 2026
Merged

Feature/exponential backoff implementation#3
vector17002 merged 5 commits intomainfrom
feature/exponential-backoff-implementation

Conversation

@vector17002
Copy link
Copy Markdown
Owner

@vector17002 vector17002 commented Mar 29, 2026

Notion

Summary by CodeRabbit

  • New Features

    • Added logout functionality to the authentication interface.
    • Enabled video transcoding support with automatic conversion to multiple resolutions (360p, 480p, 720p, 1080p).
    • Introduced HLS streaming capability for optimized video playback and adaptive bitrate delivery.
  • Chores

    • Updated server dependency management and configuration.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Mar 29, 2026

📝 Walkthrough

Walkthrough

This pull request introduces a complete HLS (HTTP Live Streaming) workflow alongside existing video transcoding. New service modules handle HLS download, segmentation, and S3 upload operations. A BullMQ queue and worker process HLS jobs asynchronously. The transcode worker now enqueues HLS jobs after completing transcodes. Frontend logout functionality added with token cleanup.

Changes

Cohort / File(s) Summary
HLS Service Layer
server/src/services/hls.service.ts
New HLS service implementing presigned URL retrieval, MP4 download, HLS segmentation via fluent-ffmpeg, and S3 upload of playlists and TS segments with progress logging.
Transcode Service Layer
server/src/services/transcode.service.ts
New transcode service providing presigned URL fetch, S3 object download, concurrent FFmpeg transcode to 1080p/720p/480p/360p, and S3 re-upload of transcoded files.
HLS Queue & Worker
server/src/workers/hls.queue.ts, server/src/workers/hls.worker.ts
New BullMQ queue for HLS jobs with exponential backoff retry (5 attempts, 5s initial delay). Worker processes multi-bitrate downloads, segmentation, and S3 uploads with cleanup on completion/failure.
Transcode Queue & Worker Updates
server/src/workers/transcode.queue.ts, server/src/workers/transcode.worker.ts
Transcode queue gains retry/backoff config (5 attempts, 3s initial delay). Worker replaced with real pipeline: download → transcode → upload → enqueue HLS job, with exponential backoff error handling and local cleanup.
App Initialization
server/src/app.ts, server/src/index.ts
Added HLS worker registration and logger utility import at startup.
Dependencies & Build
server/package.json, server/tsconfig.tsbuildinfo
Moved TypeScript type packages to devDependencies, added fluent-ffmpeg library. Updated build metadata to reflect new source entrypoints.
Frontend Auth
web/index.html
Added Logout button with client-side handler to clear token cookie/localStorage, reset UI state, and switch from upload to auth view.
Git & Logs
.gitignore, server/logs/log.txt
Added downloads/ and hlsDownloads/ to gitignore. New log file documenting end-to-end transcode and HLS workflows including retry/backoff behavior and error cases.

Sequence Diagram(s)

sequenceDiagram
    actor User
    participant Client as Web Client
    participant TranscodeWorker as Transcode<br/>Worker
    participant S3 as S3 Storage
    participant FFmpeg as FFmpeg
    participant HLSWorker as HLS Worker
    participant Redis as Redis Queue

    User->>Client: Upload video
    Client->>TranscodeWorker: Enqueue transcode job
    TranscodeWorker->>S3: Get presigned URL
    S3-->>TranscodeWorker: URL
    TranscodeWorker->>S3: Download source video
    S3-->>TranscodeWorker: Video data
    TranscodeWorker->>FFmpeg: Transcode to 4 resolutions<br/>(1080p/720p/480p/360p)
    FFmpeg-->>TranscodeWorker: Transcoded files
    TranscodeWorker->>S3: Upload 4 resolutions
    S3-->>TranscodeWorker: Uploaded ✓
    TranscodeWorker->>Redis: Enqueue HLS job
    Redis-->>HLSWorker: HLS job available
    HLSWorker->>S3: Get presigned URLs<br/>(per bitrate)
    S3-->>HLSWorker: URLs
    HLSWorker->>S3: Download bitrate MP4s
    S3-->>HLSWorker: MP4 data
    HLSWorker->>FFmpeg: Segment to HLS<br/>(copy, no re-encode)
    FFmpeg-->>HLSWorker: Playlist + TS segments
    HLSWorker->>S3: Upload playlist<br/>+ TS segments
    S3-->>HLSWorker: Uploaded ✓
    HLSWorker-->>User: HLS content ready
    User->>Client: Click Logout
    Client->>Client: Clear token<br/>from storage
    Client->>Client: Show auth view
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~45 minutes

Poem

🐰 A hoppy refactor, from start to the end,
Transcode and segment, our video friend!
With queues and workers, all in a flow,
And HLS streams ready to go! 📹✨
One logout button to say our goodbyes,
Build it with pride, before our eyes! 🌟

🚥 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 PR title "Feature/exponential backoff implementation" directly aligns with the core change: exponential backoff retry logic added to transcoding and HLS job processing.
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 docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feature/exponential-backoff-implementation

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: 16

🤖 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/logs/log.txt`:
- Around line 1-684: Remove the checked-in runtime log (log.txt) that contains
absolute paths, raw buffers (e.g. "<Buffer ff d8 ff e0 ...>"), internal IDs and
stack traces; delete it from the repo and history (git rm --cached log.txt then
add log.txt to .gitignore, and purge past commits with git filter-repo or BFG),
replace with a small sanitized excerpt if you need an example (no absolute
paths, buffers, or real IDs), and add a pre-commit rule/CI check to prevent
committing generated logs.

In `@server/package.json`:
- Around line 30-40: The devDependencies in package.json include deprecated
external type packages that conflict with the libraries' built-in TypeScript
definitions; remove the entries "@types/axios", "@types/dotenv", and
"@types/ioredis" from the "devDependencies" section so package.json only
references the actual packages (leave other `@types` entries intact) and then run
install to update lockfile.

In `@server/src/services/hls.service.ts`:
- Around line 120-137: The fs.createReadStream used when building the
PutObjectCommand can emit async errors (e.g., ENOENT) that are currently
unhandled; modify the upload loop (the Promise.all over files in the function
that constructs PutObjectCommand and calls s3Client.send) to attach an 'error'
listener to the stream before passing it to Body and wrap the s3Client.send call
in try/catch so stream/open errors and S3 errors are caught; specifically,
create the stream variable from fs.createReadStream(filePath), add
stream.on('error', err => { /* log and reject/handle per-file failure */ }),
then use that stream for Body in the PutObjectCommand and handle failures by
logging and not letting uncaught exceptions propagate (and ensure uploadedKeys
is only pushed on success).
- Around line 47-65: downloadObjectFromPreSignedUrlWithBitrate currently
downloads the whole MP4 into memory using axios with responseType 'arraybuffer';
change it to stream the response to disk and add a request timeout to avoid
holding multiple full files in RAM and prevent stalls. Use axios with
responseType: 'stream' (or AbortController) and a timeout value, create a write
stream to localFilePath, pipe response.data into fs.createWriteStream, await the
stream 'finish' event and handle 'error' to cleanup the partial file; also check
response.status (or reject non-2xx) before piping and log/throw using job.id on
failures so Promise.all callers won’t hang indefinitely.

In `@server/src/services/transcode.service.ts`:
- Around line 27-45: The download currently buffers the entire video in memory
in downloadObjectFromPreSignedUrl (axios responseType 'arraybuffer') and later
the transcoded outputs are read via fs.readFileSync and uploaded concurrently,
risking OOM; change the download to use axios responseType: 'stream' and pipe
the response.data to fs.createWriteStream(localFilePath) to write directly to
disk, then for uploading replace fs.readFileSync usage with
fs.createReadStream(filePath) and pass that stream as the S3 upload Body, and
avoid unbounded Promise.all by uploading sequentially or with a bounded
concurrency loop (e.g., for..of or a small worker pool) when handling the
transcoded outputs.

In `@server/src/workers/hls.queue.ts`:
- Around line 4-15: The hlsQueue uses an unsafe cast "redis as any" and a
different initial backoff delay (5000ms) than transcodeQueue (3000ms); replace
the any-cast with the proper BullMQ connection type or explicitly wrap/convert
the ioredis client to BullMQ's ConnectionOptions (referencing the Queue
constructor and the hlsQueue variable and its defaultJobOptions.backoff), or at
minimum add a clear inline comment documenting why the cast is necessary; also
either align the backoff.delay with transcodeQueue or add a comment on hlsQueue
explaining the intentional 5000ms choice to make the difference explicit.

In `@server/src/workers/hls.worker.ts`:
- Around line 29-45: The current cleanup runs in the worker-level
hlsWorker.on("completed") hook and removes the shared hlsDownloads root
asynchronously, causing race conditions and leaving failed jobs uncleaned;
instead, move the deletion into the per-job processor (the function that
receives job and fileId) and wrap the job logic in a try...finally so cleanup
always runs. Specifically, inside the job handler where you use Promise.all to
download/encode into hlsDownloads/<fileId>/<bitrate>/, add a finally block that
synchronously (or via awaited exec) deletes only the hlsDownloads/<fileId>
directory (use the fileId variable from the job payload), remove the global
hlsWorker.on("completed") rm -rf hlsDownloads call, and ensure the same finally
runs for both success and error paths so failed/retried jobs do not leave
orphaned files.

In `@server/src/workers/transcode.queue.ts`:
- Around line 6-14: The queue-level backoff in defaultJobOptions is being
overridden by the worker's custom backoffStrategy, causing confusion; pick one
approach and update the code accordingly: either remove the backoff block from
defaultJobOptions (keeping attempts/removeOnComplete/removeOnFail) so
transcode.worker.ts's backoffStrategy is the single source of retry logic, or
remove the backoffStrategy implementation in transcode.worker.ts and keep the
queue-level backoff in defaultJobOptions; reference defaultJobOptions and the
backoffStrategy in transcode.worker.ts to locate and modify the appropriate
config.

In `@server/src/workers/transcode.worker.ts`:
- Around line 12-54: Remove the large commented-out debug/test scaffold inside
the transcodeWorker function (references: transcodeWorker, SIMULATE_FAILURE,
FAIL_UNTIL_ATTEMPT, BASE_DELAY, jobTimestamps) — delete the entire 40+ line
block of commented code and any unused commented constants; if you need to
preserve these tests, move them to a dedicated test utility or documentation
(e.g., a README or a separate test file) rather than leaving them commented in
transcode.worker.ts.
- Around line 76-86: The custom backoffStrategy in the settings object
duplicates the queue-level exponential backoff configured in transcode.queue.ts;
remove the entire settings.backoffStrategy block (the function referencing
BASE_DELAY and console.log) so the worker relies on the queue's
defaultJobOptions.backoff, or if you must keep it for logging, replace the heavy
logic with a thin wrapper that delegates to the queue-level backoff
configuration and only emits logs (i.e., do not duplicate the exponential
formula in transcode.worker.ts; reference BASE_DELAY and
defaultJobOptions.backoff in transcode.queue.ts instead).
- Line 1: The import list in transcode.worker.ts includes an unused symbol
tryCatch; remove tryCatch from the import statement (leave Worker and type Job)
so the line imports only the symbols actually used and eliminates the unused
import warning.
- Around line 56-61: The code currently returns early when
getPreSignedUrlForDownload(fileId, userId) yields no URL, which silently marks
the job successful and prevents retries; update the transcode.worker.ts flow to
throw an Error (including job.id and fileId in the message) instead of returning
so the job framework can detect failure and retry, i.e., replace the early
return after checking videoDownloadSignedUrl with a thrown error (or rethrow a
descriptive error) in the same block where getPreSignedUrlForDownload is called.
- Around line 89-101: The current transcodeWorker.on("completed", (job) => { ...
}) handler unsafely runs exec("rm -rf downloads") — replace this with a safe,
job-scoped cleanup: compute the absolute path for the job's output (e.g., derive
from job.id or job.data.outputDir), verify the path is inside your expected base
workspace, and delete only that directory atomically (use fs.rm or a library
with recursive option and proper error/lock handling) instead of a global rm
-rf; ensure the removal is awaited and errors are handled so one job's cleanup
cannot affect other concurrent jobs and the job completion flow accounts for
cleanup failures.
- Around line 9-10: The two ESM compatibility variables __filename and __dirname
are declared but never used; delete the const __filename =
fileURLToPath(import.meta.url); and const __dirname = path.dirname(__filename);
declarations and also remove the now-unused imports (e.g., fileURLToPath and/or
path) from the module top if they are only present to support those variables so
no unused imports remain.

In `@web/index.html`:
- Around line 338-340: The inline styles on the logout button should be moved
into a CSS class for consistency and maintainability: create a class (e.g.,
.btn-secondary) with the styles background: var(--surface-color); color:
var(--text-muted); border: 1px solid var(--border-color); margin-top: 1rem; then
remove the inline style attribute from the element with id "logout-btn" and add
the new class alongside the existing "btn" class so the button becomes
class="btn btn-secondary" while preserving its id.
- Around line 596-610: Modify the logoutBtn click handler to call the server
logout endpoint before clearing UI/storage: in the event listener attached to
logoutBtn (the anonymous function where you currently clear document.cookie,
localStorage, and toggle uploadView/authView), send a fetch to '/auth/logout'
(POST or the server's expected method) with credentials: 'include' so the
HttpOnly cookie is cleared server-side; await the response (or handle non-OK
responses) and only then remove client-side token
(localStorage.removeItem('token')), clear inputs
(emailInput.value/passwordInput.value), hide statuses
(hideStatus(authStatus)/hideStatus(uploadStatus)), and toggle views. Ensure
errors from the fetch are caught and logged so logout still falls back to
clearing UI if the call fails.
🪄 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: d919d3da-1c54-4c1a-a40b-0ef25bc3f6a9

📥 Commits

Reviewing files that changed from the base of the PR and between 385aa03 and 17a8ec0.

⛔ Files ignored due to path filters (1)
  • server/package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (13)
  • .gitignore
  • 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/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/logs/log.txt
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

Remove the checked-in runtime log from the PR.

This file leaks absolute local paths, raw buffer output, internal user/object identifiers, and failure traces into source control. Generated logs should stay out of the repo; keep only sanitized excerpts in docs/tests if you need an example.

🤖 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, Remove the checked-in runtime log
(log.txt) that contains absolute paths, raw buffers (e.g. "<Buffer ff d8 ff e0
...>"), internal IDs and stack traces; delete it from the repo and history (git
rm --cached log.txt then add log.txt to .gitignore, and purge past commits with
git filter-repo or BFG), replace with a small sanitized excerpt if you need an
example (no absolute paths, buffers, or real IDs), and add a pre-commit rule/CI
check to prevent committing generated logs.

Comment thread server/package.json
Comment on lines 30 to 40
"devDependencies": {
"@types/fluent-ffmpeg": "^2.1.28",
"@types/axios": "^0.9.36",
"@types/bcrypt": "^6.0.0",
"@types/body-parser": "^1.19.6",
"@types/cors": "^2.8.19",
"@types/dotenv": "^6.1.1",
"@types/express": "^5.0.6",
"@types/ioredis": "^4.28.10",
"@types/jsonwebtoken": "^9.0.10",
"nodemon": "^3.1.14"
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:

#!/bin/bash
# Verify that these packages have built-in types by checking their package.json for "types" field

echo "Checking axios types..."
curl -s https://registry.npmjs.org/axios/latest | jq '.types // .typings // "No types field"'

echo "Checking dotenv types..."
curl -s https://registry.npmjs.org/dotenv/latest | jq '.types // .typings // "No types field"'

echo "Checking ioredis types..."
curl -s https://registry.npmjs.org/ioredis/latest | jq '.types // .typings // "No types field"'

Repository: vector17002/video-transcoding

Length of output: 197


Remove deprecated @types packages.

The following @types packages are unnecessary because the libraries now include their own TypeScript definitions:

  • @types/axios — Axios has built-in types
  • @types/dotenv — Dotenv has built-in types
  • @types/ioredis — ioredis has built-in types

Remove them to avoid potential type conflicts.

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

In `@server/package.json` around lines 30 - 40, The devDependencies in
package.json include deprecated external type packages that conflict with the
libraries' built-in TypeScript definitions; remove the entries "@types/axios",
"@types/dotenv", and "@types/ioredis" from the "devDependencies" section so
package.json only references the actual packages (leave other `@types` entries
intact) and then run install to update lockfile.

Comment on lines +47 to +65
export const downloadObjectFromPreSignedUrlWithBitrate = async (videoDownloadSignedUrl: string, fileId: string, job: Job, bitrate: string) => {
// Download the video as a buffer
const response = await axios.get(videoDownloadSignedUrl, { responseType: 'arraybuffer' });

if (response.status !== 200)
console.log(`Video download failed for hls job id ${job.id}`)

const videoBuffer = response.data;

// Ensure downloads directory exists (hlsDownloads/{fileId}/{bitrate})
const downloadsDir = path.join(__dirname, '..', '..', 'hlsDownloads', fileId);
if (!fs.existsSync(downloadsDir)) {
fs.mkdirSync(downloadsDir, { recursive: true });
}

// Save the buffer to the local repository
const localFilePath = path.join(downloadsDir, `${bitrate}.mp4`);
fs.writeFileSync(localFilePath, videoBuffer);
console.log(`✅ Video downloaded successfully to ${localFilePath} for hls job ${job.id}`);
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:

# First, locate and check the hls service file
find . -type f -name "hls.service.ts" | head -5

Repository: vector17002/video-transcoding

Length of output: 109


🏁 Script executed:

# Check the hls worker file
find . -type f -name "hls.worker.ts" | head -5

Repository: vector17002/video-transcoding

Length of output: 107


🏁 Script executed:

# Get line count to understand file size
wc -l server/src/services/hls.service.ts server/src/workers/hls.worker.ts 2>/dev/null || echo "Files not found in expected location"

Repository: vector17002/video-transcoding

Length of output: 161


🏁 Script executed:

# Read the hls.service.ts file with line numbers
cat -n server/src/services/hls.service.ts

Repository: vector17002/video-transcoding

Length of output: 6487


🏁 Script executed:

# Read the hls.worker.ts file with line numbers
cat -n server/src/workers/hls.worker.ts

Repository: vector17002/video-transcoding

Length of output: 2231


🏁 Script executed:

# Check for any other calls to downloadObjectFromPreSignedUrlWithBitrate
rg "downloadObjectFromPreSignedUrlWithBitrate" --type ts

Repository: vector17002/video-transcoding

Length of output: 587


🏁 Script executed:

# Check if there are any timeout configurations elsewhere in the codebase
rg "timeout" server/src --type ts -i

Repository: vector17002/video-transcoding

Length of output: 55


Switch HLS bitrate downloads to streaming with an explicit timeout.

server/src/workers/hls.worker.ts line 12 starts all four bitrate downloads concurrently via Promise.all(). Combined with the arraybuffer response type on server/src/services/hls.service.ts line 49, this holds all four full MP4 renditions (1080p, 720p, 480p, 360p) in RAM simultaneously before they are written to disk. Replace the buffer-based download with a streaming approach using axios piped to a file write stream, and add a download timeout to prevent stalled transfers from consuming resources indefinitely.

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

In `@server/src/services/hls.service.ts` around lines 47 - 65,
downloadObjectFromPreSignedUrlWithBitrate currently downloads the whole MP4 into
memory using axios with responseType 'arraybuffer'; change it to stream the
response to disk and add a request timeout to avoid holding multiple full files
in RAM and prevent stalls. Use axios with responseType: 'stream' (or
AbortController) and a timeout value, create a write stream to localFilePath,
pipe response.data into fs.createWriteStream, await the stream 'finish' event
and handle 'error' to cleanup the partial file; also check response.status (or
reject non-2xx) before piping and log/throw using job.id on failures so
Promise.all callers won’t hang indefinitely.

Comment on lines +120 to +137
await Promise.all(files.map(async (fileName) => {
const filePath = path.join(segmentDir, fileName);
const s3Key = `${s3BaseKey}/${fileName}`;
const contentType = fileName.endsWith('.m3u8')
? 'application/x-mpegURL'
: 'video/MP2T'; // .ts segments

const command = new PutObjectCommand({
Bucket: bucket,
Key: s3Key,
Body: fs.createReadStream(filePath),
ContentType: contentType,
});

await s3Client.send(command);
console.log(`☁️ Uploaded ${fileName} to S3: ${s3Key}`);
uploadedKeys.push(s3Key);
}));
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:

# First, let's check if the file exists and examine the code at lines 120-137
cat -n server/src/services/hls.service.ts | sed -n '115,145p'

Repository: vector17002/video-transcoding

Length of output: 1235


🏁 Script executed:

# Check if the log file exists and examine lines 263-289
if [ -f "server/logs/log.txt" ]; then
  cat -n server/logs/log.txt | sed -n '260,295p'
else
  echo "Log file not found at server/logs/log.txt"
fi

Repository: vector17002/video-transcoding

Length of output: 5543


🏁 Script executed:

# Let's also check the surrounding context to understand error handling
cat -n server/src/services/hls.service.ts | sed -n '100,160p'

Repository: vector17002/video-transcoding

Length of output: 1945


Add error handling to the ReadStream before passing it to S3.

The fs.createReadStream() call at line 130 does not have an error listener, so file-open errors (e.g., ENOENT) are emitted asynchronously as uncaught exceptions. The logs show this occurs repeatedly during HLS uploads: lines 263–289 in server/logs/log.txt contain multiple UNCAUGHT EXCEPTION: ENOENT errors logged immediately after the "Uploading segmented files to S3" message, confirming the stream failures escape unhandled. Attach an error listener to the stream or wrap the s3Client.send() call in a try-catch block.

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

In `@server/src/services/hls.service.ts` around lines 120 - 137, The
fs.createReadStream used when building the PutObjectCommand can emit async
errors (e.g., ENOENT) that are currently unhandled; modify the upload loop (the
Promise.all over files in the function that constructs PutObjectCommand and
calls s3Client.send) to attach an 'error' listener to the stream before passing
it to Body and wrap the s3Client.send call in try/catch so stream/open errors
and S3 errors are caught; specifically, create the stream variable from
fs.createReadStream(filePath), add stream.on('error', err => { /* log and
reject/handle per-file failure */ }), then use that stream for Body in the
PutObjectCommand and handle failures by logging and not letting uncaught
exceptions propagate (and ensure uploadedKeys is only pushed on success).

Comment on lines +27 to +45
export const downloadObjectFromPreSignedUrl = async (videoDownloadSignedUrl: string, fileId: string, job: Job) => {
// Download the video as a buffer
const response = await axios.get(videoDownloadSignedUrl, { responseType: 'arraybuffer' });

if (response.status !== 200)
console.log(`Video download failed for transcode job id ${job.id}`)

const videoBuffer = response.data;

// Ensure downloads directory exists
const downloadsDir = path.join(__dirname, '..', '..', 'downloads');
if (!fs.existsSync(downloadsDir)) {
fs.mkdirSync(downloadsDir, { recursive: true });
}

// Save the buffer to the local repository
const localFilePath = path.join(downloadsDir, fileId);
fs.writeFileSync(localFilePath, videoBuffer);
console.log(`✅ Video downloaded successfully to ${localFilePath} for transcode job ${job.id}`);
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/src/services && wc -l transcode.service.ts

Repository: vector17002/video-transcoding

Length of output: 97


🏁 Script executed:

cd server/src/services && sed -n '27,45p' transcode.service.ts && echo "---SEPARATOR---" && sed -n '95,115p' transcode.service.ts

Repository: vector17002/video-transcoding

Length of output: 1753


Eliminate full-file buffering on video download and transcoded output uploads.

Lines 29–44 buffer the entire source video in memory with arraybuffer, and lines 100–110 read every transcoded output into memory before uploading. Launching all uploads concurrently via Promise.all stacks these buffers, risking memory exhaustion on typical video sizes. Stream the download directly to disk using axios with responseType: 'stream' (piped to fs.createWriteStream), and stream each upload to S3 using the Body parameter as a file stream instead of buffering with readFileSync.

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

In `@server/src/services/transcode.service.ts` around lines 27 - 45, The download
currently buffers the entire video in memory in downloadObjectFromPreSignedUrl
(axios responseType 'arraybuffer') and later the transcoded outputs are read via
fs.readFileSync and uploaded concurrently, risking OOM; change the download to
use axios responseType: 'stream' and pipe the response.data to
fs.createWriteStream(localFilePath) to write directly to disk, then for
uploading replace fs.readFileSync usage with fs.createReadStream(filePath) and
pass that stream as the S3 upload Body, and avoid unbounded Promise.all by
uploading sequentially or with a bounded concurrency loop (e.g., for..of or a
small worker pool) when handling the transcoded outputs.

Comment on lines +56 to +61
const videoDownloadSignedUrl = await getPreSignedUrlForDownload(fileId, userId);

if (!videoDownloadSignedUrl) {
console.log(`❌ Presigned url failed for job ${job.id}.`);
return;
}
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

Silent failure prevents retry - throw an error instead of returning.

When the presigned URL fails, returning early marks the job as completed successfully, preventing any retry attempts. This defeats the exponential backoff mechanism.

🐛 Proposed fix
     const videoDownloadSignedUrl = await getPreSignedUrlForDownload(fileId, userId);
 
     if (!videoDownloadSignedUrl) {
-        console.log(`❌ Presigned url failed for job ${job.id}.`);
-        return;
+        throw new Error(`Failed to get presigned URL for fileId: ${fileId}`);
     }
📝 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
const videoDownloadSignedUrl = await getPreSignedUrlForDownload(fileId, userId);
if (!videoDownloadSignedUrl) {
console.log(`❌ Presigned url failed for job ${job.id}.`);
return;
}
const videoDownloadSignedUrl = await getPreSignedUrlForDownload(fileId, userId);
if (!videoDownloadSignedUrl) {
throw new Error(`Failed to get presigned URL for fileId: ${fileId}`);
}
🤖 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 56 - 61, The code
currently returns early when getPreSignedUrlForDownload(fileId, userId) yields
no URL, which silently marks the job successful and prevents retries; update the
transcode.worker.ts flow to throw an Error (including job.id and fileId in the
message) instead of returning so the job framework can detect failure and retry,
i.e., replace the early return after checking videoDownloadSignedUrl with a
thrown error (or rethrow a descriptive error) in the same block where
getPreSignedUrlForDownload is called.

Comment on lines +76 to +86
settings: {
backoffStrategy: (attemptsMade: number, type?: string) => {
if (type === 'exponential') {
const delay = Math.round(Math.pow(2, attemptsMade - 1) * BASE_DELAY);
console.log(`\n🔧 Backoff strategy called: attemptsMade=${attemptsMade}, type=${type}`);
console.log(` 📐 Formula: 2^(${attemptsMade}-1) × ${BASE_DELAY}ms = ${delay}ms (${(delay / 1000).toFixed(1)}s)`);
return delay;
}
return BASE_DELAY;
},
},
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

Custom backoffStrategy duplicates queue-level configuration.

The backoff logic here works correctly, but the same exponential backoff is already configured at the queue level in transcode.queue.ts.

If you need custom logging during backoff calculation, keep this. Otherwise, remove it and rely on the queue's defaultJobOptions.backoff configuration for simpler maintenance.

🤖 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 76 - 86, The custom
backoffStrategy in the settings object duplicates the queue-level exponential
backoff configured in transcode.queue.ts; remove the entire
settings.backoffStrategy block (the function referencing BASE_DELAY and
console.log) so the worker relies on the queue's defaultJobOptions.backoff, or
if you must keep it for logging, replace the heavy logic with a thin wrapper
that delegates to the queue-level backoff configuration and only emits logs
(i.e., do not duplicate the exponential formula in transcode.worker.ts;
reference BASE_DELAY and defaultJobOptions.backoff in transcode.queue.ts
instead).

Comment on lines 89 to 101
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');
})
console.log(`Job ${job.id} has completed successfully!`);
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

Unsafe cleanup with rm -rf on relative path risks deleting wrong directory or race conditions.

Using exec("rm -rf downloads") has several issues:

  1. Race condition: If multiple transcode jobs run concurrently, one job's cleanup could delete files another job is still processing.
  2. Relative path risk: If the process's working directory changes unexpectedly, this could delete unintended files.
  3. No error handling impact: Errors are logged but the job is already marked complete.

Consider cleaning up only the specific job's files, or use an absolute path.

🛡️ Proposed fix - clean up job-specific files only
+import fs from "fs/promises";
+
 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');
-    })
+    const jobDownloadDir = path.join(__dirname, '..', '..', 'downloads', job.data.fileId);
+    fs.rm(jobDownloadDir, { recursive: true, force: true })
+        .then(() => console.log(`Cleaned up downloads for job ${job.id}`))
+        .catch((err) => console.error(`Failed to clean up ${jobDownloadDir}: ${err.message}`));
     console.log(`Job ${job.id} has completed successfully!`);
 });
🤖 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 - 101, The current
transcodeWorker.on("completed", (job) => { ... }) handler unsafely runs exec("rm
-rf downloads") — replace this with a safe, job-scoped cleanup: compute the
absolute path for the job's output (e.g., derive from job.id or
job.data.outputDir), verify the path is inside your expected base workspace, and
delete only that directory atomically (use fs.rm or a library with recursive
option and proper error/lock handling) instead of a global rm -rf; ensure the
removal is awaited and errors are handled so one job's cleanup cannot affect
other concurrent jobs and the job completion flow accounts for cleanup failures.

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

Consider extracting inline styles to a CSS class.

The logout button uses inline styles that could be moved to a dedicated CSS class (e.g., .btn-secondary) for consistency with the rest of the stylesheet and easier maintenance.

Proposed refactor

Add to CSS:

.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>
🤖 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 inline styles on the logout
button should be moved into a CSS class for consistency and maintainability:
create a class (e.g., .btn-secondary) with the styles background:
var(--surface-color); color: var(--text-muted); border: 1px solid
var(--border-color); margin-top: 1rem; then remove the inline style attribute
from the element with id "logout-btn" and add the new class alongside the
existing "btn" class so the button becomes class="btn btn-secondary" while
preserving its id.

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 | 🟡 Minor

Client-side logout should also call the server's /auth/logout endpoint.

The current implementation only clears tokens client-side. Per the server middleware in server/src/middleware/auth.middleware.ts, tokens are read from both the Authorization header and cookies. The server has a /auth/logout endpoint that clears the server-side cookie, but it's not being called here.

While this works for basic logout UX, calling the server endpoint ensures:

  1. The HttpOnly cookie (if any) is cleared server-side
  2. Consistent logout behavior across the system
Proposed fix to call server logout
         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('Server logout failed', e);
+                }
                 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);
             });
         }

Note: For stronger security guarantees, consider implementing server-side token blacklisting (e.g., via Redis) to invalidate tokens immediately upon logout, preventing replay attacks with captured tokens until their natural JWT expiration.

📝 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
// 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);
});
}
// Handle Logout
const logoutBtn = document.getElementById('logout-btn');
if (logoutBtn) {
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('Server logout failed', e);
}
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);
});
}
🤖 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, Modify the logoutBtn click handler to
call the server logout endpoint before clearing UI/storage: in the event
listener attached to logoutBtn (the anonymous function where you currently clear
document.cookie, localStorage, and toggle uploadView/authView), send a fetch to
'/auth/logout' (POST or the server's expected method) with credentials:
'include' so the HttpOnly cookie is cleared server-side; await the response (or
handle non-OK responses) and only then remove client-side token
(localStorage.removeItem('token')), clear inputs
(emailInput.value/passwordInput.value), hide statuses
(hideStatus(authStatus)/hideStatus(uploadStatus)), and toggle views. Ensure
errors from the fetch are caught and logged so logout still falls back to
clearing UI if the call fails.

Copy link
Copy Markdown
Owner Author

@vector17002 vector17002 left a comment

Choose a reason for hiding this comment

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

LGTM

@vector17002 vector17002 merged commit a876666 into main Mar 29, 2026
1 check passed
@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