1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071 |
- import os, traceback
- import tiktok_downloader
- from loguru import logger
- from .base_archiver import Archiver, ArchiveResult
- from storages import Storage
- class TiktokArchiver(Archiver):
- name = "tiktok"
- def download(self, url, check_if_exists=False):
- if 'tiktok.com' not in url:
- return False
- status = 'success'
- try:
- info = tiktok_downloader.info_post(url)
- key = self.get_key(f'{info.id}.mp4')
- filename = os.path.join(Storage.TMP_FOLDER, key)
- logger.info(f'found video {key=}')
- if check_if_exists and self.storage.exists(key):
- status = 'already archived'
- media = tiktok_downloader.snaptik(url).get_media()
- if len(media) <= 0:
- if status == 'already archived':
- return ArchiveResult(status='Could not download media, but already archived', cdn_url=self.storage.get_cdn_url(key))
- else:
- return ArchiveResult(status='Could not download media')
- logger.info(f'downloading video {key=}')
- media[0].download(filename)
- if status != 'already archived':
- logger.info(f'uploading video {key=}')
- self.storage.upload(filename, key)
- try:
- key_thumb, thumb_index = self.get_thumbnails(filename, key, duration=info.duration)
- except Exception as e:
- logger.error(e)
- key_thumb = ''
- thumb_index = 'error creating thumbnails'
- hash = self.get_hash(filename)
- screenshot = self.get_screenshot(url)
- try: os.remove(filename)
- except FileNotFoundError:
- logger.info(f'tmp file not found thus not deleted {filename}')
- cdn_url = self.storage.get_cdn_url(key)
- timestamp = info.create.isoformat() if hasattr(info, "create") else None
- return ArchiveResult(status=status, cdn_url=cdn_url, thumbnail=key_thumb,
- thumbnail_index=thumb_index, duration=getattr(info, "duration", 0), title=getattr(info, "caption", ""),
- timestamp=timestamp, hash=hash, screenshot=screenshot)
- except tiktok_downloader.Except.InvalidUrl as e:
- status = 'Invalid URL'
- logger.warning(f'Invalid URL on {url} {e}\n{traceback.format_exc()}')
- return ArchiveResult(status=status)
- except:
- error = traceback.format_exc()
- status = 'Other Tiktok error: ' + str(error)
- logger.warning(f'Other Tiktok error' + str(error))
- return ArchiveResult(status=status)
|