marqetive-lib 0.1.1__py3-none-any.whl → 0.1.3__py3-none-any.whl
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.
- marqetive/__init__.py +13 -13
- marqetive/core/__init__.py +1 -1
- marqetive/core/account_factory.py +2 -2
- marqetive/core/base_manager.py +4 -4
- marqetive/core/client.py +1 -1
- marqetive/core/registry.py +3 -3
- marqetive/platforms/__init__.py +6 -6
- marqetive/platforms/base.py +3 -3
- marqetive/platforms/exceptions.py +2 -1
- marqetive/platforms/instagram/__init__.py +3 -3
- marqetive/platforms/instagram/client.py +4 -4
- marqetive/platforms/instagram/exceptions.py +1 -1
- marqetive/platforms/instagram/factory.py +5 -5
- marqetive/platforms/instagram/manager.py +4 -4
- marqetive/platforms/instagram/media.py +2 -2
- marqetive/platforms/linkedin/__init__.py +3 -3
- marqetive/platforms/linkedin/client.py +4 -4
- marqetive/platforms/linkedin/exceptions.py +1 -1
- marqetive/platforms/linkedin/factory.py +5 -5
- marqetive/platforms/linkedin/manager.py +4 -4
- marqetive/platforms/linkedin/media.py +4 -4
- marqetive/platforms/models.py +2 -0
- marqetive/platforms/tiktok/__init__.py +7 -0
- marqetive/platforms/tiktok/client.py +492 -0
- marqetive/platforms/tiktok/exceptions.py +284 -0
- marqetive/platforms/tiktok/factory.py +188 -0
- marqetive/platforms/tiktok/manager.py +115 -0
- marqetive/platforms/tiktok/media.py +693 -0
- marqetive/platforms/twitter/__init__.py +3 -3
- marqetive/platforms/twitter/client.py +8 -54
- marqetive/platforms/twitter/exceptions.py +1 -1
- marqetive/platforms/twitter/factory.py +5 -6
- marqetive/platforms/twitter/manager.py +4 -4
- marqetive/platforms/twitter/media.py +4 -4
- marqetive/registry_init.py +10 -8
- marqetive/utils/__init__.py +3 -3
- marqetive/utils/file_handlers.py +1 -1
- marqetive/utils/oauth.py +137 -2
- marqetive/utils/token_validator.py +1 -1
- {marqetive_lib-0.1.1.dist-info → marqetive_lib-0.1.3.dist-info}/METADATA +1 -2
- marqetive_lib-0.1.3.dist-info/RECORD +47 -0
- marqetive/platforms/twitter/threads.py +0 -442
- marqetive_lib-0.1.1.dist-info/RECORD +0 -43
- {marqetive_lib-0.1.1.dist-info → marqetive_lib-0.1.3.dist-info}/WHEEL +0 -0
|
@@ -13,8 +13,8 @@ import httpx
|
|
|
13
13
|
import tweepy
|
|
14
14
|
from pydantic import HttpUrl
|
|
15
15
|
|
|
16
|
-
from
|
|
17
|
-
from
|
|
16
|
+
from marqetive.platforms.base import SocialMediaPlatform
|
|
17
|
+
from marqetive.platforms.exceptions import (
|
|
18
18
|
MediaUploadError,
|
|
19
19
|
PlatformAuthError,
|
|
20
20
|
PlatformError,
|
|
@@ -22,7 +22,7 @@ from src.marqetive.platforms.exceptions import (
|
|
|
22
22
|
RateLimitError,
|
|
23
23
|
ValidationError,
|
|
24
24
|
)
|
|
25
|
-
from
|
|
25
|
+
from marqetive.platforms.models import (
|
|
26
26
|
AuthCredentials,
|
|
27
27
|
Comment,
|
|
28
28
|
CommentStatus,
|
|
@@ -33,12 +33,7 @@ from src.marqetive.platforms.models import (
|
|
|
33
33
|
PostStatus,
|
|
34
34
|
PostUpdateRequest,
|
|
35
35
|
)
|
|
36
|
-
from
|
|
37
|
-
from src.marqetive.platforms.twitter.threads import (
|
|
38
|
-
ThreadResult,
|
|
39
|
-
TweetData,
|
|
40
|
-
TwitterThreadManager,
|
|
41
|
-
)
|
|
36
|
+
from marqetive.platforms.twitter.media import TwitterMediaManager
|
|
42
37
|
|
|
43
38
|
|
|
44
39
|
class TwitterClient(SocialMediaPlatform):
|
|
@@ -94,9 +89,8 @@ class TwitterClient(SocialMediaPlatform):
|
|
|
94
89
|
self._tweepy_client: tweepy.Client | None = None
|
|
95
90
|
self._setup_tweepy_client()
|
|
96
91
|
|
|
97
|
-
# Initialize media
|
|
92
|
+
# Initialize media manager
|
|
98
93
|
self._media_manager: TwitterMediaManager | None = None
|
|
99
|
-
self._thread_manager: TwitterThreadManager | None = None
|
|
100
94
|
|
|
101
95
|
def _setup_tweepy_client(self) -> None:
|
|
102
96
|
"""Setup tweepy Client with credentials."""
|
|
@@ -107,7 +101,7 @@ class TwitterClient(SocialMediaPlatform):
|
|
|
107
101
|
)
|
|
108
102
|
|
|
109
103
|
async def _setup_managers(self) -> None:
|
|
110
|
-
"""Setup media
|
|
104
|
+
"""Setup media manager."""
|
|
111
105
|
if not self._tweepy_client:
|
|
112
106
|
return
|
|
113
107
|
|
|
@@ -117,15 +111,11 @@ class TwitterClient(SocialMediaPlatform):
|
|
|
117
111
|
timeout=self.timeout,
|
|
118
112
|
)
|
|
119
113
|
|
|
120
|
-
# Initialize thread manager
|
|
121
|
-
self._thread_manager = TwitterThreadManager(self._tweepy_client)
|
|
122
|
-
|
|
123
114
|
async def _cleanup_managers(self) -> None:
|
|
124
|
-
"""Cleanup media
|
|
115
|
+
"""Cleanup media manager."""
|
|
125
116
|
if self._media_manager:
|
|
126
117
|
await self._media_manager.__aexit__(None, None, None)
|
|
127
118
|
self._media_manager = None
|
|
128
|
-
self._thread_manager = None
|
|
129
119
|
|
|
130
120
|
async def __aenter__(self) -> "TwitterClient":
|
|
131
121
|
"""Async context manager entry."""
|
|
@@ -138,42 +128,6 @@ class TwitterClient(SocialMediaPlatform):
|
|
|
138
128
|
await self._cleanup_managers()
|
|
139
129
|
await super().__aexit__(exc_type, exc_val, exc_tb)
|
|
140
130
|
|
|
141
|
-
# ==================== Thread Methods ====================
|
|
142
|
-
|
|
143
|
-
async def create_thread(
|
|
144
|
-
self,
|
|
145
|
-
tweets: list[TweetData],
|
|
146
|
-
*,
|
|
147
|
-
auto_number: bool = False,
|
|
148
|
-
number_format: str = "{index}/{total}",
|
|
149
|
-
) -> ThreadResult:
|
|
150
|
-
"""Create a Twitter thread from multiple tweets."""
|
|
151
|
-
if not self._thread_manager:
|
|
152
|
-
raise RuntimeError("Client must be used as async context manager")
|
|
153
|
-
|
|
154
|
-
return await self._thread_manager.create_thread(
|
|
155
|
-
tweets,
|
|
156
|
-
auto_number=auto_number,
|
|
157
|
-
number_format=number_format,
|
|
158
|
-
)
|
|
159
|
-
|
|
160
|
-
async def delete_thread(
|
|
161
|
-
self,
|
|
162
|
-
thread_id: str,
|
|
163
|
-
tweet_ids: list[str],
|
|
164
|
-
*,
|
|
165
|
-
continue_on_error: bool = True,
|
|
166
|
-
) -> dict[str, bool]:
|
|
167
|
-
"""Delete all tweets in a thread."""
|
|
168
|
-
if not self._thread_manager:
|
|
169
|
-
raise RuntimeError("Client must be used as async context manager")
|
|
170
|
-
|
|
171
|
-
return await self._thread_manager.delete_thread(
|
|
172
|
-
thread_id,
|
|
173
|
-
tweet_ids,
|
|
174
|
-
continue_on_error=continue_on_error,
|
|
175
|
-
)
|
|
176
|
-
|
|
177
131
|
# ==================== Authentication Methods ====================
|
|
178
132
|
|
|
179
133
|
async def authenticate(self) -> AuthCredentials:
|
|
@@ -345,7 +299,7 @@ class TwitterClient(SocialMediaPlatform):
|
|
|
345
299
|
|
|
346
300
|
async def update_post(
|
|
347
301
|
self,
|
|
348
|
-
post_id: str,
|
|
302
|
+
post_id: str, # noqa: ARG002
|
|
349
303
|
request: PostUpdateRequest, # noqa: ARG002
|
|
350
304
|
) -> Post:
|
|
351
305
|
"""Update a tweet.
|
|
@@ -9,7 +9,7 @@ This module provides comprehensive error handling for Twitter API errors includi
|
|
|
9
9
|
|
|
10
10
|
from typing import Any
|
|
11
11
|
|
|
12
|
-
from
|
|
12
|
+
from marqetive.platforms.exceptions import (
|
|
13
13
|
MediaUploadError,
|
|
14
14
|
PlatformAuthError,
|
|
15
15
|
PlatformError,
|
|
@@ -4,11 +4,11 @@ import logging
|
|
|
4
4
|
import os
|
|
5
5
|
from collections.abc import Callable
|
|
6
6
|
|
|
7
|
-
from
|
|
8
|
-
from
|
|
9
|
-
from
|
|
10
|
-
from
|
|
11
|
-
from
|
|
7
|
+
from marqetive.core.account_factory import BaseAccountFactory
|
|
8
|
+
from marqetive.platforms.exceptions import PlatformAuthError
|
|
9
|
+
from marqetive.platforms.models import AccountStatus, AuthCredentials
|
|
10
|
+
from marqetive.platforms.twitter.client import TwitterClient
|
|
11
|
+
from marqetive.utils.oauth import refresh_twitter_token
|
|
12
12
|
|
|
13
13
|
logger = logging.getLogger(__name__)
|
|
14
14
|
|
|
@@ -116,7 +116,6 @@ class TwitterAccountFactory(BaseAccountFactory):
|
|
|
116
116
|
api_secret = additional_data.get("api_secret") or os.getenv(
|
|
117
117
|
"TWITTER_API_SECRET"
|
|
118
118
|
)
|
|
119
|
-
additional_data.get("access_secret")
|
|
120
119
|
|
|
121
120
|
# Update additional_data if we have env values
|
|
122
121
|
if api_key:
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
import logging
|
|
4
4
|
from typing import Any
|
|
5
5
|
|
|
6
|
-
from
|
|
7
|
-
from
|
|
8
|
-
from
|
|
9
|
-
from
|
|
6
|
+
from marqetive.core.base_manager import BasePostManager
|
|
7
|
+
from marqetive.platforms.models import AuthCredentials, Post, PostCreateRequest
|
|
8
|
+
from marqetive.platforms.twitter.client import TwitterClient
|
|
9
|
+
from marqetive.platforms.twitter.factory import TwitterAccountFactory
|
|
10
10
|
|
|
11
11
|
logger = logging.getLogger(__name__)
|
|
12
12
|
|
|
@@ -18,17 +18,17 @@ from typing import Any, Literal
|
|
|
18
18
|
|
|
19
19
|
import httpx
|
|
20
20
|
|
|
21
|
-
from
|
|
21
|
+
from marqetive.platforms.exceptions import (
|
|
22
22
|
InvalidFileTypeError,
|
|
23
23
|
MediaUploadError,
|
|
24
24
|
)
|
|
25
|
-
from
|
|
26
|
-
from
|
|
25
|
+
from marqetive.utils.file_handlers import download_file
|
|
26
|
+
from marqetive.utils.media import (
|
|
27
27
|
detect_mime_type,
|
|
28
28
|
format_file_size,
|
|
29
29
|
get_chunk_count,
|
|
30
30
|
)
|
|
31
|
-
from
|
|
31
|
+
from marqetive.utils.retry import STANDARD_BACKOFF, retry_async
|
|
32
32
|
|
|
33
33
|
logger = logging.getLogger(__name__)
|
|
34
34
|
|
marqetive/registry_init.py
CHANGED
|
@@ -6,10 +6,11 @@ platform managers with the global registry.
|
|
|
6
6
|
|
|
7
7
|
import logging
|
|
8
8
|
|
|
9
|
-
from
|
|
10
|
-
from
|
|
11
|
-
from
|
|
12
|
-
from
|
|
9
|
+
from marqetive.core.registry import register_platform
|
|
10
|
+
from marqetive.platforms.instagram.manager import InstagramPostManager
|
|
11
|
+
from marqetive.platforms.linkedin.manager import LinkedInPostManager
|
|
12
|
+
from marqetive.platforms.tiktok.manager import TikTokPostManager
|
|
13
|
+
from marqetive.platforms.twitter.manager import TwitterPostManager
|
|
13
14
|
|
|
14
15
|
logger = logging.getLogger(__name__)
|
|
15
16
|
|
|
@@ -19,16 +20,16 @@ _initialized = False
|
|
|
19
20
|
def initialize_platform_registry() -> None:
|
|
20
21
|
"""Initialize the platform registry with all available platforms.
|
|
21
22
|
|
|
22
|
-
This function registers all platform managers (Twitter, LinkedIn, Instagram)
|
|
23
|
+
This function registers all platform managers (Twitter, LinkedIn, Instagram, TikTok)
|
|
23
24
|
with the global registry. It should be called once at application startup.
|
|
24
25
|
|
|
25
26
|
This function is idempotent - calling it multiple times is safe.
|
|
26
27
|
|
|
27
28
|
Example:
|
|
28
|
-
>>> from
|
|
29
|
+
>>> from marqetive import initialize_platform_registry
|
|
29
30
|
>>> initialize_platform_registry()
|
|
30
31
|
>>> # Now you can use get_manager_for_platform()
|
|
31
|
-
>>> from
|
|
32
|
+
>>> from marqetive import get_manager_for_platform
|
|
32
33
|
>>> manager = get_manager_for_platform("twitter")
|
|
33
34
|
"""
|
|
34
35
|
global _initialized
|
|
@@ -43,9 +44,10 @@ def initialize_platform_registry() -> None:
|
|
|
43
44
|
register_platform("twitter", TwitterPostManager)
|
|
44
45
|
register_platform("linkedin", LinkedInPostManager)
|
|
45
46
|
register_platform("instagram", InstagramPostManager)
|
|
47
|
+
register_platform("tiktok", TikTokPostManager)
|
|
46
48
|
|
|
47
49
|
_initialized = True
|
|
48
|
-
logger.info("Platform registry initialized with
|
|
50
|
+
logger.info("Platform registry initialized with 4 platforms")
|
|
49
51
|
|
|
50
52
|
|
|
51
53
|
def is_registry_initialized() -> bool:
|
marqetive/utils/__init__.py
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"""Utility functions for MarqetiveLib."""
|
|
2
2
|
|
|
3
|
-
from
|
|
3
|
+
from marqetive.utils.file_handlers import (
|
|
4
4
|
TempFileManager,
|
|
5
5
|
download_file,
|
|
6
6
|
download_to_memory,
|
|
@@ -9,8 +9,8 @@ from src.marqetive.utils.file_handlers import (
|
|
|
9
9
|
stream_file_upload,
|
|
10
10
|
write_file_bytes,
|
|
11
11
|
)
|
|
12
|
-
from
|
|
13
|
-
from
|
|
12
|
+
from marqetive.utils.helpers import format_response, parse_query_params
|
|
13
|
+
from marqetive.utils.media import (
|
|
14
14
|
MediaValidator,
|
|
15
15
|
chunk_file,
|
|
16
16
|
detect_mime_type,
|
marqetive/utils/file_handlers.py
CHANGED
marqetive/utils/oauth.py
CHANGED
|
@@ -10,8 +10,8 @@ from typing import Any
|
|
|
10
10
|
|
|
11
11
|
import httpx
|
|
12
12
|
|
|
13
|
-
from
|
|
14
|
-
from
|
|
13
|
+
from marqetive.platforms.exceptions import PlatformAuthError
|
|
14
|
+
from marqetive.platforms.models import AuthCredentials
|
|
15
15
|
|
|
16
16
|
logger = logging.getLogger(__name__)
|
|
17
17
|
|
|
@@ -263,3 +263,138 @@ async def refresh_instagram_token(
|
|
|
263
263
|
f"Network error refreshing Instagram token: {e}",
|
|
264
264
|
platform="instagram",
|
|
265
265
|
) from e
|
|
266
|
+
|
|
267
|
+
|
|
268
|
+
async def refresh_tiktok_token(
|
|
269
|
+
credentials: AuthCredentials,
|
|
270
|
+
client_id: str,
|
|
271
|
+
client_secret: str,
|
|
272
|
+
) -> AuthCredentials:
|
|
273
|
+
"""Refresh TikTok OAuth2 access token.
|
|
274
|
+
|
|
275
|
+
Args:
|
|
276
|
+
credentials: Current credentials with refresh token.
|
|
277
|
+
client_id: TikTok OAuth client ID (client_key).
|
|
278
|
+
client_secret: TikTok OAuth client secret.
|
|
279
|
+
|
|
280
|
+
Returns:
|
|
281
|
+
Updated credentials with new access token.
|
|
282
|
+
|
|
283
|
+
Raises:
|
|
284
|
+
PlatformAuthError: If refresh fails.
|
|
285
|
+
"""
|
|
286
|
+
if not credentials.refresh_token:
|
|
287
|
+
raise PlatformAuthError(
|
|
288
|
+
"No refresh token available",
|
|
289
|
+
platform="tiktok",
|
|
290
|
+
)
|
|
291
|
+
|
|
292
|
+
token_url = "https://open.tiktokapis.com/v2/oauth/token/"
|
|
293
|
+
|
|
294
|
+
params = {
|
|
295
|
+
"client_key": client_id,
|
|
296
|
+
"client_secret": client_secret,
|
|
297
|
+
"grant_type": "refresh_token",
|
|
298
|
+
"refresh_token": credentials.refresh_token,
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
try:
|
|
302
|
+
async with httpx.AsyncClient() as client:
|
|
303
|
+
response = await client.post(
|
|
304
|
+
token_url,
|
|
305
|
+
data=params,
|
|
306
|
+
headers={"Content-Type": "application/x-www-form-urlencoded"},
|
|
307
|
+
timeout=30.0,
|
|
308
|
+
)
|
|
309
|
+
response.raise_for_status()
|
|
310
|
+
token_data = response.json()
|
|
311
|
+
|
|
312
|
+
except httpx.HTTPStatusError as e:
|
|
313
|
+
logger.error(f"HTTP error refreshing tiktok token: {e.response.status_code}")
|
|
314
|
+
raise PlatformAuthError(
|
|
315
|
+
f"Failed to refresh token: {e.response.text}",
|
|
316
|
+
platform="tiktok",
|
|
317
|
+
status_code=e.response.status_code,
|
|
318
|
+
) from e
|
|
319
|
+
|
|
320
|
+
except httpx.HTTPError as e:
|
|
321
|
+
logger.error(f"Network error refreshing tiktok token: {e}")
|
|
322
|
+
raise PlatformAuthError(
|
|
323
|
+
f"Network error refreshing token: {e}",
|
|
324
|
+
platform="tiktok",
|
|
325
|
+
) from e
|
|
326
|
+
|
|
327
|
+
# Update credentials
|
|
328
|
+
credentials.access_token = token_data["access_token"]
|
|
329
|
+
|
|
330
|
+
# TikTok might provide new refresh token
|
|
331
|
+
if "refresh_token" in token_data:
|
|
332
|
+
credentials.refresh_token = token_data["refresh_token"]
|
|
333
|
+
|
|
334
|
+
# Calculate expiry
|
|
335
|
+
if "expires_in" in token_data:
|
|
336
|
+
expires_in = int(token_data["expires_in"])
|
|
337
|
+
credentials.expires_at = datetime.now() + timedelta(seconds=expires_in)
|
|
338
|
+
|
|
339
|
+
return credentials
|
|
340
|
+
|
|
341
|
+
|
|
342
|
+
async def fetch_tiktok_token(
|
|
343
|
+
code: str,
|
|
344
|
+
client_id: str,
|
|
345
|
+
client_secret: str,
|
|
346
|
+
redirect_uri: str,
|
|
347
|
+
code_verifier: str | None = None,
|
|
348
|
+
) -> dict[str, Any]:
|
|
349
|
+
"""Fetch a TikTok OAuth2 access token using an authorization code.
|
|
350
|
+
|
|
351
|
+
Args:
|
|
352
|
+
code: The authorization code from the callback.
|
|
353
|
+
client_id: TikTok OAuth client ID (client_key).
|
|
354
|
+
client_secret: TikTok OAuth client secret.
|
|
355
|
+
redirect_uri: The redirect URI used for the authorization request.
|
|
356
|
+
code_verifier: PKCE code verifier for mobile/desktop apps.
|
|
357
|
+
|
|
358
|
+
Returns:
|
|
359
|
+
Token response dictionary with access_token, refresh_token, etc.
|
|
360
|
+
|
|
361
|
+
Raises:
|
|
362
|
+
PlatformAuthError: If token fetch fails.
|
|
363
|
+
"""
|
|
364
|
+
token_url = "https://open.tiktokapis.com/v2/oauth/token/"
|
|
365
|
+
|
|
366
|
+
params = {
|
|
367
|
+
"client_key": client_id,
|
|
368
|
+
"client_secret": client_secret,
|
|
369
|
+
"code": code,
|
|
370
|
+
"grant_type": "authorization_code",
|
|
371
|
+
"redirect_uri": redirect_uri,
|
|
372
|
+
}
|
|
373
|
+
if code_verifier:
|
|
374
|
+
params["code_verifier"] = code_verifier
|
|
375
|
+
|
|
376
|
+
try:
|
|
377
|
+
async with httpx.AsyncClient() as client:
|
|
378
|
+
response = await client.post(
|
|
379
|
+
token_url,
|
|
380
|
+
data=params,
|
|
381
|
+
headers={"Content-Type": "application/x-www-form-urlencoded"},
|
|
382
|
+
timeout=30.0,
|
|
383
|
+
)
|
|
384
|
+
response.raise_for_status()
|
|
385
|
+
return response.json()
|
|
386
|
+
|
|
387
|
+
except httpx.HTTPStatusError as e:
|
|
388
|
+
logger.error(f"HTTP error fetching tiktok token: {e.response.status_code}")
|
|
389
|
+
raise PlatformAuthError(
|
|
390
|
+
f"Failed to fetch token: {e.response.text}",
|
|
391
|
+
platform="tiktok",
|
|
392
|
+
status_code=e.response.status_code,
|
|
393
|
+
) from e
|
|
394
|
+
|
|
395
|
+
except httpx.HTTPError as e:
|
|
396
|
+
logger.error(f"Network error fetching tiktok token: {e}")
|
|
397
|
+
raise PlatformAuthError(
|
|
398
|
+
f"Network error fetching token: {e}",
|
|
399
|
+
platform="tiktok",
|
|
400
|
+
) from e
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: marqetive-lib
|
|
3
|
-
Version: 0.1.
|
|
3
|
+
Version: 0.1.3
|
|
4
4
|
Summary: Modern Python utilities for web APIs
|
|
5
5
|
Keywords: api,utilities,web,http,marqetive
|
|
6
6
|
Requires-Python: >=3.12
|
|
7
7
|
Classifier: Development Status :: 3 - Alpha
|
|
8
8
|
Classifier: Intended Audience :: Developers
|
|
9
|
-
Classifier: License :: OSI Approved :: MIT License
|
|
10
9
|
Classifier: Programming Language :: Python :: 3
|
|
11
10
|
Classifier: Programming Language :: Python :: 3.12
|
|
12
11
|
Classifier: Programming Language :: Python :: 3.13
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
marqetive/__init__.py,sha256=HqOJ0c2W_U31NelSR0-5CfzS8blJofRteSTudgr1Qwg,3090
|
|
2
|
+
marqetive/core/__init__.py,sha256=qOC6JhGjWOpj9_7umtc6VGH16ZJZE6iNDhA6iDZm8kg,113
|
|
3
|
+
marqetive/core/account_factory.py,sha256=3PrkWPdeUS8K8yaMufCsc-mhNN8k_9oDUo_ltnkMSPY,7145
|
|
4
|
+
marqetive/core/base_manager.py,sha256=tbuwO2QQaSup_UXMCtmETcNutzCFV0omvroUM7yHFKA,10031
|
|
5
|
+
marqetive/core/client.py,sha256=2_FoNpqaRglsWg10i5RTbyDg_kRQKhgWjYs6iDdFxLg,3210
|
|
6
|
+
marqetive/core/progress.py,sha256=5Vyksf8YfQUVRudwDEuegcxoc0js5qbHM2SFZ6VLxHM,8593
|
|
7
|
+
marqetive/core/registry.py,sha256=oqf32OJr9FDwmL5d5-UbDSV_-ICTI7vTYSrjagGp2r4,8072
|
|
8
|
+
marqetive/platforms/__init__.py,sha256=jMzSg8fI5nCO20aTNaoF6cQ6RIZoxzVhEDvq3ZpAbXc,1327
|
|
9
|
+
marqetive/platforms/base.py,sha256=y37RkSb3AGHtU-JmjxlUgbwlqG2MmF7w4MI3FATHoG4,11945
|
|
10
|
+
marqetive/platforms/exceptions.py,sha256=Xyj0bzNiZm5VTErmzXgVW8T6IQnOpF92-HJiKPKjIio,7076
|
|
11
|
+
marqetive/platforms/instagram/__init__.py,sha256=dFrDIyKGdw8AsRRYb_AjW1R8PWkxqytM-nrjuAvbw0A,331
|
|
12
|
+
marqetive/platforms/instagram/client.py,sha256=XuvWl0aRHdAFScjOf4x4reQWkfZXdtGKmh1lIWcj4Lc,24939
|
|
13
|
+
marqetive/platforms/instagram/exceptions.py,sha256=zwTc90VbG8uz_6O5bKw68Pp53SoevLQUqPiXj4ZgThU,8983
|
|
14
|
+
marqetive/platforms/instagram/factory.py,sha256=qo7kLk7IoVWGjB0hJbkQqesOveN4gidw0kUh_7SzvaM,3533
|
|
15
|
+
marqetive/platforms/instagram/manager.py,sha256=ZCqdlz5DgOhKUb1n2WOviLsr4NQxfBT4KiycSRv3Q-4,3714
|
|
16
|
+
marqetive/platforms/instagram/media.py,sha256=JDRFB66UlhSjAf0PFR3raGqYxtNTSd5yIZ_2xTGmZRk,21166
|
|
17
|
+
marqetive/platforms/linkedin/__init__.py,sha256=r-1p9yaJO4n8wYWNtN32Quwar6eAWkF5EtFN-v2AdPg,321
|
|
18
|
+
marqetive/platforms/linkedin/client.py,sha256=ddcKmVN2d0ow2abfnaNSeswRsoYREdxj-J9w711zsy0,23558
|
|
19
|
+
marqetive/platforms/linkedin/exceptions.py,sha256=WHjMZ-XJnKgT6uzzi7LXqFt4lD7nSCjzMzaqtOQA3hM,9767
|
|
20
|
+
marqetive/platforms/linkedin/factory.py,sha256=N8POv4vMSg1L8PYnV9-JpHgYlaa33AfeWUhh6UPkViI,4516
|
|
21
|
+
marqetive/platforms/linkedin/manager.py,sha256=K_X74qenJyd5HIL3KtsKpHjQOz48uENFJabZdsXwE-Y,3984
|
|
22
|
+
marqetive/platforms/linkedin/media.py,sha256=360OT1sdBuJRjuL3wJ-T1irAX5gHmcf4AwAU__cvwwA,16901
|
|
23
|
+
marqetive/platforms/models.py,sha256=W_yOuRWItWSn82n8vXRNN_ScdNkzY1De2qqXaVN2RGU,10974
|
|
24
|
+
marqetive/platforms/tiktok/__init__.py,sha256=3S9ItK1Md7Qts21iNJQ5nvvkz7vHeu3ZUR2ZouoWz64,301
|
|
25
|
+
marqetive/platforms/tiktok/client.py,sha256=lLTkUsQ-KEOyrBQXPeA3cK_enNqJVIgffZ99WHz9QJg,16783
|
|
26
|
+
marqetive/platforms/tiktok/exceptions.py,sha256=yOjkZgHyo_t9Chrhws_2n-2sbiDDkCUBv5fdW2nfiHI,10129
|
|
27
|
+
marqetive/platforms/tiktok/factory.py,sha256=U9myKTyPD1HEy3UShDeb1irP0PDZEMamLcbtHxjVtvQ,6744
|
|
28
|
+
marqetive/platforms/tiktok/manager.py,sha256=HMem8to9WsKlQQBm6tiAmcJhoAeM6nwq7YAIvcfKnuY,4113
|
|
29
|
+
marqetive/platforms/tiktok/media.py,sha256=3XjBrHQ7ahB6jVISNmYLgBR3p9N2RKiQRRdqCu_Dh2U,23785
|
|
30
|
+
marqetive/platforms/twitter/__init__.py,sha256=zDEslH3Y6zCnFlYaoW77bkO7j75OmABjqMf1BGh8P5M,313
|
|
31
|
+
marqetive/platforms/twitter/client.py,sha256=1jZz_ft77R0LqJbS6Po0HUErhGF_vRBGsoz7ExOb4L0,19379
|
|
32
|
+
marqetive/platforms/twitter/exceptions.py,sha256=aKrjUZL07KWQ8hatj5-U7UfnSTl-n8DnTgGGigYCrIY,8931
|
|
33
|
+
marqetive/platforms/twitter/factory.py,sha256=EZneqxoGg0TO952C4AHjv_HjyZ1ZQPR_jWPYYtQjF8E,5221
|
|
34
|
+
marqetive/platforms/twitter/manager.py,sha256=QlPrVniPbJdlt39iMi_hmDGpaMkPT7pNjjIYUre2byY,4092
|
|
35
|
+
marqetive/platforms/twitter/media.py,sha256=16atvKwSukvK_YC_gIm2qsl3pmidWEBAwIfJBPG9HQo,24968
|
|
36
|
+
marqetive/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
37
|
+
marqetive/registry_init.py,sha256=TFzkqd7ArW-pqp9GYGDRfNDQkvs3YUbUwakvX95IDKw,2151
|
|
38
|
+
marqetive/utils/__init__.py,sha256=bSrNajbxYBSKQayrPviLz8JeGjplnyK8y_NGDtgb7yQ,977
|
|
39
|
+
marqetive/utils/file_handlers.py,sha256=4TP5kmWofNTSZmlS683CM1UYP83WvRd_NubMbqtXv-g,12568
|
|
40
|
+
marqetive/utils/helpers.py,sha256=8-ljhL47SremKcQO2GF8DIHOPODEv1rSioVNuSPCbec,2634
|
|
41
|
+
marqetive/utils/media.py,sha256=Rvxw9XKU65n-z4G1bEihG3wXZBmjSDZUqClfjGFrg6k,12013
|
|
42
|
+
marqetive/utils/oauth.py,sha256=NjHh3o5iKlXMJmzSFJHq-pn5yn82DvmpB7DMTJT0ht8,12105
|
|
43
|
+
marqetive/utils/retry.py,sha256=lAniJLMNWp9XsHrvU0XBNifpNEjfde4MGfd5hlFTPfA,7636
|
|
44
|
+
marqetive/utils/token_validator.py,sha256=pNimFr_FNJLcYGV5oADhoBjflKfEbLQ3Epwnwg_nTbg,6703
|
|
45
|
+
marqetive_lib-0.1.3.dist-info/METADATA,sha256=9tmxgEtndJ5VUnX0hjAuLAqbAO8Wx0RhdI8joy4pbSY,7798
|
|
46
|
+
marqetive_lib-0.1.3.dist-info/WHEEL,sha256=zp0Cn7JsFoX2ATtOhtaFYIiE2rmFAD4OcMhtUki8W3U,88
|
|
47
|
+
marqetive_lib-0.1.3.dist-info/RECORD,,
|