upload-post 2.12.0__tar.gz → 2.13.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {upload_post-2.12.0 → upload_post-2.13.0}/PKG-INFO +119 -13
- {upload_post-2.12.0 → upload_post-2.13.0}/README.md +118 -12
- {upload_post-2.12.0 → upload_post-2.13.0}/setup.py +1 -1
- upload_post-2.13.0/tests/test_parity_fields.py +292 -0
- {upload_post-2.12.0 → upload_post-2.13.0}/upload_post/__init__.py +1 -1
- {upload_post-2.12.0 → upload_post-2.13.0}/upload_post/api_client.py +480 -71
- {upload_post-2.12.0 → upload_post-2.13.0}/upload_post.egg-info/PKG-INFO +119 -13
- {upload_post-2.12.0 → upload_post-2.13.0}/upload_post.egg-info/SOURCES.txt +1 -0
- {upload_post-2.12.0 → upload_post-2.13.0}/setup.cfg +0 -0
- {upload_post-2.12.0 → upload_post-2.13.0}/tests/test_comments_audience.py +0 -0
- {upload_post-2.12.0 → upload_post-2.13.0}/upload_post/cli.py +0 -0
- {upload_post-2.12.0 → upload_post-2.13.0}/upload_post.egg-info/dependency_links.txt +0 -0
- {upload_post-2.12.0 → upload_post-2.13.0}/upload_post.egg-info/requires.txt +0 -0
- {upload_post-2.12.0 → upload_post-2.13.0}/upload_post.egg-info/top_level.txt +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: upload-post
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.13.0
|
|
4
4
|
Summary: Cross-platform social media upload for TikTok, Instagram, YouTube, LinkedIn, Facebook, Pinterest, Threads, Reddit, Bluesky, Discord, Telegram, and X (Twitter)
|
|
5
5
|
Home-page: https://www.upload-post.com/
|
|
6
6
|
Author: Upload-Post
|
|
@@ -481,7 +481,7 @@ TikTok account; check it before offering a feature.
|
|
|
481
481
|
| `location` | `tiktok_location_id` / `tiktok_location_name`, plus `get_tiktok_locations()` |
|
|
482
482
|
| `cover_image` | `tiktok_cover_image_url` |
|
|
483
483
|
| `cover_timestamp` | `cover_timestamp` |
|
|
484
|
-
| `draft` | `tiktok_upload_to_draft` |
|
|
484
|
+
| `draft` | `tiktok_upload_to_draft` or `post_mode="MEDIA_UPLOAD"` (same draft) |
|
|
485
485
|
| `video_privacy` | `privacy_level` on video |
|
|
486
486
|
| `photo_privacy` | `privacy_level` on photo posts |
|
|
487
487
|
| `profile_analytics` | `get_audience()` and `get_suggestions(type="hashtags")` with `platform="tiktok"` |
|
|
@@ -528,7 +528,7 @@ client.upload_video(
|
|
|
528
528
|
|
|
529
529
|
tiktok_cover_image_url="https://example.com/cover.jpg",
|
|
530
530
|
tiktok_is_ai_generated=False,
|
|
531
|
-
tiktok_upload_to_draft=False,
|
|
531
|
+
tiktok_upload_to_draft=False, # same draft as post_mode="MEDIA_UPLOAD"
|
|
532
532
|
)
|
|
533
533
|
```
|
|
534
534
|
|
|
@@ -544,10 +544,13 @@ client.upload_video(
|
|
|
544
544
|
| `tiktok_location_id` | str | `location` | Video + photos. `location_id` from `get_tiktok_locations()` |
|
|
545
545
|
| `tiktok_location_name` | str | `location` | Required whenever `tiktok_location_id` is set |
|
|
546
546
|
| `tiktok_cover_image_url` | str | `cover_image` | Video only. Custom cover image URL |
|
|
547
|
-
| `tiktok_is_ai_generated` | bool | — | Video + photos. AI-generated content disclosure |
|
|
548
|
-
| `tiktok_upload_to_draft` | bool | `draft` | Video
|
|
547
|
+
| `tiktok_is_ai_generated` | bool | — | Video + photos. AI-generated content disclosure (aliases: `is_ai_generated`) |
|
|
548
|
+
| `tiktok_upload_to_draft` | bool | `draft` | Video + photos. Same draft as `post_mode="MEDIA_UPLOAD"` (aliases: `upload_to_draft`, `is_draft`). TikTok ignores the rest of the post settings |
|
|
549
|
+
| `tiktok_is_ads_only` | bool | — | Video. Only show in ads (alias: `is_ads_only`) |
|
|
550
|
+
| `tiktok_tto_invite_link` | str | — | Video. TikTok One invite link; needs branded content (alias: `tto_invite_link`) |
|
|
549
551
|
| `photo_cover_index` | int | — | Cover photo index for photo posts (0-based) |
|
|
550
552
|
| `privacy_level` | str | `photo_privacy` / `video_privacy` | Accepted on video and photo posts alike; which values the account may use is decided by TikTok, see the note below |
|
|
553
|
+
| `post_mode` | str | `draft` | `DIRECT_POST` or `MEDIA_UPLOAD`. `MEDIA_UPLOAD` is the same draft as `tiktok_upload_to_draft=True` |
|
|
551
554
|
|
|
552
555
|
## Platform-Specific Options
|
|
553
556
|
|
|
@@ -557,9 +560,11 @@ client.upload_video(
|
|
|
557
560
|
- `disable_stitch` - Disable stitch
|
|
558
561
|
- `cover_timestamp` - Timestamp in ms for cover
|
|
559
562
|
- `is_aigc` - AI-generated content flag
|
|
560
|
-
- `post_mode` - DIRECT_POST or MEDIA_UPLOAD
|
|
563
|
+
- `post_mode` - DIRECT_POST or MEDIA_UPLOAD. `MEDIA_UPLOAD` is the same draft as `tiktok_upload_to_draft=True`
|
|
561
564
|
- `brand_content_toggle` - Branded content toggle
|
|
562
565
|
- `brand_organic_toggle` - Brand organic toggle
|
|
566
|
+
- `tiktok_is_ads_only` - Only show the video in ads (alias: `is_ads_only`)
|
|
567
|
+
- `tiktok_tto_invite_link` - TikTok One invite link; needs branded content (alias: `tto_invite_link`)
|
|
563
568
|
|
|
564
569
|
> **TikTok particularity:** `privacy_level` works on video and photo posts
|
|
565
570
|
> alike, but **TikTok decides per account which values are available**. A
|
|
@@ -578,17 +583,19 @@ for the music, location, cover and draft options.
|
|
|
578
583
|
|
|
579
584
|
### TikTok (Photos)
|
|
580
585
|
- `privacy_level` - PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY
|
|
581
|
-
- `post_mode` - DIRECT_POST or MEDIA_UPLOAD
|
|
586
|
+
- `post_mode` - DIRECT_POST or MEDIA_UPLOAD. `MEDIA_UPLOAD` is the same draft as `tiktok_upload_to_draft=True`
|
|
582
587
|
- `auto_add_music` - Auto add music
|
|
583
588
|
- `photo_cover_index` - Index of photo for cover (0-based)
|
|
584
589
|
- `disable_comment` - Disable comments
|
|
585
590
|
- `tiktok_music_id` - Commercial Music Library track id
|
|
586
591
|
- `tiktok_location_id` / `tiktok_location_name` - Location tag, both required together
|
|
587
592
|
- `tiktok_is_ai_generated` - AI-generated content disclosure
|
|
593
|
+
- `tiktok_upload_to_draft` - Same draft as `post_mode="MEDIA_UPLOAD"` (aliases: `upload_to_draft`, `is_draft`)
|
|
588
594
|
|
|
589
595
|
> TikTok's photo contract takes the music track id alone: `tiktok_music_volume`,
|
|
590
|
-
> `tiktok_music_start`, `tiktok_music_end`, `tiktok_original_sound_volume
|
|
591
|
-
> `tiktok_cover_image_url`
|
|
596
|
+
> `tiktok_music_start`, `tiktok_music_end`, `tiktok_original_sound_volume` and
|
|
597
|
+
> `tiktok_cover_image_url` are video-only. `post_mode="MEDIA_UPLOAD"` and
|
|
598
|
+
> `tiktok_upload_to_draft=True` are aliases of the same draft.
|
|
592
599
|
|
|
593
600
|
### Instagram
|
|
594
601
|
- `media_type` - REELS, STORIES, IMAGE
|
|
@@ -599,6 +606,7 @@ for the music, location, cover and draft options.
|
|
|
599
606
|
- `user_tags` - Comma-separated user tags
|
|
600
607
|
- `location_id` - Location ID
|
|
601
608
|
- `thumb_offset` - Thumbnail offset
|
|
609
|
+
- `instagram_alt_text` - Alt text (string, or JSON list / one per carousel item)
|
|
602
610
|
|
|
603
611
|
### YouTube
|
|
604
612
|
- `tags` - List or comma-separated tags
|
|
@@ -616,10 +624,19 @@ for the music, location, cover and draft options.
|
|
|
616
624
|
- `hasPaidProductPlacement` - Paid placement flag
|
|
617
625
|
- `recordingDate` - Recording date (ISO 8601)
|
|
618
626
|
- `youtube_playlist_id` - Playlist ID (single string, list, or comma-separated) to add the uploaded video to after publishing
|
|
627
|
+
- `youtube_notify_subscribers` - Notify subscribers (default `true`; send `false` to skip)
|
|
628
|
+
- `youtube_publish_at` - RFC3339 time; uploads as private and schedules on YouTube
|
|
619
629
|
|
|
620
630
|
### LinkedIn
|
|
621
|
-
- `visibility` - PUBLIC, CONNECTIONS, LOGGED_IN, CONTAINER
|
|
631
|
+
- `visibility` / `linkedin_visibility` - PUBLIC, CONNECTIONS, LOGGED_IN, CONTAINER
|
|
622
632
|
- `target_linkedin_page_id` - Page ID for organization posts
|
|
633
|
+
- `linkedin_alt_text` - Alt text per image (string, JSON list, or repeated)
|
|
634
|
+
- `linkedin_disable_reshare` - Disable reshare by others
|
|
635
|
+
- `linkedin_link_title` / `linkedin_link_description` / `linkedin_thumbnail_alt_text` - Article/link-share overrides
|
|
636
|
+
- `linkedin_target_geo_locations` / `linkedin_target_industries` / `linkedin_target_seniorities` / `linkedin_target_job_functions` / `linkedin_target_staff_count_ranges` / `linkedin_target_interface_locales` / `linkedin_target_degrees` / `linkedin_target_fields_of_study` / `linkedin_target_organizations` - Page targeting (needs `target_linkedin_page_id`)
|
|
637
|
+
- `linkedin_target_entities` - Raw targeting JSON instead of the fields above
|
|
638
|
+
- `linkedin_target_check_audience` - Reject if LinkedIn reports fewer than 300 followers in the segment
|
|
639
|
+
- `linkedin_subtitles` / `linkedin_subtitles_url` / `linkedin_subtitles_text` - English SRT captions on video
|
|
623
640
|
|
|
624
641
|
### Facebook
|
|
625
642
|
- `facebook_page_id` - Facebook Page ID (required)
|
|
@@ -627,13 +644,25 @@ for the music, location, cover and draft options.
|
|
|
627
644
|
- `facebook_media_type` - REELS, STORIES, or VIDEO (normal page video)
|
|
628
645
|
- `thumbnail_url` - Thumbnail URL for normal page videos (only when `facebook_media_type` is VIDEO)
|
|
629
646
|
- `facebook_link_url` - URL for text posts
|
|
647
|
+
- `facebook_alt_text` - Alt text per photo (string, `facebook_alt_text[]`, or JSON array)
|
|
648
|
+
- `facebook_place_id` - Place id on feed/photos/videos/reels
|
|
649
|
+
- `facebook_targeting` / `facebook_feed_targeting` - JSON audience objects
|
|
650
|
+
- `facebook_call_to_action` / `facebook_child_attachments` / `facebook_multi_share_end_card` - Link post CTA and carousel
|
|
651
|
+
- `facebook_is_ai_generated` - AI-generated flag on Reels
|
|
652
|
+
- `facebook_collaborators` - Page ids to invite on Reels
|
|
653
|
+
- `facebook_unpublished_content_type` - DRAFT / INLINE_CREATED / ADS_POST on page video (`SCHEDULED` is rejected; use `scheduled_date`)
|
|
654
|
+
- `facebook_no_story` / `facebook_secret` - Page video flags
|
|
630
655
|
|
|
631
656
|
### Pinterest
|
|
632
657
|
- `pinterest_board_id` - Board ID
|
|
633
658
|
- `pinterest_link` - Destination link
|
|
634
659
|
- `pinterest_alt_text` - Alt text for photos
|
|
635
660
|
- `pinterest_cover_image_url` - Cover image URL (video)
|
|
636
|
-
- `pinterest_cover_image_key_frame_time` - Key frame time in
|
|
661
|
+
- `pinterest_cover_image_key_frame_time` - Key frame time in seconds (values larger than the video duration are treated as milliseconds)
|
|
662
|
+
- `pinterest_board_section_id` - Board section id
|
|
663
|
+
- `pinterest_ai_disclosures` - `AI_MODIFIED` and/or `SYNTHETIC_PERFORMER`
|
|
664
|
+
- `pinterest_carousel_titles` / `pinterest_carousel_descriptions` / `pinterest_carousel_links` - Per-slide carousel fields (2–5 photos)
|
|
665
|
+
- `pinterest_carousel_index` - 0-based cover slide
|
|
637
666
|
|
|
638
667
|
### X (Twitter)
|
|
639
668
|
- `reply_settings` - everyone, following, mentionedUsers, subscribers, verified
|
|
@@ -649,15 +678,30 @@ for the music, location, cover and draft options.
|
|
|
649
678
|
- `card_uri` - Card URI for Twitter Cards
|
|
650
679
|
- `x_long_text_as_post` - Post long text as single post
|
|
651
680
|
- `x_thread_image_layout` - Comma-separated image layout for thread (e.g. "4,4" or "2,3,1"). Each value 1-4, total must equal image count. Auto-chunks into groups of 4 when >4 images.
|
|
681
|
+
- `x_alt_text` - Alt text (string, `x_alt_text[]`, or JSON array; ≤1000 chars)
|
|
682
|
+
- `x_subtitles` / `x_subtitles_url` / `x_subtitles_language` / `x_subtitles_name` - Video SRT captions
|
|
683
|
+
- `x_paid_partnership` - Paid partnership flag on the first post
|
|
684
|
+
- `x_article_title` / `x_article_body` / `x_article_content_state` / `x_article_draft` / `x_article_cover_media` - X Articles (text; Premium)
|
|
652
685
|
|
|
653
686
|
### Threads
|
|
654
|
-
- `threads_long_text_as_post` - Post long text as single post (vs thread)
|
|
655
|
-
- `threads_thread_media_layout` - Comma-separated list of how many media items to include in each Threads post (e.g. "5,5" or "3,4,3"). Each value
|
|
687
|
+
- `threads_long_text_as_post` - Post long text as single post (vs thread). Over 500 UTF-8 bytes this sends an official long post instead of truncating.
|
|
688
|
+
- `threads_thread_media_layout` - Comma-separated list of how many media items to include in each Threads post (e.g. "5,5" or "3,4,3"). Each value 0-20, total must equal media count. Auto-chunks into groups of 20 when >20 items.
|
|
656
689
|
- `threads_topic_tag` - Topic tag for the Threads post (1-50 characters, no periods or ampersands). One tag per post. Helps increase reach.
|
|
690
|
+
- `threads_reply_control` - Who can reply: `everyone`, `accounts_you_follow`, `mentioned_only`, `parent_post_author_only`, `followers_only`
|
|
691
|
+
- `threads_alt_text` - Alt text per image/video (`threads_alt_text[]`)
|
|
692
|
+
- `threads_reply_to_id` / `threads_quote_post_id` - Reply or quote
|
|
693
|
+
- `threads_link_attachment` - Force link preview (text)
|
|
694
|
+
- `threads_poll_options` - 2–4 poll options (text)
|
|
695
|
+
- `threads_auto_publish_text` - Skip the second publish call on text posts
|
|
657
696
|
|
|
658
697
|
### Reddit
|
|
698
|
+
Reddit uploads currently return `error_code=reddit_unavailable` until the Reddit app is restored.
|
|
699
|
+
|
|
659
700
|
- `subreddit` - Subreddit name (without r/)
|
|
660
701
|
- `flair_id` - Flair template ID
|
|
702
|
+
- `reddit_nsfw` / `reddit_spoiler` / `reddit_resubmit` / `reddit_send_replies` - Booleans
|
|
703
|
+
- `reddit_flair_text` - Custom text for editable flairs
|
|
704
|
+
- `reddit_gallery_captions` / `reddit_gallery_urls` - Per-image gallery caption and outbound URL
|
|
661
705
|
|
|
662
706
|
### Google Business
|
|
663
707
|
- `gbp_location_id` - Location, e.g. `"accounts/123/locations/456"` (list them with `get_google_business_locations`). Required when the account has more than one location; the API only auto-selects when exactly one exists.
|
|
@@ -668,6 +712,8 @@ for the music, location, cover and draft options.
|
|
|
668
712
|
- `gbp_cta_type` / `gbp_cta_url` - Call-to-action button
|
|
669
713
|
- `gbp_event_title` / `gbp_event_start_date` / `gbp_event_start_time` / `gbp_event_end_date` / `gbp_event_end_time` - Used with `gbp_topic_type="EVENT"`
|
|
670
714
|
- `gbp_offer_coupon` / `gbp_offer_redeem_url` / `gbp_offer_terms` - Used with `gbp_topic_type="OFFER"`
|
|
715
|
+
- `gbp_coupon_code` / `gbp_redeem_url` / `gbp_terms` - Aliases of the offer fields above (legacy names still win if both are sent)
|
|
716
|
+
- `gbp_language_code` - BCP-47 language (default `en`)
|
|
671
717
|
|
|
672
718
|
```python
|
|
673
719
|
locations = client.get_google_business_locations("my-profile")
|
|
@@ -683,6 +729,66 @@ client.upload_photos(
|
|
|
683
729
|
)
|
|
684
730
|
```
|
|
685
731
|
|
|
732
|
+
### Bluesky
|
|
733
|
+
- `bluesky_link_url` - External embed link preview (text)
|
|
734
|
+
- `bluesky_alt_text` - Alt text per image/video (JSON array, `||`-separated, or string)
|
|
735
|
+
- `bluesky_langs` - Comma list, max 3 BCP-47 codes
|
|
736
|
+
- `bluesky_labels` - `porn`, `sexual`, `nudity`, `graphic-media`
|
|
737
|
+
- `bluesky_gallery` - Publish up to 20 images as a gallery (`false` keeps the first 4)
|
|
738
|
+
- `bluesky_threadgate` / `bluesky_reply_settings` - Who can reply
|
|
739
|
+
- `bluesky_postgate` / `bluesky_quote_settings` - `disable_quotes` to block quotes
|
|
740
|
+
- `bluesky_quote_uri` / `bluesky_quote_id` / `bluesky_quote_url` - Quote another post
|
|
741
|
+
|
|
742
|
+
### Discord
|
|
743
|
+
- `discord_thread_id` / `discord_thread_name` / `discord_applied_tags` - Thread or forum post
|
|
744
|
+
- `discord_embeds` / `discord_poll` / `discord_allowed_mentions` - JSON
|
|
745
|
+
- `discord_username` / `discord_avatar_url` - Per-post webhook identity
|
|
746
|
+
- `discord_alt_text` / `discord_flags` / `discord_tts` / `discord_max_file_mb`
|
|
747
|
+
|
|
748
|
+
### Telegram
|
|
749
|
+
- `telegram_parse_mode` - `MarkdownV2` or `HTML`
|
|
750
|
+
- `telegram_message_thread_id` - Forum topic
|
|
751
|
+
- `telegram_disable_notification` / `telegram_protect_content` / `telegram_has_spoiler` / `telegram_pin`
|
|
752
|
+
- `telegram_link_preview` / `telegram_reply_markup` / `telegram_as_document`
|
|
753
|
+
- `telegram_caption_overflow` - `truncate` (default) or `split`
|
|
754
|
+
- `telegram_media_urls` - Comma-separated public URLs for a mixed album
|
|
755
|
+
|
|
756
|
+
### Mastodon
|
|
757
|
+
- `mastodon_visibility` / `mastodon_sensitive` / `mastodon_spoiler_text` / `mastodon_language`
|
|
758
|
+
- `mastodon_alt_text` - `|`-separated for albums
|
|
759
|
+
- `mastodon_poll_options` / `mastodon_poll_expires_in` / `mastodon_poll_multiple`
|
|
760
|
+
- `mastodon_scheduled_at` - ISO 8601, at least 5 minutes ahead
|
|
761
|
+
|
|
762
|
+
### WordPress
|
|
763
|
+
- `wordpress_status` / `wordpress_date` - `publish`, `draft`, `pending`, `future` (`date` required for `future`)
|
|
764
|
+
- `wordpress_categories` / `wordpress_tags` / `wordpress_excerpt` / `wordpress_slug`
|
|
765
|
+
- `wordpress_alt_text` / `wordpress_media_caption` / `wordpress_block_format`
|
|
766
|
+
|
|
767
|
+
### Lemmy
|
|
768
|
+
- `lemmy_url` / `lemmy_community` / `lemmy_nsfw` / `lemmy_language_id` / `lemmy_alt_text`
|
|
769
|
+
|
|
770
|
+
### Slack
|
|
771
|
+
- `slack_markdown` / `slack_mrkdwn` / `slack_blocks` / `slack_alt_text`
|
|
772
|
+
- `slack_first_comment_mode` - `separate` (default) or `inline`
|
|
773
|
+
|
|
774
|
+
### Nostr
|
|
775
|
+
- `nostr_kind` - `1` default, `20` picture, `22` short video, `34235` video, `30023` long-form
|
|
776
|
+
- `nostr_long_form` - Shorthand for kind 30023
|
|
777
|
+
|
|
778
|
+
### Dev.to
|
|
779
|
+
- `devto_tags` / `devto_canonical_url` / `devto_description` / `devto_main_image` / `devto_series` / `devto_published`
|
|
780
|
+
|
|
781
|
+
### Hashnode
|
|
782
|
+
- `hashnode_body` / `content` - Article body
|
|
783
|
+
- `hashnode_tags` / `hashnode_original_article_url` / `hashnode_subtitle` / `hashnode_cover_image_url` / `hashnode_draft`
|
|
784
|
+
|
|
785
|
+
### Whop
|
|
786
|
+
- `whop_body` / `whop_pinned` / `whop_is_mention` / `whop_paywall_amount` / `whop_paywall_currency` / `whop_attachment_ids`
|
|
787
|
+
|
|
788
|
+
### Listmonk
|
|
789
|
+
- `listmonk_content_type` - `richtext` (default), `markdown`, `html`, `plain`
|
|
790
|
+
- `listmonk_send_at` / `listmonk_lists` / `listmonk_template_id` / `listmonk_media_ids`
|
|
791
|
+
|
|
686
792
|
## Common Options
|
|
687
793
|
|
|
688
794
|
These options work across all upload methods:
|
|
@@ -443,7 +443,7 @@ TikTok account; check it before offering a feature.
|
|
|
443
443
|
| `location` | `tiktok_location_id` / `tiktok_location_name`, plus `get_tiktok_locations()` |
|
|
444
444
|
| `cover_image` | `tiktok_cover_image_url` |
|
|
445
445
|
| `cover_timestamp` | `cover_timestamp` |
|
|
446
|
-
| `draft` | `tiktok_upload_to_draft` |
|
|
446
|
+
| `draft` | `tiktok_upload_to_draft` or `post_mode="MEDIA_UPLOAD"` (same draft) |
|
|
447
447
|
| `video_privacy` | `privacy_level` on video |
|
|
448
448
|
| `photo_privacy` | `privacy_level` on photo posts |
|
|
449
449
|
| `profile_analytics` | `get_audience()` and `get_suggestions(type="hashtags")` with `platform="tiktok"` |
|
|
@@ -490,7 +490,7 @@ client.upload_video(
|
|
|
490
490
|
|
|
491
491
|
tiktok_cover_image_url="https://example.com/cover.jpg",
|
|
492
492
|
tiktok_is_ai_generated=False,
|
|
493
|
-
tiktok_upload_to_draft=False,
|
|
493
|
+
tiktok_upload_to_draft=False, # same draft as post_mode="MEDIA_UPLOAD"
|
|
494
494
|
)
|
|
495
495
|
```
|
|
496
496
|
|
|
@@ -506,10 +506,13 @@ client.upload_video(
|
|
|
506
506
|
| `tiktok_location_id` | str | `location` | Video + photos. `location_id` from `get_tiktok_locations()` |
|
|
507
507
|
| `tiktok_location_name` | str | `location` | Required whenever `tiktok_location_id` is set |
|
|
508
508
|
| `tiktok_cover_image_url` | str | `cover_image` | Video only. Custom cover image URL |
|
|
509
|
-
| `tiktok_is_ai_generated` | bool | — | Video + photos. AI-generated content disclosure |
|
|
510
|
-
| `tiktok_upload_to_draft` | bool | `draft` | Video
|
|
509
|
+
| `tiktok_is_ai_generated` | bool | — | Video + photos. AI-generated content disclosure (aliases: `is_ai_generated`) |
|
|
510
|
+
| `tiktok_upload_to_draft` | bool | `draft` | Video + photos. Same draft as `post_mode="MEDIA_UPLOAD"` (aliases: `upload_to_draft`, `is_draft`). TikTok ignores the rest of the post settings |
|
|
511
|
+
| `tiktok_is_ads_only` | bool | — | Video. Only show in ads (alias: `is_ads_only`) |
|
|
512
|
+
| `tiktok_tto_invite_link` | str | — | Video. TikTok One invite link; needs branded content (alias: `tto_invite_link`) |
|
|
511
513
|
| `photo_cover_index` | int | — | Cover photo index for photo posts (0-based) |
|
|
512
514
|
| `privacy_level` | str | `photo_privacy` / `video_privacy` | Accepted on video and photo posts alike; which values the account may use is decided by TikTok, see the note below |
|
|
515
|
+
| `post_mode` | str | `draft` | `DIRECT_POST` or `MEDIA_UPLOAD`. `MEDIA_UPLOAD` is the same draft as `tiktok_upload_to_draft=True` |
|
|
513
516
|
|
|
514
517
|
## Platform-Specific Options
|
|
515
518
|
|
|
@@ -519,9 +522,11 @@ client.upload_video(
|
|
|
519
522
|
- `disable_stitch` - Disable stitch
|
|
520
523
|
- `cover_timestamp` - Timestamp in ms for cover
|
|
521
524
|
- `is_aigc` - AI-generated content flag
|
|
522
|
-
- `post_mode` - DIRECT_POST or MEDIA_UPLOAD
|
|
525
|
+
- `post_mode` - DIRECT_POST or MEDIA_UPLOAD. `MEDIA_UPLOAD` is the same draft as `tiktok_upload_to_draft=True`
|
|
523
526
|
- `brand_content_toggle` - Branded content toggle
|
|
524
527
|
- `brand_organic_toggle` - Brand organic toggle
|
|
528
|
+
- `tiktok_is_ads_only` - Only show the video in ads (alias: `is_ads_only`)
|
|
529
|
+
- `tiktok_tto_invite_link` - TikTok One invite link; needs branded content (alias: `tto_invite_link`)
|
|
525
530
|
|
|
526
531
|
> **TikTok particularity:** `privacy_level` works on video and photo posts
|
|
527
532
|
> alike, but **TikTok decides per account which values are available**. A
|
|
@@ -540,17 +545,19 @@ for the music, location, cover and draft options.
|
|
|
540
545
|
|
|
541
546
|
### TikTok (Photos)
|
|
542
547
|
- `privacy_level` - PUBLIC_TO_EVERYONE, MUTUAL_FOLLOW_FRIENDS, FOLLOWER_OF_CREATOR, SELF_ONLY
|
|
543
|
-
- `post_mode` - DIRECT_POST or MEDIA_UPLOAD
|
|
548
|
+
- `post_mode` - DIRECT_POST or MEDIA_UPLOAD. `MEDIA_UPLOAD` is the same draft as `tiktok_upload_to_draft=True`
|
|
544
549
|
- `auto_add_music` - Auto add music
|
|
545
550
|
- `photo_cover_index` - Index of photo for cover (0-based)
|
|
546
551
|
- `disable_comment` - Disable comments
|
|
547
552
|
- `tiktok_music_id` - Commercial Music Library track id
|
|
548
553
|
- `tiktok_location_id` / `tiktok_location_name` - Location tag, both required together
|
|
549
554
|
- `tiktok_is_ai_generated` - AI-generated content disclosure
|
|
555
|
+
- `tiktok_upload_to_draft` - Same draft as `post_mode="MEDIA_UPLOAD"` (aliases: `upload_to_draft`, `is_draft`)
|
|
550
556
|
|
|
551
557
|
> TikTok's photo contract takes the music track id alone: `tiktok_music_volume`,
|
|
552
|
-
> `tiktok_music_start`, `tiktok_music_end`, `tiktok_original_sound_volume
|
|
553
|
-
> `tiktok_cover_image_url`
|
|
558
|
+
> `tiktok_music_start`, `tiktok_music_end`, `tiktok_original_sound_volume` and
|
|
559
|
+
> `tiktok_cover_image_url` are video-only. `post_mode="MEDIA_UPLOAD"` and
|
|
560
|
+
> `tiktok_upload_to_draft=True` are aliases of the same draft.
|
|
554
561
|
|
|
555
562
|
### Instagram
|
|
556
563
|
- `media_type` - REELS, STORIES, IMAGE
|
|
@@ -561,6 +568,7 @@ for the music, location, cover and draft options.
|
|
|
561
568
|
- `user_tags` - Comma-separated user tags
|
|
562
569
|
- `location_id` - Location ID
|
|
563
570
|
- `thumb_offset` - Thumbnail offset
|
|
571
|
+
- `instagram_alt_text` - Alt text (string, or JSON list / one per carousel item)
|
|
564
572
|
|
|
565
573
|
### YouTube
|
|
566
574
|
- `tags` - List or comma-separated tags
|
|
@@ -578,10 +586,19 @@ for the music, location, cover and draft options.
|
|
|
578
586
|
- `hasPaidProductPlacement` - Paid placement flag
|
|
579
587
|
- `recordingDate` - Recording date (ISO 8601)
|
|
580
588
|
- `youtube_playlist_id` - Playlist ID (single string, list, or comma-separated) to add the uploaded video to after publishing
|
|
589
|
+
- `youtube_notify_subscribers` - Notify subscribers (default `true`; send `false` to skip)
|
|
590
|
+
- `youtube_publish_at` - RFC3339 time; uploads as private and schedules on YouTube
|
|
581
591
|
|
|
582
592
|
### LinkedIn
|
|
583
|
-
- `visibility` - PUBLIC, CONNECTIONS, LOGGED_IN, CONTAINER
|
|
593
|
+
- `visibility` / `linkedin_visibility` - PUBLIC, CONNECTIONS, LOGGED_IN, CONTAINER
|
|
584
594
|
- `target_linkedin_page_id` - Page ID for organization posts
|
|
595
|
+
- `linkedin_alt_text` - Alt text per image (string, JSON list, or repeated)
|
|
596
|
+
- `linkedin_disable_reshare` - Disable reshare by others
|
|
597
|
+
- `linkedin_link_title` / `linkedin_link_description` / `linkedin_thumbnail_alt_text` - Article/link-share overrides
|
|
598
|
+
- `linkedin_target_geo_locations` / `linkedin_target_industries` / `linkedin_target_seniorities` / `linkedin_target_job_functions` / `linkedin_target_staff_count_ranges` / `linkedin_target_interface_locales` / `linkedin_target_degrees` / `linkedin_target_fields_of_study` / `linkedin_target_organizations` - Page targeting (needs `target_linkedin_page_id`)
|
|
599
|
+
- `linkedin_target_entities` - Raw targeting JSON instead of the fields above
|
|
600
|
+
- `linkedin_target_check_audience` - Reject if LinkedIn reports fewer than 300 followers in the segment
|
|
601
|
+
- `linkedin_subtitles` / `linkedin_subtitles_url` / `linkedin_subtitles_text` - English SRT captions on video
|
|
585
602
|
|
|
586
603
|
### Facebook
|
|
587
604
|
- `facebook_page_id` - Facebook Page ID (required)
|
|
@@ -589,13 +606,25 @@ for the music, location, cover and draft options.
|
|
|
589
606
|
- `facebook_media_type` - REELS, STORIES, or VIDEO (normal page video)
|
|
590
607
|
- `thumbnail_url` - Thumbnail URL for normal page videos (only when `facebook_media_type` is VIDEO)
|
|
591
608
|
- `facebook_link_url` - URL for text posts
|
|
609
|
+
- `facebook_alt_text` - Alt text per photo (string, `facebook_alt_text[]`, or JSON array)
|
|
610
|
+
- `facebook_place_id` - Place id on feed/photos/videos/reels
|
|
611
|
+
- `facebook_targeting` / `facebook_feed_targeting` - JSON audience objects
|
|
612
|
+
- `facebook_call_to_action` / `facebook_child_attachments` / `facebook_multi_share_end_card` - Link post CTA and carousel
|
|
613
|
+
- `facebook_is_ai_generated` - AI-generated flag on Reels
|
|
614
|
+
- `facebook_collaborators` - Page ids to invite on Reels
|
|
615
|
+
- `facebook_unpublished_content_type` - DRAFT / INLINE_CREATED / ADS_POST on page video (`SCHEDULED` is rejected; use `scheduled_date`)
|
|
616
|
+
- `facebook_no_story` / `facebook_secret` - Page video flags
|
|
592
617
|
|
|
593
618
|
### Pinterest
|
|
594
619
|
- `pinterest_board_id` - Board ID
|
|
595
620
|
- `pinterest_link` - Destination link
|
|
596
621
|
- `pinterest_alt_text` - Alt text for photos
|
|
597
622
|
- `pinterest_cover_image_url` - Cover image URL (video)
|
|
598
|
-
- `pinterest_cover_image_key_frame_time` - Key frame time in
|
|
623
|
+
- `pinterest_cover_image_key_frame_time` - Key frame time in seconds (values larger than the video duration are treated as milliseconds)
|
|
624
|
+
- `pinterest_board_section_id` - Board section id
|
|
625
|
+
- `pinterest_ai_disclosures` - `AI_MODIFIED` and/or `SYNTHETIC_PERFORMER`
|
|
626
|
+
- `pinterest_carousel_titles` / `pinterest_carousel_descriptions` / `pinterest_carousel_links` - Per-slide carousel fields (2–5 photos)
|
|
627
|
+
- `pinterest_carousel_index` - 0-based cover slide
|
|
599
628
|
|
|
600
629
|
### X (Twitter)
|
|
601
630
|
- `reply_settings` - everyone, following, mentionedUsers, subscribers, verified
|
|
@@ -611,15 +640,30 @@ for the music, location, cover and draft options.
|
|
|
611
640
|
- `card_uri` - Card URI for Twitter Cards
|
|
612
641
|
- `x_long_text_as_post` - Post long text as single post
|
|
613
642
|
- `x_thread_image_layout` - Comma-separated image layout for thread (e.g. "4,4" or "2,3,1"). Each value 1-4, total must equal image count. Auto-chunks into groups of 4 when >4 images.
|
|
643
|
+
- `x_alt_text` - Alt text (string, `x_alt_text[]`, or JSON array; ≤1000 chars)
|
|
644
|
+
- `x_subtitles` / `x_subtitles_url` / `x_subtitles_language` / `x_subtitles_name` - Video SRT captions
|
|
645
|
+
- `x_paid_partnership` - Paid partnership flag on the first post
|
|
646
|
+
- `x_article_title` / `x_article_body` / `x_article_content_state` / `x_article_draft` / `x_article_cover_media` - X Articles (text; Premium)
|
|
614
647
|
|
|
615
648
|
### Threads
|
|
616
|
-
- `threads_long_text_as_post` - Post long text as single post (vs thread)
|
|
617
|
-
- `threads_thread_media_layout` - Comma-separated list of how many media items to include in each Threads post (e.g. "5,5" or "3,4,3"). Each value
|
|
649
|
+
- `threads_long_text_as_post` - Post long text as single post (vs thread). Over 500 UTF-8 bytes this sends an official long post instead of truncating.
|
|
650
|
+
- `threads_thread_media_layout` - Comma-separated list of how many media items to include in each Threads post (e.g. "5,5" or "3,4,3"). Each value 0-20, total must equal media count. Auto-chunks into groups of 20 when >20 items.
|
|
618
651
|
- `threads_topic_tag` - Topic tag for the Threads post (1-50 characters, no periods or ampersands). One tag per post. Helps increase reach.
|
|
652
|
+
- `threads_reply_control` - Who can reply: `everyone`, `accounts_you_follow`, `mentioned_only`, `parent_post_author_only`, `followers_only`
|
|
653
|
+
- `threads_alt_text` - Alt text per image/video (`threads_alt_text[]`)
|
|
654
|
+
- `threads_reply_to_id` / `threads_quote_post_id` - Reply or quote
|
|
655
|
+
- `threads_link_attachment` - Force link preview (text)
|
|
656
|
+
- `threads_poll_options` - 2–4 poll options (text)
|
|
657
|
+
- `threads_auto_publish_text` - Skip the second publish call on text posts
|
|
619
658
|
|
|
620
659
|
### Reddit
|
|
660
|
+
Reddit uploads currently return `error_code=reddit_unavailable` until the Reddit app is restored.
|
|
661
|
+
|
|
621
662
|
- `subreddit` - Subreddit name (without r/)
|
|
622
663
|
- `flair_id` - Flair template ID
|
|
664
|
+
- `reddit_nsfw` / `reddit_spoiler` / `reddit_resubmit` / `reddit_send_replies` - Booleans
|
|
665
|
+
- `reddit_flair_text` - Custom text for editable flairs
|
|
666
|
+
- `reddit_gallery_captions` / `reddit_gallery_urls` - Per-image gallery caption and outbound URL
|
|
623
667
|
|
|
624
668
|
### Google Business
|
|
625
669
|
- `gbp_location_id` - Location, e.g. `"accounts/123/locations/456"` (list them with `get_google_business_locations`). Required when the account has more than one location; the API only auto-selects when exactly one exists.
|
|
@@ -630,6 +674,8 @@ for the music, location, cover and draft options.
|
|
|
630
674
|
- `gbp_cta_type` / `gbp_cta_url` - Call-to-action button
|
|
631
675
|
- `gbp_event_title` / `gbp_event_start_date` / `gbp_event_start_time` / `gbp_event_end_date` / `gbp_event_end_time` - Used with `gbp_topic_type="EVENT"`
|
|
632
676
|
- `gbp_offer_coupon` / `gbp_offer_redeem_url` / `gbp_offer_terms` - Used with `gbp_topic_type="OFFER"`
|
|
677
|
+
- `gbp_coupon_code` / `gbp_redeem_url` / `gbp_terms` - Aliases of the offer fields above (legacy names still win if both are sent)
|
|
678
|
+
- `gbp_language_code` - BCP-47 language (default `en`)
|
|
633
679
|
|
|
634
680
|
```python
|
|
635
681
|
locations = client.get_google_business_locations("my-profile")
|
|
@@ -645,6 +691,66 @@ client.upload_photos(
|
|
|
645
691
|
)
|
|
646
692
|
```
|
|
647
693
|
|
|
694
|
+
### Bluesky
|
|
695
|
+
- `bluesky_link_url` - External embed link preview (text)
|
|
696
|
+
- `bluesky_alt_text` - Alt text per image/video (JSON array, `||`-separated, or string)
|
|
697
|
+
- `bluesky_langs` - Comma list, max 3 BCP-47 codes
|
|
698
|
+
- `bluesky_labels` - `porn`, `sexual`, `nudity`, `graphic-media`
|
|
699
|
+
- `bluesky_gallery` - Publish up to 20 images as a gallery (`false` keeps the first 4)
|
|
700
|
+
- `bluesky_threadgate` / `bluesky_reply_settings` - Who can reply
|
|
701
|
+
- `bluesky_postgate` / `bluesky_quote_settings` - `disable_quotes` to block quotes
|
|
702
|
+
- `bluesky_quote_uri` / `bluesky_quote_id` / `bluesky_quote_url` - Quote another post
|
|
703
|
+
|
|
704
|
+
### Discord
|
|
705
|
+
- `discord_thread_id` / `discord_thread_name` / `discord_applied_tags` - Thread or forum post
|
|
706
|
+
- `discord_embeds` / `discord_poll` / `discord_allowed_mentions` - JSON
|
|
707
|
+
- `discord_username` / `discord_avatar_url` - Per-post webhook identity
|
|
708
|
+
- `discord_alt_text` / `discord_flags` / `discord_tts` / `discord_max_file_mb`
|
|
709
|
+
|
|
710
|
+
### Telegram
|
|
711
|
+
- `telegram_parse_mode` - `MarkdownV2` or `HTML`
|
|
712
|
+
- `telegram_message_thread_id` - Forum topic
|
|
713
|
+
- `telegram_disable_notification` / `telegram_protect_content` / `telegram_has_spoiler` / `telegram_pin`
|
|
714
|
+
- `telegram_link_preview` / `telegram_reply_markup` / `telegram_as_document`
|
|
715
|
+
- `telegram_caption_overflow` - `truncate` (default) or `split`
|
|
716
|
+
- `telegram_media_urls` - Comma-separated public URLs for a mixed album
|
|
717
|
+
|
|
718
|
+
### Mastodon
|
|
719
|
+
- `mastodon_visibility` / `mastodon_sensitive` / `mastodon_spoiler_text` / `mastodon_language`
|
|
720
|
+
- `mastodon_alt_text` - `|`-separated for albums
|
|
721
|
+
- `mastodon_poll_options` / `mastodon_poll_expires_in` / `mastodon_poll_multiple`
|
|
722
|
+
- `mastodon_scheduled_at` - ISO 8601, at least 5 minutes ahead
|
|
723
|
+
|
|
724
|
+
### WordPress
|
|
725
|
+
- `wordpress_status` / `wordpress_date` - `publish`, `draft`, `pending`, `future` (`date` required for `future`)
|
|
726
|
+
- `wordpress_categories` / `wordpress_tags` / `wordpress_excerpt` / `wordpress_slug`
|
|
727
|
+
- `wordpress_alt_text` / `wordpress_media_caption` / `wordpress_block_format`
|
|
728
|
+
|
|
729
|
+
### Lemmy
|
|
730
|
+
- `lemmy_url` / `lemmy_community` / `lemmy_nsfw` / `lemmy_language_id` / `lemmy_alt_text`
|
|
731
|
+
|
|
732
|
+
### Slack
|
|
733
|
+
- `slack_markdown` / `slack_mrkdwn` / `slack_blocks` / `slack_alt_text`
|
|
734
|
+
- `slack_first_comment_mode` - `separate` (default) or `inline`
|
|
735
|
+
|
|
736
|
+
### Nostr
|
|
737
|
+
- `nostr_kind` - `1` default, `20` picture, `22` short video, `34235` video, `30023` long-form
|
|
738
|
+
- `nostr_long_form` - Shorthand for kind 30023
|
|
739
|
+
|
|
740
|
+
### Dev.to
|
|
741
|
+
- `devto_tags` / `devto_canonical_url` / `devto_description` / `devto_main_image` / `devto_series` / `devto_published`
|
|
742
|
+
|
|
743
|
+
### Hashnode
|
|
744
|
+
- `hashnode_body` / `content` - Article body
|
|
745
|
+
- `hashnode_tags` / `hashnode_original_article_url` / `hashnode_subtitle` / `hashnode_cover_image_url` / `hashnode_draft`
|
|
746
|
+
|
|
747
|
+
### Whop
|
|
748
|
+
- `whop_body` / `whop_pinned` / `whop_is_mention` / `whop_paywall_amount` / `whop_paywall_currency` / `whop_attachment_ids`
|
|
749
|
+
|
|
750
|
+
### Listmonk
|
|
751
|
+
- `listmonk_content_type` - `richtext` (default), `markdown`, `html`, `plain`
|
|
752
|
+
- `listmonk_send_at` / `listmonk_lists` / `listmonk_template_id` / `listmonk_media_ids`
|
|
753
|
+
|
|
648
754
|
## Common Options
|
|
649
755
|
|
|
650
756
|
These options work across all upload methods:
|
|
@@ -5,7 +5,7 @@ with open("README.md", "r", encoding="utf-8") as fh:
|
|
|
5
5
|
|
|
6
6
|
setup(
|
|
7
7
|
name="upload-post",
|
|
8
|
-
version="2.
|
|
8
|
+
version="2.13.0",
|
|
9
9
|
author="Upload-Post",
|
|
10
10
|
author_email="hi@img2html.com",
|
|
11
11
|
description="Cross-platform social media upload for TikTok, Instagram, YouTube, LinkedIn, Facebook, Pinterest, Threads, Reddit, Bluesky, Discord, Telegram, and X (Twitter)",
|