Merge branch 'main' into 69-feature-aspect-ratio-selection-for-facebook-posts-like-instagram

This commit is contained in:
Paulo Castellano 2026-06-10 13:14:55 -03:00 committed by GitHub
commit 82eeaa82d9
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 83 additions and 11 deletions

View file

@ -108,7 +108,7 @@ private function buildVideoPostInfo(PostPlatform $postPlatform, ?string $content
'title' => $content ?? '',
'privacy_level' => $this->resolveRequiredPrivacyLevel($postPlatform),
'disable_duet' => ! data_get($meta, 'allow_duet', false),
'disable_comment' => ! data_get($meta, 'allow_comments', true),
'disable_comment' => ! data_get($meta, 'allow_comments', false),
'disable_stitch' => ! data_get($meta, 'allow_stitch', false),
];
@ -142,7 +142,7 @@ private function buildPhotoPostInfo(PostPlatform $postPlatform, ?string $content
$postInfo = [
'description' => $content ?? '',
'privacy_level' => $this->resolveRequiredPrivacyLevel($postPlatform),
'disable_comment' => ! data_get($meta, 'allow_comments', true),
'disable_comment' => ! data_get($meta, 'allow_comments', false),
];
if (data_get($meta, 'brand_content_toggle', false)) {

View file

@ -15,7 +15,7 @@ public function run(): void
{
$this->call([
PlanSeeder::class,
PassportSeeder::class,
PassportSeeder::class
]);
}
}

View file

@ -61,7 +61,7 @@
],
'posting_to' => 'Posting to',
'privacy_level' => 'Who can see this video?',
'privacy_placeholder' => 'Select visibility',
'privacy_placeholder' => 'Select who can view this post',
'privacy' => [
'public' => 'Public to everyone',
'friends' => 'Mutual follow friends',
@ -87,7 +87,7 @@
'compliance_incomplete' => 'You need to indicate if your content promotes yourself, a third party, or both.',
'privacy_required' => 'TikTok privacy level is required when publishing.',
'branded_cleared_private' => 'Privacy was cleared because Branded Content cannot be private.',
'interaction_disabled_by_creator' => 'Disabled by your TikTok account settings.',
'interaction_disabled_by_creator' => 'Turned off in your TikTok account settings',
'max_duration_exceeded' => 'Video is :duration s long but this account can only post videos up to :max s.',
'processing_hint' => 'After publishing, it may take a few minutes for the content to process and appear on your TikTok profile.',
'brand_organic' => 'Your brand',

View file

@ -61,7 +61,7 @@
],
'posting_to' => 'Publicando en',
'privacy_level' => '¿Quién puede ver este video?',
'privacy_placeholder' => 'Selecciona la visibilidad',
'privacy_placeholder' => 'Selecciona quién puede ver esta publicación',
'privacy' => [
'public' => 'Público para todos',
'friends' => 'Amigos mutuos',
@ -87,7 +87,7 @@
'compliance_incomplete' => 'Debes indicar si tu contenido promociona a ti mismo, a un tercero o a ambos.',
'privacy_required' => 'La visibilidad de TikTok es obligatoria al publicar.',
'branded_cleared_private' => 'La visibilidad se borró porque el contenido de marca no puede ser privado.',
'interaction_disabled_by_creator' => 'Desactivado por la configuración de tu cuenta TikTok.',
'interaction_disabled_by_creator' => 'Desactivado en la configuración de tu cuenta TikTok',
'max_duration_exceeded' => 'El video dura :duration s pero esta cuenta solo permite videos de hasta :max s.',
'processing_hint' => 'Después de publicar, puede tardar unos minutos en procesarse y aparecer en tu perfil de TikTok.',
'brand_organic' => 'Tu marca',

View file

@ -61,7 +61,7 @@
],
'posting_to' => 'Publicando em',
'privacy_level' => 'Quem pode ver este vídeo?',
'privacy_placeholder' => 'Selecione a visibilidade',
'privacy_placeholder' => 'Selecione quem pode ver este post',
'privacy' => [
'public' => 'Público para todos',
'friends' => 'Amigos em comum',
@ -87,7 +87,7 @@
'compliance_incomplete' => 'Você precisa indicar se o conteúdo promove você mesmo, terceiros ou ambos.',
'privacy_required' => 'A visibilidade do TikTok é obrigatória ao publicar.',
'branded_cleared_private' => 'A visibilidade foi limpa porque conteúdo de marca não pode ser privado.',
'interaction_disabled_by_creator' => 'Desativado pelas configurações da sua conta TikTok.',
'interaction_disabled_by_creator' => 'Desativado nas configurações da sua conta TikTok',
'max_duration_exceeded' => 'Vídeo tem :duration s mas esta conta só permite vídeos de até :max s.',
'processing_hint' => 'Após publicar, pode levar alguns minutos para o conteúdo ser processado e aparecer no seu perfil TikTok.',
'brand_organic' => 'Sua marca',

View file

@ -0,0 +1,6 @@
## What's Changed
* docs: add Star History section to README by @paulocastellano in https://github.com/trypostit/trypost/pull/63
* feat(docker): publish multi-arch image to GHCR + self-host compose by @paulocastellano in https://github.com/trypostit/trypost/pull/65
**Full Changelog**: https://github.com/trypostit/trypost/compare/v1.0.0...v1.0.1

25
releases/v1.0.1/email.md Normal file
View file

@ -0,0 +1,25 @@
---
subject: "Changelog: TryPost v1.0.1 — Self-host with the official Docker image"
---
# Changelog: TryPost v1.0.1 — Self-host with the official Docker image
By Paulo Castellano • Release v1.0.1
Hello! Welcome to this week's update. Here's what's new in TryPost.
## Self-host TryPost with one command
You can now run TryPost from an official Docker image. Every release builds one (Intel and ARM), so you pull it and go, no building from source. The compose setup brings up TryPost with its database and Redis alongside it, and your posts, drafts and uploads stay in volumes on your own machine.
Want it on a real domain? There's a built-in option that sorts out HTTPS for you, so you don't have to fight with certificates to get a secure install. And if you'd rather not keep uploads on the box, you can point storage at S3 or Cloudflare R2.
## New features
- An official Docker image you can pull and run (Intel + ARM).
- A one-command self-host stack with PostgreSQL and Redis included.
- Automatic HTTPS for your own domain.
- Media storage on S3 or Cloudflare R2.
Cheers,
Paulo Castellano from TryPost.it

View file

@ -397,6 +397,11 @@ watch(
{{ $t('posts.form.tiktok.compliance.music_usage') }}
</a>
</p>
<!-- Post-publish notice required by TikTok Content Sharing Guidelines -->
<p class="mt-3 text-xs text-muted-foreground">
{{ $t('posts.form.tiktok.processing_hint') }}
</p>
</div>
</div>
</template>

View file

@ -605,9 +605,10 @@
$body = json_decode($request->body(), true);
$postInfo = data_get($body, 'post_info');
// privacy_level passes through; toggles use safe defaults (duet/stitch off, comments on).
// privacy_level passes through; all interaction toggles default to OFF to match
// the UI checkbox state (TikTok UX guideline: none should be checked by default).
return $postInfo['privacy_level'] === 'PUBLIC_TO_EVERYONE'
&& $postInfo['disable_comment'] === false
&& $postInfo['disable_comment'] === true
&& $postInfo['disable_duet'] === true
&& $postInfo['disable_stitch'] === true
&& ! isset($postInfo['is_aigc'])

View file

@ -0,0 +1,35 @@
<?php
declare(strict_types=1);
test('tiktok english strings match the wording the app reviewer expects', function () {
expect(__('posts.form.tiktok.privacy_placeholder', [], 'en'))
->toBe('Select who can view this post');
expect(__('posts.form.tiktok.interaction_disabled_by_creator', [], 'en'))
->toBe('Turned off in your TikTok account settings');
expect(__('posts.form.tiktok.processing_hint', [], 'en'))
->toBe('After publishing, it may take a few minutes for the content to process and appear on your TikTok profile.');
expect(__('posts.form.tiktok.compliance_incomplete', [], 'en'))
->toBe('You need to indicate if your content promotes yourself, a third party, or both.');
expect(__('posts.form.tiktok.privacy.private_disabled_branded', [], 'en'))
->toBe('Branded content visibility cannot be set to private.');
expect(__('posts.form.tiktok.promotional_organic_title', [], 'en'))
->toBe('Your photo/video will be labeled as "Promotional content".');
expect(__('posts.form.tiktok.promotional_paid_title', [], 'en'))
->toBe('Your photo/video will be labeled as "Paid partnership".');
expect(__('posts.form.tiktok.compliance.agree', [], 'en'))
->toBe("By posting, you agree to TikTok's");
expect(__('posts.form.tiktok.compliance.music_usage', [], 'en'))
->toBe('Music Usage Confirmation');
expect(__('posts.form.tiktok.compliance.branded_policy', [], 'en'))
->toBe('Branded Content Policy');
});