diff --git a/src/archivers/__init__.py b/src/archivers/__init__.py index d256f8c..ce9b701 100644 --- a/src/archivers/__init__.py +++ b/src/archivers/__init__.py @@ -3,7 +3,7 @@ from .base_archiver import Archiver, ArchiveResult from .archiver import Archiverv2 from .telegram_archiver import TelegramArchiver # from .telethon_archiver import TelethonArchiver -from .tiktok_archiver import TiktokArchiver +# from .tiktok_archiver import TiktokArchiver from .wayback_archiver import WaybackArchiver from .youtubedl_archiver import YoutubeDLArchiver # from .twitter_archiver import TwitterArchiver @@ -14,4 +14,5 @@ from .vk_archiver import VkArchiver from .telethon_archiverv2 import TelethonArchiver from .twitter_archiverv2 import TwitterArchiver from .twitter_api_archiverv2 import TwitterApiArchiver -from .instagram_archiverv2 import InstagramArchiver \ No newline at end of file +from .instagram_archiverv2 import InstagramArchiver +from .tiktok_archiverv2 import TiktokArchiver \ No newline at end of file diff --git a/src/archivers/tiktok_archiverv2.py b/src/archivers/tiktok_archiverv2.py new file mode 100644 index 0000000..85d3083 --- /dev/null +++ b/src/archivers/tiktok_archiverv2.py @@ -0,0 +1,59 @@ +import json +import os, traceback +import re +import uuid +import tiktok_downloader +from loguru import logger + +from metadata import Metadata +from media import Media +from .archiver import Archiverv2 + + +class TiktokArchiver(Archiverv2): + name = "tiktok_archiver" + + def __init__(self, config: dict) -> None: + super().__init__(config) + + @staticmethod + def configs() -> dict: + return {} + + def download(self, item: Metadata) -> Metadata: + url = item.get_url() + if 'tiktok.com' not in url: + return False + + result = Metadata() + try: + info = tiktok_downloader.info_post(url) + result.set_title(info.desc) + result.set_timestamp(info.create_time) + result.set_content(json.dumps({ + "cover": info.cover, + "author": info.author, + "music_title": info.author, + "caption": getattr(info, "caption", info.desc), + }, ensure_ascii=False, indent=4)) + except: + error = traceback.format_exc() + logger.warning(f'Other Tiktok error {error}') + + + try: + filename = os.path.join(item.get_tmp_dir(), f'{str(uuid.uuid4())[0:8]}.mp4') + tiktok_media = tiktok_downloader.snaptik(url).get_media() + + if len(tiktok_media) <= 0: + logger.debug(f"TikTok: could not get media from {url=}") + return False + + logger.info(f'downloading video {filename=}') + tiktok_media[0].download(filename) + + result.add_media(Media(filename)) + return result.success("tiktok") + except: + error = traceback.format_exc() + logger.warning(f'Other Tiktok error {error}')