feat: add no show setting in cal video#24351
feat: add no show setting in cal video#24351dhairyashiil wants to merge 26 commits intocalcom:mainfrom
Conversation
|
@dhairyashiil is attempting to deploy a commit to the cal Team on Vercel. A member of the Team first needs to authorize it. |
WalkthroughAdds two Cal Video boolean flags (enableAutomaticNoShowTrackingForHosts, enableAutomaticNoShowTrackingForGuests) across DB, Prisma schema, migrations (including a backfill), types, and UI. getEventTypesFromDB now selects calVideoSettings; booking flows (handleNewBooking, handleConfirmation) normalize and propagate calVideoSettings and pass it into scheduleNoShowTriggers, which gains a calVideoSettings parameter and conditionally schedules host/guest no-show webhooks. CalVideoSettings UI accepts eventTypeId, queries existing webhooks, and conditionally renders the two toggles. Two localization keys were added. Possibly related PRs
Pre-merge checks and finishing touches❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing touches
🧪 Generate unit tests (beta)
📜 Recent review detailsConfiguration used: Path: .coderabbit.yaml Review profile: CHILL Plan: Pro Disabled knowledge base sources:
📒 Files selected for processing (4)
🚧 Files skipped from review as they are similar to previous changes (3)
🧰 Additional context used📓 Path-based instructions (3)**/*.ts📄 CodeRabbit inference engine (.cursor/rules/review.mdc)
Files:
**/*.{ts,tsx}📄 CodeRabbit inference engine (.cursor/rules/review.mdc)
Files:
**/*.{ts,tsx,js,jsx}⚙️ CodeRabbit configuration file
Files:
🧠 Learnings (1)📚 Learning: 2025-08-27T13:32:46.887ZApplied to files:
🧬 Code graph analysis (1)packages/features/bookings/lib/handleNewBooking.ts (2)
🔇 Additional comments (1)
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. Comment |
There was a problem hiding this comment.
Actionable comments posted: 4
🧹 Nitpick comments (1)
packages/features/bookings/lib/handleNewBooking.ts (1)
2398-2411: Avoid duplicating the normalization logic.Multiple
hasCalVideoSettingschecks plus manual casts make this path harder to follow. Once you normalizeeventTypeForProcessing, prefer to reuse it (or mutate the original eventType) so you don't need repeated guards and casts; it keeps no‑show scheduling and any future consumers aligned.
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Disabled knowledge base sources:
- Linear integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
⛔ Files ignored due to path filters (1)
yarn.lockis excluded by!**/yarn.lock,!**/*.lock
📒 Files selected for processing (10)
apps/web/public/static/locales/en/common.json(1 hunks)packages/features/bookings/lib/handleConfirmation.ts(2 hunks)packages/features/bookings/lib/handleNewBooking.ts(5 hunks)packages/features/bookings/lib/handleNewBooking/getEventTypesFromDB.ts(1 hunks)packages/features/bookings/lib/handleNewBooking/scheduleNoShowTriggers.ts(6 hunks)packages/features/eventtypes/components/locations/CalVideoSettings.tsx(3 hunks)packages/features/eventtypes/components/locations/Locations.tsx(4 hunks)packages/features/eventtypes/lib/types.ts(2 hunks)packages/prisma/migrations/20251008092040_add_no_show_config_in_calvideosettings/migration.sql(1 hunks)packages/prisma/schema.prisma(1 hunks)
🧰 Additional context used
📓 Path-based instructions (4)
**/*.ts
📄 CodeRabbit inference engine (.cursor/rules/review.mdc)
**/*.ts: For Prisma queries, only select data you need; never useinclude, always useselect
Ensure thecredential.keyfield is never returned from tRPC endpoints or APIs
Files:
packages/features/eventtypes/lib/types.tspackages/features/bookings/lib/handleConfirmation.tspackages/features/bookings/lib/handleNewBooking.tspackages/features/bookings/lib/handleNewBooking/scheduleNoShowTriggers.tspackages/features/bookings/lib/handleNewBooking/getEventTypesFromDB.ts
**/*.{ts,tsx}
📄 CodeRabbit inference engine (.cursor/rules/review.mdc)
Flag excessive Day.js use in performance-critical code; prefer native Date or Day.js
.utc()in hot paths like loops
Files:
packages/features/eventtypes/lib/types.tspackages/features/bookings/lib/handleConfirmation.tspackages/features/bookings/lib/handleNewBooking.tspackages/features/bookings/lib/handleNewBooking/scheduleNoShowTriggers.tspackages/features/bookings/lib/handleNewBooking/getEventTypesFromDB.tspackages/features/eventtypes/components/locations/Locations.tsxpackages/features/eventtypes/components/locations/CalVideoSettings.tsx
**/*.{ts,tsx,js,jsx}
⚙️ CodeRabbit configuration file
Flag default exports and encourage named exports. Named exports provide better tree-shaking, easier refactoring, and clearer imports. Exempt main components like pages, layouts, and components that serve as the primary export of a module.
Files:
packages/features/eventtypes/lib/types.tspackages/features/bookings/lib/handleConfirmation.tspackages/features/bookings/lib/handleNewBooking.tspackages/features/bookings/lib/handleNewBooking/scheduleNoShowTriggers.tspackages/features/bookings/lib/handleNewBooking/getEventTypesFromDB.tspackages/features/eventtypes/components/locations/Locations.tsxpackages/features/eventtypes/components/locations/CalVideoSettings.tsx
**/*.tsx
📄 CodeRabbit inference engine (.cursor/rules/review.mdc)
Always use
t()for text localization in frontend code; direct text embedding should trigger a warning
Files:
packages/features/eventtypes/components/locations/Locations.tsxpackages/features/eventtypes/components/locations/CalVideoSettings.tsx
🧠 Learnings (4)
📚 Learning: 2025-08-27T13:32:46.887Z
Learnt from: supalarry
PR: calcom/cal.com#23364
File: apps/api/v2/src/ee/event-types/event-types_2024_06_14/transformers/internal-to-api/internal-to-api.spec.ts:295-296
Timestamp: 2025-08-27T13:32:46.887Z
Learning: In calcom/cal.com, when transforming booking fields from internal to API format, tests in organizations-event-types.e2e-spec.ts already expect name field label and placeholder to be empty strings ("") rather than undefined. PR changes that set these to explicit empty strings are typically fixing implementation to match existing test expectations rather than breaking changes.
Applied to files:
packages/features/bookings/lib/handleNewBooking.ts
📚 Learning: 2025-08-21T13:44:06.805Z
Learnt from: supalarry
PR: calcom/cal.com#23217
File: apps/api/v2/src/ee/event-types/event-types_2024_06_14/services/output-event-types.service.ts:93-94
Timestamp: 2025-08-21T13:44:06.805Z
Learning: In apps/api/v2/src/ee/event-types/event-types_2024_06_14/event-types.repository.ts, repository functions that use explicit Prisma select clauses (like getEventTypeWithSeats) are used for specific purposes and don't need to include all EventType fields like bookingRequiresAuthentication. These methods don't feed into the general OutputEventTypesService_2024_06_14 flow.
Applied to files:
packages/features/bookings/lib/handleNewBooking/getEventTypesFromDB.ts
📚 Learning: 2025-09-03T11:54:05.409Z
Learnt from: supalarry
PR: calcom/cal.com#23514
File: apps/api/v2/src/ee/bookings/2024-08-13/services/bookings.service.ts:579-582
Timestamp: 2025-09-03T11:54:05.409Z
Learning: In calcom/cal.com bookings repository methods, when Prisma select uses `eventType: true`, all eventType fields including seatsShowAttendees are automatically included in the selection. Explicit field selection is not required when using `true` for nested relations.
Applied to files:
packages/features/bookings/lib/handleNewBooking/getEventTypesFromDB.ts
📚 Learning: 2025-09-03T11:54:05.409Z
Learnt from: supalarry
PR: calcom/cal.com#23514
File: apps/api/v2/src/ee/bookings/2024-08-13/services/bookings.service.ts:579-582
Timestamp: 2025-09-03T11:54:05.409Z
Learning: In calcom/cal.com bookings repository methods, when Prisma include uses `eventType: true`, all eventType fields including seatsShowAttendees are automatically included in the selection. Explicit field selection is not required when using `true` for nested relations.
Applied to files:
packages/features/bookings/lib/handleNewBooking/getEventTypesFromDB.ts
🧬 Code graph analysis (4)
packages/features/bookings/lib/handleNewBooking.ts (1)
packages/features/bookings/lib/handleNewBooking/getEventTypesFromDB.ts (1)
getEventTypeResponse(224-224)
packages/features/bookings/lib/handleNewBooking/scheduleNoShowTriggers.ts (1)
packages/features/eventtypes/lib/types.ts (1)
CalVideoSettings(298-308)
packages/features/eventtypes/components/locations/Locations.tsx (1)
packages/features/eventtypes/lib/types.ts (2)
EventTypeSetupProps(30-30)CalVideoSettings(298-308)
packages/features/eventtypes/components/locations/CalVideoSettings.tsx (4)
packages/features/eventtypes/lib/types.ts (2)
CalVideoSettings(298-308)FormValues(84-181)packages/trpc/react/trpc.ts (1)
trpc(54-138)packages/platform/libraries/index.ts (1)
WebhookTriggerEvents(36-36)packages/ui/components/form/switch/SettingsToggle.tsx (1)
SettingsToggle(29-125)
⏰ Context from checks skipped due to timeout of 180000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
- GitHub Check: Tests / Unit
- GitHub Check: Linters / lint
- GitHub Check: Type check / check-types
- GitHub Check: Codacy Static Code Analysis
🔇 Additional comments (7)
packages/features/bookings/lib/handleNewBooking/getEventTypesFromDB.ts (1)
120-120: LGTM!The addition of
calVideoSettingsto the select statement is correct and necessary for downstream processing. It follows the established pattern and coding guidelines for Prisma queries.packages/features/bookings/lib/handleNewBooking/scheduleNoShowTriggers.ts (2)
7-7: LGTM!The addition of
calVideoSettingsparameter and its type import is correct and enables the conditional scheduling logic implemented below.Also applies to: 23-23, 36-36
55-102: Verify triggerHostNoShowWebhook handles default webhook payloadEnsure that when no subscribers exist but automatic tracking is enabled (default payload at lines 79–101), the
triggerHostNoShowWebhookhandler can process emptysubscriberUrl,id, and other null fields without errors.packages/features/eventtypes/components/locations/CalVideoSettings.tsx (4)
1-1: LGTM!The new imports are necessary and correctly used:
useAutoAnimatefor smooth expansion animation (line 32)useStatefor managing expanded state (line 31)WebhookTriggerEventsandtrpcfor webhook checking (lines 34-45)IconandTooltipfor UI components (lines 50, 61)Also applies to: 3-3, 10-11, 16-17
21-27: LGTM!The component signature update correctly accepts
eventTypeIdto enable webhook fetching for conditional toggle rendering.
34-45: LGTM!The webhook fetching logic correctly:
- Queries webhooks only when
eventTypeIdis present- Checks for existing host and guest no-show webhooks
- Enables conditional rendering of the new toggles
This ensures that toggles are hidden when webhooks are already configured, preserving the existing behavior as specified in the PR objectives.
117-151: LGTM!The new toggles for automatic no-show tracking are correctly implemented:
- Properly integrated with react-hook-form using
Controller- Conditionally rendered only when no webhooks exist and not on platform
- Use localization with
t()as required by coding guidelines- Follow the established pattern of other settings in this component
- Include appropriate upgrade badges
The implementation aligns with the PR objectives to provide explicit toggles while preserving existing webhook-based behavior.
Based on coding guidelines.
packages/features/bookings/lib/handleNewBooking/scheduleNoShowTriggers.ts
Show resolved
Hide resolved
packages/prisma/migrations/20251008092040_add_no_show_config_in_calvideosettings/migration.sql
Show resolved
Hide resolved
pallava-joshi
left a comment
There was a problem hiding this comment.
please address code-rabbit suggestion
…fill migration for Cal Video no-show flags
There was a problem hiding this comment.
Actionable comments posted: 0
♻️ Duplicate comments (2)
packages/features/bookings/lib/handleNewBooking.ts (2)
135-140: Fix the type guard to assert the correct type.The type guard currently asserts
eventType is getEventTypeResponse, butgetEventTypeResponseis the array type returned bygetEventTypesFromDB, not a single event type object. This widens types downstream and defeats type safety.Please refer to the previous review comment for details and suggested fixes.
461-463: Use the correct type when creating eventTypeForProcessing.The type cast to
getEventTypeResponse(which is an array type) is incorrect and bypasses TypeScript's type checking with the double cast patterneventType as unknown as getEventTypeResponse. This creates type confusion downstream.Please refer to the previous review comment for the recommended fix.
🧹 Nitpick comments (1)
packages/features/bookings/lib/handleNewBooking.ts (1)
27-29: Remove unused imports.Two of the three newly imported services (
getCheckBookingAndDurationLimitsServiceandgetLuckyUserService) don't appear to be used in the visible code changes. WhilegetCacheServiceis used at line 626, the other two imports seem unnecessary and should be removed to keep the imports clean.Apply this diff to remove the unused imports:
-import { getCheckBookingAndDurationLimitsService } from "@calcom/features/di/containers/BookingLimits"; import { getCacheService } from "@calcom/features/di/containers/Cache"; -import { getLuckyUserService } from "@calcom/features/di/containers/LuckyUser";
📜 Review details
Configuration used: Path: .coderabbit.yaml
Review profile: CHILL
Plan: Pro
Disabled knowledge base sources:
- Linear integration is disabled by default for public repositories
You can enable these sources in your CodeRabbit configuration.
📒 Files selected for processing (2)
packages/features/bookings/lib/handleNewBooking.ts(7 hunks)packages/prisma/migrations/20251014120000_backfill_cal_video_no_show_flags/migration.sql(1 hunks)
🧰 Additional context used
📓 Path-based instructions (3)
**/*.ts
📄 CodeRabbit inference engine (.cursor/rules/review.mdc)
**/*.ts: For Prisma queries, only select data you need; never useinclude, always useselect
Ensure thecredential.keyfield is never returned from tRPC endpoints or APIs
Files:
packages/features/bookings/lib/handleNewBooking.ts
**/*.{ts,tsx}
📄 CodeRabbit inference engine (.cursor/rules/review.mdc)
Flag excessive Day.js use in performance-critical code; prefer native Date or Day.js
.utc()in hot paths like loops
Files:
packages/features/bookings/lib/handleNewBooking.ts
**/*.{ts,tsx,js,jsx}
⚙️ CodeRabbit configuration file
Flag default exports and encourage named exports. Named exports provide better tree-shaking, easier refactoring, and clearer imports. Exempt main components like pages, layouts, and components that serve as the primary export of a module.
Files:
packages/features/bookings/lib/handleNewBooking.ts
🧠 Learnings (2)
📚 Learning: 2025-08-27T13:32:46.887Z
Learnt from: supalarry
PR: calcom/cal.com#23364
File: apps/api/v2/src/ee/event-types/event-types_2024_06_14/transformers/internal-to-api/internal-to-api.spec.ts:295-296
Timestamp: 2025-08-27T13:32:46.887Z
Learning: In calcom/cal.com, when transforming booking fields from internal to API format, tests in organizations-event-types.e2e-spec.ts already expect name field label and placeholder to be empty strings ("") rather than undefined. PR changes that set these to explicit empty strings are typically fixing implementation to match existing test expectations rather than breaking changes.
Applied to files:
packages/features/bookings/lib/handleNewBooking.ts
📚 Learning: 2025-09-03T09:52:51.182Z
Learnt from: hariombalhara
PR: calcom/cal.com#23541
File: packages/features/bookings/lib/di/modules/RegularBookingServiceModule.ts:22-28
Timestamp: 2025-09-03T09:52:51.182Z
Learning: The IBookingServiceDependencies interface in packages/features/bookings/lib/handleNewBooking.ts contains 6 properties: cacheService, checkBookingAndDurationLimitsService, prismaClient, bookingRepository, featuresRepository, and checkBookingLimitsService. This interface is used by RegularBookingService and matches the depsMap structure in RegularBookingServiceModule.
Applied to files:
packages/features/bookings/lib/handleNewBooking.ts
🧬 Code graph analysis (1)
packages/features/bookings/lib/handleNewBooking.ts (1)
packages/features/bookings/lib/handleNewBooking/getEventTypesFromDB.ts (1)
getEventTypeResponse(224-224)
⏰ Context from checks skipped due to timeout of 180000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
- GitHub Check: Tests / Unit
- GitHub Check: Linters / lint
- GitHub Check: Type check / check-types
- GitHub Check: Codacy Static Code Analysis
🔇 Additional comments (3)
packages/prisma/migrations/20251014120000_backfill_cal_video_no_show_flags/migration.sql (2)
3-17: LGTM!The webhook-based backfill logic correctly enables the flags when an active webhook with the corresponding trigger exists. The use of PostgreSQL's
ANYoperator for array containment checks is appropriate.
19-33: Workflow model has no active/enabled field. No filter is possible; current backfill queries are correct.packages/features/bookings/lib/handleNewBooking.ts (1)
467-467: Consistent propagation of calVideoSettings looks good.The changes consistently propagate
calVideoSettingsthrough the booking flow:
- Using
eventTypeForProcessingin schema creation (line 467) and data retrieval (line 472)- Explicitly spreading into
eventTypeWithUsers(line 791)- Passing to
createBooking(line 1549) andscheduleNoShowTriggers(line 2408)Once the type issues with
hasCalVideoSettingsandeventTypeForProcessingare resolved (as noted in previous comments), this propagation logic will be sound.Also applies to: 472-472, 791-791, 1549-1549, 2408-2408
|
shouldn't we change these unused import statements
|
There was a problem hiding this comment.
1 issue found across 11 files
Prompt for AI agents (all 1 issues)
Understand the root cause of the following 1 issues and fix them.
<file name="packages/features/bookings/lib/handleNewBooking/scheduleNoShowTriggers.ts">
<violation number="1" location="packages/features/bookings/lib/handleNewBooking/scheduleNoShowTriggers.ts:89">
The fallback guest no-show payload leaves subscriberUrl empty, but the task schema enforces subscriberUrl to be a valid URL; this will throw at runtime and block automatic guest no-show processing.</violation>
</file>
React with 👍 or 👎 to teach cubic. Mention @cubic-dev-ai to give feedback, ask questions, or re-run the review.
packages/features/bookings/lib/handleNewBooking/scheduleNoShowTriggers.ts
Show resolved
Hide resolved
|
This PR has been marked as stale due to inactivity. If you're still working on it or need any help, please let us know or update the PR to keep it active. |
- Add enableAutomaticNoShowTrackingForHosts/Guests to form validation schema - Add fields to eventTypeRepository select queries for proper data fetching - Add fields to tRPC input validation schema - Add fields to CalVideoSettings repository type definitions - Add fields to create handler for new event types The issue was caused by missing fields in multiple validation layers, particularly in the form-level Zod schema which was stripping the fields before submission. Now the settings properly save to DB and persist after reload.
- Add comprehensive authorization checks before accessing webhook data - Verify user has access to event type (direct ownership, assigned, or team member) - Optimize query by checking direct ownership first (fastest path) - Prevent unauthorized users from probing other teams' webhook configurations Addresses security review comment about missing authorization validation.
Replace fake webhook URLs with isAutomaticTrackingOnly flag for clarity. When Cal Video automatic tracking is enabled without webhooks, we now: - Set isAutomaticTrackingOnly: true flag - Use empty subscriberUrl instead of fake URL - Check the flag instead of URL patterns This makes the code more maintainable and addresses review feedback about confusing dummy webhook objects.
Add comprehensive tests for automatic no-show tracking feature: - Test enableAutomaticNoShowTrackingForHosts toggle - Test enableAutomaticNoShowTrackingForGuests toggle - Test both toggles enabled/disabled scenarios - Test webhook precedence over automatic tracking - Test location validation (Cal Video only) - Test edge cases (null settings, isDryRun, empty location) 10 essential tests with full coverage of the toggle feature.
…/dhairyashiil/cal.com into feat/cal-video-no-show-setting-2
There was a problem hiding this comment.
2 issues found across 23 files
Prompt for AI agents (all 2 issues)
Check if these issues are valid — if so, understand the root cause of each and fix them.
<file name="packages/trpc/server/routers/viewer/bookings/confirm.handler.ts">
<violation number="1" location="packages/trpc/server/routers/viewer/bookings/confirm.handler.ts:93">
Consider selecting only the needed `calVideoSettings` fields rather than all columns. Based on `scheduleNoShowTriggers` usage, only `enableAutomaticNoShowTrackingForHosts` and `enableAutomaticNoShowTrackingForGuests` appear to be required:
```typescript
calVideoSettings: {
select: {
enableAutomaticNoShowTrackingForHosts: true,
enableAutomaticNoShowTrackingForGuests: true,
redirectUrlOnExit: true,
}
}
This follows the project guideline of selecting only required fields to reduce performance overhead.
Reply to cubic to teach it or ask questions. Re-run a review with @cubic-dev-ai review this PR
packages/trpc/server/routers/viewer/bookings/confirm.handler.ts
Outdated
Show resolved
Hide resolved
packages/features/tasker/tasks/triggerNoShow/triggerGuestNoShow.ts
Outdated
Show resolved
Hide resolved
…ettings select Address reviewer comments: 1. Add isAutomaticTrackingOnly to ZSendNoShowWebhookPayloadSchema - Update schema.ts to include the optional boolean field - Update common.ts prepareNoShowTrigger to extract and return the field - Update triggerHostNoShow.ts and triggerGuestNoShow.ts to use properly typed field - Remove unsafe 'as any' type assertions 2. Optimize calVideoSettings select in confirm.handler.ts - Only select required fields (enableAutomaticNoShowTrackingForHosts, enableAutomaticNoShowTrackingForGuests) - Remove unnecessary spreading and redirectUrlOnExit handling - Follows project guideline to reduce performance overhead Fixes type check errors and improves code quality.
@Udit-takkar please check 🙏🏼 |
There was a problem hiding this comment.
1 issue found across 25 files
Prompt for AI agents (all 1 issues)
Check if these issues are valid — if so, understand the root cause of each and fix them.
<file name="packages/features/bookings/lib/handleNewBooking/getEventTypesFromDB.ts">
<violation number="1" location="packages/features/bookings/lib/handleNewBooking/getEventTypesFromDB.ts:121">
P2: Consider using a nested `select` to fetch only the specific `CalVideoSettings` fields needed for the no-show feature, rather than selecting all fields from the relation. This aligns with the project's Prisma guidelines to only select data you need.</violation>
</file>
Reply to cubic to teach it or ask questions. Re-run a review with @cubic-dev-ai review this PR
Devin AI is resolving merge conflictsThis PR has merge conflicts with the Devin will:
If you prefer to resolve conflicts manually, you can close the Devin session and handle it yourself. |
Resolved merge conflicts in: - apps/web/modules/event-types/components/locations/CalVideoSettings.tsx - apps/web/modules/event-types/components/locations/Locations.tsx - packages/features/bookings/lib/service/RegularBookingService.ts - packages/features/eventtypes/lib/types.ts - packages/features/tasker/tasks/triggerNoShow/triggerGuestNoShow.ts - packages/features/tasker/tasks/triggerNoShow/triggerHostNoShow.ts Also updated: - packages/features/eventtypes/lib/schemas.ts (added no-show tracking fields) - packages/features/bookings/lib/handleNewBooking/scheduleNoShowTriggers.ts (added version field) Co-Authored-By: unknown <>
Devin AI is resolving merge conflictsThis PR has merge conflicts with the Devin will:
If you prefer to resolve conflicts manually, you can close the Devin session and handle it yourself. |
Devin AI is resolving merge conflictsThis PR has merge conflicts with the Devin will:
If you prefer to resolve conflicts manually, you can close the Devin session and handle it yourself. |
Co-Authored-By: unknown <>
Devin AI is resolving merge conflictsThis PR has merge conflicts with the Devin will:
If you prefer to resolve conflicts manually, you can close the Devin session and handle it yourself. |
1 similar comment
Devin AI is resolving merge conflictsThis PR has merge conflicts with the Devin will:
If you prefer to resolve conflicts manually, you can close the Devin session and handle it yourself. |
What does this PR do?
Visual Demo (For contributors especially)
add.no.show.setting.in.cal.video.mov