marqetive-lib 0.1.15__tar.gz → 0.1.17__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.
Files changed (38) hide show
  1. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/PKG-INFO +1 -1
  2. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/pyproject.toml +1 -1
  3. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/platforms/instagram/client.py +45 -8
  4. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/platforms/linkedin/client.py +10 -2
  5. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/platforms/tiktok/client.py +3 -9
  6. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/README.md +0 -0
  7. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/__init__.py +0 -0
  8. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/core/__init__.py +0 -0
  9. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/core/base.py +0 -0
  10. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/core/client.py +0 -0
  11. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/core/exceptions.py +0 -0
  12. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/core/models.py +0 -0
  13. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/factory.py +0 -0
  14. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/platforms/__init__.py +0 -0
  15. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/platforms/instagram/__init__.py +0 -0
  16. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/platforms/instagram/exceptions.py +0 -0
  17. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/platforms/instagram/media.py +0 -0
  18. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/platforms/instagram/models.py +0 -0
  19. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/platforms/linkedin/__init__.py +0 -0
  20. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/platforms/linkedin/exceptions.py +0 -0
  21. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/platforms/linkedin/media.py +0 -0
  22. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/platforms/linkedin/models.py +0 -0
  23. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/platforms/tiktok/__init__.py +0 -0
  24. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/platforms/tiktok/exceptions.py +0 -0
  25. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/platforms/tiktok/media.py +0 -0
  26. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/platforms/tiktok/models.py +0 -0
  27. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/platforms/twitter/__init__.py +0 -0
  28. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/platforms/twitter/client.py +0 -0
  29. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/platforms/twitter/exceptions.py +0 -0
  30. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/platforms/twitter/media.py +0 -0
  31. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/platforms/twitter/models.py +0 -0
  32. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/py.typed +0 -0
  33. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/utils/__init__.py +0 -0
  34. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/utils/file_handlers.py +0 -0
  35. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/utils/helpers.py +0 -0
  36. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/utils/media.py +0 -0
  37. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/utils/oauth.py +0 -0
  38. {marqetive_lib-0.1.15 → marqetive_lib-0.1.17}/src/marqetive/utils/retry.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: marqetive-lib
3
- Version: 0.1.15
3
+ Version: 0.1.17
4
4
  Summary: Modern Python utilities for web APIs
5
5
  Keywords: api,utilities,web,http,marqetive
6
6
  Requires-Python: >=3.12
@@ -4,7 +4,7 @@ build-backend = "poetry.core.masonry.api"
4
4
 
5
5
  [project]
6
6
  name = "marqetive-lib"
7
- version = "0.1.15"
7
+ version = "0.1.17"
8
8
  description = "Modern Python utilities for web APIs"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.12"
@@ -314,10 +314,17 @@ class InstagramClient(SocialMediaPlatform):
314
314
  if media_type_str in type_map:
315
315
  return type_map[media_type_str]
316
316
 
317
- # Auto-detect: multiple URLs = carousel, single = image
317
+ # Auto-detect from URL extension and count
318
318
  if len(request.media_urls) > 1:
319
319
  return MediaType.CAROUSEL
320
320
 
321
+ # Check if single media is a video (should be treated as reel)
322
+ if request.media_urls:
323
+ url_lower = request.media_urls[0].lower()
324
+ video_extensions = (".mp4", ".mov", ".avi", ".webm", ".m4v")
325
+ if any(url_lower.endswith(ext) for ext in video_extensions):
326
+ return MediaType.REEL
327
+
321
328
  return MediaType.IMAGE
322
329
 
323
330
  async def _create_single_image_post(self, request: PostCreateRequest) -> Post:
@@ -360,7 +367,16 @@ class InstagramClient(SocialMediaPlatform):
360
367
  )
361
368
 
362
369
  result = await self._media_manager.publish_container(container_ids[0])
363
- return await self.get_post(result.media_id)
370
+
371
+ # Return minimal Post object without fetching details
372
+ return Post(
373
+ post_id=result.media_id,
374
+ platform=self.platform_name,
375
+ content=request.content,
376
+ status=PostStatus.PUBLISHED,
377
+ created_at=datetime.now(),
378
+ url=cast(HttpUrl, result.permalink) if result.permalink else None,
379
+ )
364
380
 
365
381
  async def _create_carousel_post(self, request: PostCreateRequest) -> Post:
366
382
  """Create a carousel post (2-10 images).
@@ -803,8 +819,15 @@ class InstagramClient(SocialMediaPlatform):
803
819
  # Publish
804
820
  result = await self._media_manager.publish_container(container_ids[0])
805
821
 
806
- # Fetch and return post
807
- return await self.get_post(result.media_id)
822
+ # Return minimal Post object without fetching details
823
+ return Post(
824
+ post_id=result.media_id,
825
+ platform=self.platform_name,
826
+ content=caption,
827
+ status=PostStatus.PUBLISHED,
828
+ created_at=datetime.now(),
829
+ url=cast(HttpUrl, result.permalink) if result.permalink else None,
830
+ )
808
831
 
809
832
  async def create_reel(
810
833
  self,
@@ -860,8 +883,15 @@ class InstagramClient(SocialMediaPlatform):
860
883
  # Publish
861
884
  result = await self._media_manager.publish_container(container_id)
862
885
 
863
- # Fetch and return post
864
- return await self.get_post(result.media_id)
886
+ # Return minimal Post object without fetching details
887
+ return Post(
888
+ post_id=result.media_id,
889
+ platform=self.platform_name,
890
+ content=caption,
891
+ status=PostStatus.PUBLISHED,
892
+ created_at=datetime.now(),
893
+ url=cast(HttpUrl, result.permalink) if result.permalink else None,
894
+ )
865
895
 
866
896
  async def create_story(
867
897
  self,
@@ -904,8 +934,15 @@ class InstagramClient(SocialMediaPlatform):
904
934
  # Publish
905
935
  result = await self._media_manager.publish_container(container_id)
906
936
 
907
- # Fetch and return post
908
- return await self.get_post(result.media_id)
937
+ # Return minimal Post object without fetching details
938
+ return Post(
939
+ post_id=result.media_id,
940
+ platform=self.platform_name,
941
+ content=None, # Stories don't have captions
942
+ status=PostStatus.PUBLISHED,
943
+ created_at=datetime.now(),
944
+ url=cast(HttpUrl, result.permalink) if result.permalink else None,
945
+ )
909
946
 
910
947
  # ==================== Helper Methods ====================
911
948
 
@@ -426,8 +426,16 @@ class LinkedInClient(SocialMediaPlatform):
426
426
  platform=self.platform_name,
427
427
  )
428
428
 
429
- # Fetch full post details
430
- return await self.get_post(post_id)
429
+ # Return minimal Post object without fetching details
430
+ return Post(
431
+ post_id=post_id,
432
+ platform=self.platform_name,
433
+ content=request.content or "",
434
+ status=PostStatus.PUBLISHED,
435
+ created_at=datetime.now(),
436
+ author_id=self.author_urn,
437
+ raw_data=response.data,
438
+ )
431
439
 
432
440
  except httpx.HTTPError as e:
433
441
  raise PlatformError(
@@ -231,24 +231,18 @@ class TikTokClient(SocialMediaPlatform):
231
231
  wait_for_publish=True,
232
232
  )
233
233
 
234
- # 4. Return post - either fetch full details or create minimal Post
235
- if upload_result.video_id:
236
- # Fetch the created post to return full Post object
237
- return await self.get_post(upload_result.video_id)
238
-
239
- # For private/SELF_ONLY posts, TikTok may not return video_id
240
- # Return a minimal Post object with publish_id
234
+ # 4. Return minimal Post object without fetching details
241
235
  return Post(
242
- post_id=upload_result.publish_id,
236
+ post_id=upload_result.video_id or upload_result.publish_id,
243
237
  platform=self.platform_name,
244
238
  content=request.content,
245
239
  status=PostStatus.PUBLISHED,
246
240
  created_at=datetime.now(),
247
241
  raw_data={
248
242
  "publish_id": upload_result.publish_id,
243
+ "video_id": upload_result.video_id,
249
244
  "upload_status": upload_result.status,
250
245
  "privacy_level": privacy_level.value,
251
- "note": "Video published but video_id not returned (common for private posts)",
252
246
  },
253
247
  )
254
248
 
File without changes