83 lines
3.1 KiB
Python
Executable File
83 lines
3.1 KiB
Python
Executable File
# coding=utf-8
|
|
import os
|
|
import logging
|
|
from bs4 import UnicodeDammit
|
|
from subliminal.api import get_subtitle_path, io
|
|
from subzero.lib.io import get_viable_encoding
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
def save_subtitles(video, subtitles, single=False, directory=None, encoding=None, encode_with=None):
|
|
"""Save subtitles on filesystem.
|
|
|
|
Subtitles are saved in the order of the list. If a subtitle with a language has already been saved, other subtitles
|
|
with the same language are silently ignored.
|
|
|
|
The extension used is `.lang.srt` by default or `.srt` is `single` is `True`, with `lang` being the IETF code for
|
|
the :attr:`~subliminal.subtitle.Subtitle.language` of the subtitle.
|
|
|
|
:param video: video of the subtitles.
|
|
:type video: :class:`~subliminal.video.Video`
|
|
:param subtitles: subtitles to save.
|
|
:type subtitles: list of :class:`~subliminal.subtitle.Subtitle`
|
|
:param bool single: save a single subtitle, default is to save one subtitle per language.
|
|
:param str directory: path to directory where to save the subtitles, default is next to the video.
|
|
:param str encoding: encoding in which to save the subtitles, default is to keep original encoding.
|
|
:return: the saved subtitles
|
|
:rtype: list of :class:`~subliminal.subtitle.Subtitle`
|
|
|
|
patch: unicode path probems
|
|
"""
|
|
saved_subtitles = []
|
|
for subtitle in subtitles:
|
|
# check content
|
|
if subtitle.content is None:
|
|
logger.error('Skipping subtitle %r: no content', subtitle)
|
|
continue
|
|
|
|
# check language
|
|
if subtitle.language in set(s.language for s in saved_subtitles):
|
|
logger.debug('Skipping subtitle %r: language already saved', subtitle)
|
|
continue
|
|
|
|
# create subtitle path
|
|
subtitle_path = get_subtitle_path(video.name, None if single else subtitle.language)
|
|
if directory is not None:
|
|
subtitle_path = os.path.join(directory, os.path.split(subtitle_path)[1])
|
|
|
|
# force unicode
|
|
subtitle_path = UnicodeDammit(subtitle_path).unicode_markup
|
|
|
|
subtitle.storage_path = subtitle_path
|
|
|
|
# save content as is or in the specified encoding
|
|
logger.info('Saving %r to %r', subtitle, subtitle_path)
|
|
has_encoder = callable(encode_with)
|
|
|
|
if has_encoder:
|
|
logger.info('Using encoder %s' % encode_with.__name__)
|
|
|
|
# save normalized subtitle if encoder or no encoding is given
|
|
if has_encoder or encoding is None:
|
|
content = encode_with(subtitle.text) if has_encoder else subtitle.content
|
|
with io.open(subtitle_path, 'wb') as f:
|
|
f.write(content)
|
|
|
|
if single:
|
|
break
|
|
continue
|
|
|
|
# save subtitle if encoding given
|
|
if encoding is not None:
|
|
with io.open(subtitle_path, 'w', encoding=encoding) as f:
|
|
f.write(subtitle.text)
|
|
|
|
saved_subtitles.append(subtitle)
|
|
|
|
# check single
|
|
if single:
|
|
break
|
|
|
|
return saved_subtitles
|