Skip to content

Commit 6aa4e86

Browse files
committed
Merge branch 'main' of https://github.com/CapSoftware/Cap
2 parents f38ae66 + 1c67745 commit 6aa4e86

File tree

9 files changed

+2014
-31
lines changed

9 files changed

+2014
-31
lines changed

.github/workflows/ci.yml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,8 +103,9 @@ jobs:
103103
settings:
104104
- target: aarch64-apple-darwin
105105
runner: macos-latest
106-
- target: x86_64-pc-windows-msvc
107-
runner: windows-latest
106+
# Windows can't take the disk usage lol
107+
# - target: x86_64-pc-windows-msvc
108+
# runner: windows-latest
108109
runs-on: ${{ matrix.settings.runner }}
109110
permissions:
110111
contents: read

apps/web/app/(org)/dashboard/settings/organization/components/InviteDialog.tsx

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -115,10 +115,6 @@ export const InviteDialog = ({
115115
},
116116
});
117117

118-
const handleSendInvites = () => {
119-
sendInvites.mutate();
120-
};
121-
122118
return (
123119
<Dialog open={isOpen} onOpenChange={setIsOpen}>
124120
<DialogContent className="p-0 w-full max-w-md rounded-xl border bg-gray-2 border-gray-4">
@@ -214,7 +210,7 @@ export const InviteDialog = ({
214210
inviteEmails.length === 0 ||
215211
remainingSeats === 0
216212
}
217-
onClick={handleSendInvites}
213+
onClick={() => sendInvites.mutate()}
218214
>
219215
Send Invites
220216
</Button>

apps/web/app/(org)/dashboard/settings/organization/components/MembersCard.tsx

Lines changed: 18 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
"use client";
22

3+
import { buildEnv } from "@cap/env";
34
import {
45
Button,
56
Card,
@@ -146,22 +147,24 @@ export const MembersCard = ({
146147
<CardDescription>Manage your organization members.</CardDescription>
147148
</CardHeader>
148149
<div className="flex flex-wrap gap-3">
149-
<Tooltip
150-
position="top"
151-
content="Once inside the Stripe dashboard, click 'Manage Plan', then increase quantity of subscriptions to purchase more seats"
152-
>
153-
<Button
154-
type="button"
155-
size="sm"
156-
variant="primary"
157-
className="px-6 min-w-auto"
158-
spinner={loading}
159-
disabled={!isOwner || loading}
160-
onClick={handleManageBilling}
150+
{buildEnv.NEXT_PUBLIC_IS_CAP && (
151+
<Tooltip
152+
position="top"
153+
content="Once inside the Stripe dashboard, click 'Manage Plan', then increase quantity of subscriptions to purchase more seats"
161154
>
162-
{loading ? "Loading..." : "+ Purchase more seats"}
163-
</Button>
164-
</Tooltip>
155+
<Button
156+
type="button"
157+
size="sm"
158+
variant="primary"
159+
className="px-6 min-w-auto"
160+
spinner={loading}
161+
disabled={!isOwner || loading}
162+
onClick={handleManageBilling}
163+
>
164+
{loading ? "Loading..." : "+ Purchase more seats"}
165+
</Button>
166+
</Tooltip>
167+
)}
165168
<Button
166169
type="button"
167170
size="sm"

apps/web/content/changelog/81.mdx

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
---
2+
title: Speed modification in editor, New Crop UI, Bug fixes
3+
app: Cap Desktop
4+
publishedAt: “2025-11-5”
5+
version: 0.3.82
6+
image:
7+
---
8+
9+
- **Speed modification** - Clip segments now have a Speed option in the editor, allowing them to be slowed down or sped up. Currently, changing the speed of a segment will mute its audio.
10+
- **New Crop UI** - Thanks to @ItsEeleeya the area select and editor crop UI now has more features and is much smoother.
11+
- **Bug fixes** - macOS recording errors should be less common, and some recordings should no longer look distorted in the Editor

apps/web/utils/organization.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { buildEnv } from "@cap/env";
2+
13
/**
24
* Calculate organization seats information
35
*/
@@ -10,10 +12,9 @@ export function calculateSeats(organization: {
1012
const memberCount = organization?.members?.length ?? 0;
1113
const pendingInvitesCount = organization?.invites?.length ?? 0;
1214
const totalUsedSeats = memberCount + pendingInvitesCount;
13-
const remainingSeats =
14-
process.env.NODE_ENv === "development"
15-
? Number.MAX_SAFE_INTEGER
16-
: Math.max(0, inviteQuota - totalUsedSeats);
15+
const remainingSeats = buildEnv.NEXT_PUBLIC_IS_CAP
16+
? Math.max(0, inviteQuota - totalUsedSeats)
17+
: Number.MAX_SAFE_INTEGER;
1718

1819
return {
1920
inviteQuota,

crates/video-decode/src/avassetreader.rs

Lines changed: 25 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,13 @@ pub struct AVAssetReaderDecoder {
1616
tokio_handle: TokioHandle,
1717
track_output: R<av::AssetReaderTrackOutput>,
1818
reader: R<av::AssetReader>,
19+
width: u32,
20+
height: u32,
1921
}
2022

2123
impl AVAssetReaderDecoder {
2224
pub fn new(path: PathBuf, tokio_handle: TokioHandle) -> Result<Self, String> {
23-
let pixel_format = {
25+
let (pixel_format, width, height) = {
2426
let input = ffmpeg::format::input(&path).unwrap();
2527

2628
let input_stream = input
@@ -35,18 +37,24 @@ impl AVAssetReaderDecoder {
3537
.video()
3638
.map_err(|e| format!("video decoder / {e}"))?;
3739

38-
pixel_to_pixel_format(decoder.format())
40+
(
41+
pixel_to_pixel_format(decoder.format()),
42+
decoder.width(),
43+
decoder.height(),
44+
)
3945
};
4046

4147
let (track_output, reader) =
42-
Self::get_reader_track_output(&path, 0.0, &tokio_handle, pixel_format)?;
48+
Self::get_reader_track_output(&path, 0.0, &tokio_handle, pixel_format, width, height)?;
4349

4450
Ok(Self {
4551
path,
4652
pixel_format,
4753
tokio_handle,
4854
track_output,
4955
reader,
56+
width,
57+
height,
5058
})
5159
}
5260

@@ -57,6 +65,8 @@ impl AVAssetReaderDecoder {
5765
requested_time,
5866
&self.tokio_handle,
5967
self.pixel_format,
68+
self.width,
69+
self.height,
6070
)?;
6171

6272
Ok(())
@@ -67,6 +77,8 @@ impl AVAssetReaderDecoder {
6777
time: f32,
6878
handle: &TokioHandle,
6979
pixel_format: cv::PixelFormat,
80+
width: u32,
81+
height: u32,
7082
) -> Result<(R<av::AssetReaderTrackOutput>, R<av::AssetReader>), String> {
7183
let asset = av::UrlAsset::with_url(
7284
&ns::Url::with_fs_path_str(path.to_str().unwrap(), false),
@@ -93,8 +105,16 @@ impl AVAssetReaderDecoder {
93105
let mut reader_track_output = av::AssetReaderTrackOutput::with_track(
94106
&track,
95107
Some(&ns::Dictionary::with_keys_values(
96-
&[cv::pixel_buffer::keys::pixel_format().as_ns()],
97-
&[pixel_format.to_cf_number().as_ns().as_id_ref()],
108+
&[
109+
cv::pixel_buffer::keys::pixel_format().as_ns(),
110+
cv::pixel_buffer::keys::width().as_ns(),
111+
cv::pixel_buffer::keys::height().as_ns(),
112+
],
113+
&[
114+
pixel_format.to_cf_number().as_ns().as_id_ref(),
115+
ns::Number::with_u32(width).as_id_ref(),
116+
ns::Number::with_u32(height).as_id_ref(),
117+
],
98118
)),
99119
)
100120
.map_err(|e| format!("asset.reader_track_output{{{pixel_format:?}}}): {e}"))?;
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
ALTER TABLE `organizations` ADD `tombstoneAt` timestamp;

0 commit comments

Comments
 (0)