Exemplo n.º 1
0
def list_to_ass_str(  # pylint: disable=too-many-arguments
        text_list,
        styles_list,
        subtitles_file_format=constants.DEFAULT_SUBTITLES_FORMAT):
    """
    Give an input timed text list, format it to an ass string.
    """

    if subtitles_file_format == 'ass' \
            or subtitles_file_format == 'ssa'\
            or subtitles_file_format == 'ass.json':
        pysubs2_obj = pysubs2.SSAFile()
        pysubs2_obj.styles = \
            {styles_list[i]: styles_list[i + 1] for i in range(0, len(styles_list), 2)}
        if not isinstance(text_list[0], list):
            # text_list is [((start, end), text), ...]
            # text_list provides regions
            sub_utils.pysubs2_ssa_event_add(src_ssafile=None,
                                            dst_ssafile=pysubs2_obj,
                                            text_list=text_list,
                                            style_name=styles_list[0])
        else:
            # text_list is [[src_list], [dst_list]]
            # src_list provides regions
            sub_utils.pysubs2_ssa_event_add(src_ssafile=None,
                                            dst_ssafile=pysubs2_obj,
                                            text_list=text_list[0],
                                            style_name=styles_list[0])
            if len(styles_list) == 1:
                sub_utils.pysubs2_ssa_event_add(src_ssafile=None,
                                                dst_ssafile=pysubs2_obj,
                                                text_list=text_list[1],
                                                style_name=styles_list[0])
            else:
                sub_utils.pysubs2_ssa_event_add(src_ssafile=None,
                                                dst_ssafile=pysubs2_obj,
                                                text_list=text_list[1],
                                                style_name=styles_list[2])

        if subtitles_file_format != 'ass.json':
            formatted_subtitles = pysubs2_obj.to_string(
                format_=subtitles_file_format)
        else:
            formatted_subtitles = pysubs2_obj.to_string(format_='json')
    else:
        # fallback process
        print(
            _("Format \"{fmt}\" not supported. "
              "Using \"{default_fmt}\" instead.").format(
                  fmt=subtitles_file_format,
                  default_fmt=constants.DEFAULT_SUBTITLES_FORMAT))
        pysubs2_obj = pysubs2.SSAFile()
        sub_utils.pysubs2_ssa_event_add(src_ssafile=None,
                                        dst_ssafile=pysubs2_obj,
                                        text_list=text_list,
                                        style_name=None)
        formatted_subtitles = pysubs2_obj.to_string(
            format_=constants.DEFAULT_SUBTITLES_FORMAT)

    return formatted_subtitles, subtitles_file_format
Exemplo n.º 2
0
def list_to_ass_str(
        text_list,
        styles_list,
        subtitles_file_format=constants.DEFAULT_SUBTITLES_FORMAT,
        same_event_type=0):
    """
    Give an input timed text list, format it to an ass string.
    """
    pysubs2_obj = pysubs2.SSAFile()
    pysubs2_obj.styles = \
        {styles_list[i]: styles_list[i + 1] for i in range(0, len(styles_list), 2)}
    if not isinstance(text_list[0], list):
        # text_list is [((start, end), text), ...]
        # text_list provides regions
        sub_utils.pysubs2_ssa_event_add(
            src_ssafile=None,
            dst_ssafile=pysubs2_obj,
            text_list=text_list,
            style_name=styles_list[0])
    else:
        # text_list is [[src_list], [dst_list]]
        # src_list provides regions
        sub_utils.pysubs2_ssa_event_add(
            src_ssafile=None,
            dst_ssafile=pysubs2_obj,
            text_list=text_list[0],
            style_name=styles_list[0])
        src_obj = pysubs2_obj
        pysubs2_obj = pysubs2.SSAFile()
        if len(styles_list) == 1:
            sub_utils.pysubs2_ssa_event_add(
                src_ssafile=src_obj,
                dst_ssafile=pysubs2_obj,
                text_list=text_list[1],
                style_name=styles_list[0],
                same_event_type=same_event_type)
        else:
            sub_utils.pysubs2_ssa_event_add(
                src_ssafile=src_obj,
                dst_ssafile=pysubs2_obj,
                text_list=text_list[1],
                style_name=styles_list[2],
                same_event_type=same_event_type)

    if subtitles_file_format != 'ass.json':
        formatted_subtitles = pysubs2_obj.to_string(format_=subtitles_file_format)
    else:
        formatted_subtitles = pysubs2_obj.to_string(format_='json')

    return formatted_subtitles
Exemplo n.º 3
0
def list_to_sub_str(
        timed_text,
        fps=30.0,
        subtitles_file_format=constants.DEFAULT_SUBTITLES_FORMAT):
    """
    Give an input timed text list, format it to a string.
    """

    if subtitles_file_format in ('srt', 'tmp', 'ass', 'ssa'):
        pysubs2_obj = pysubs2.SSAFile()
        sub_utils.pysubs2_ssa_event_add(
            src_ssafile=None,
            dst_ssafile=pysubs2_obj,
            text_list=timed_text)
        formatted_subtitles = pysubs2_obj.to_string(
            format_=subtitles_file_format)

    elif subtitles_file_format == 'vtt':
        formatted_subtitles = sub_utils.list_to_vtt_str(
            subtitles=timed_text)

    elif subtitles_file_format == 'json':
        formatted_subtitles = sub_utils.list_to_json_str(
            subtitles=timed_text)

    elif subtitles_file_format == 'ass.json':
        pysubs2_obj = pysubs2.SSAFile()
        sub_utils.pysubs2_ssa_event_add(
            src_ssafile=None,
            dst_ssafile=pysubs2_obj,
            text_list=timed_text)
        formatted_subtitles = pysubs2_obj.to_string(
            format_='json')

    elif subtitles_file_format == 'txt':
        formatted_subtitles = sub_utils.list_to_txt_str(
            subtitles=timed_text)

    elif subtitles_file_format == 'sub':
        pysubs2_obj = pysubs2.SSAFile()
        sub_utils.pysubs2_ssa_event_add(
            src_ssafile=None,
            dst_ssafile=pysubs2_obj,
            text_list=timed_text)
        formatted_subtitles = pysubs2_obj.to_string(
            format_='microdvd',
            fps=fps)
        # sub format need fps
        # ref https://pysubs2.readthedocs.io/en/latest
        # /api-reference.html#supported-input-output-formats

    elif subtitles_file_format == 'mpl2.txt':
        pysubs2_obj = pysubs2.SSAFile()
        sub_utils.pysubs2_ssa_event_add(
            src_ssafile=None,
            dst_ssafile=pysubs2_obj,
            text_list=timed_text)
        formatted_subtitles = pysubs2_obj.to_string(
            format_='mpl2',
            fps=fps)

    else:
        # fallback process
        print(_("Format \"{fmt}\" not supported. "
                "Use \"{default_fmt}\" instead.").format(
                    fmt=subtitles_file_format,
                    default_fmt=constants.DEFAULT_SUBTITLES_FORMAT))
        pysubs2_obj = pysubs2.SSAFile()
        sub_utils.pysubs2_ssa_event_add(
            src_ssafile=None,
            dst_ssafile=pysubs2_obj,
            text_list=timed_text)
        formatted_subtitles = pysubs2_obj.to_string(
            format_=constants.DEFAULT_SUBTITLES_FORMAT)

    return formatted_subtitles
Exemplo n.º 4
0
def subs_trans(  # pylint: disable=too-many-branches, too-many-statements, too-many-locals
        args,
        input_m=input,
        fps=30.0,
        styles_list=None):
    """
    Give args and translate a subtitles file.
    """
    if not args.output_files:
        raise exceptions.AutosubException(
            _("\nNo works done."
              " Check your \"-of\"/\"--output-files\" option."))

    src_sub = pysubs2.SSAFile.load(args.input)
    text_list = []

    if args.styles and \
            (args.format == 'ass' or
             args.format == 'ssa' or
             args.format == 'ass.json'):
        src_sub.styles = \
            {styles_list[i]: styles_list[i + 1] for i in range(0, len(styles_list), 2)}
        for event in src_sub.events:
            event.style = styles_list[0]
            text_list.append(event.text)
    else:
        styles_list = [
            src_sub.events[0].style,
        ]
        for event in src_sub.events:
            text_list.append(event.text)

    # text translation
    if args.gtransv2:
        # use gtransv2
        translated_text = core.list_to_gtv2(
            text_list=text_list,
            api_key=args.gtransv2,
            concurrency=args.trans_concurrency,
            src_language=args.src_language,
            dst_language=args.dst_language,
            lines_per_trans=args.lines_per_trans)
    else:
        # use googletrans
        translated_text = core.list_to_googletrans(
            text_list,
            src_language=args.src_language,
            dst_language=args.dst_language,
            sleep_seconds=args.sleep_seconds,
            user_agent=args.user_agent,
            service_urls=args.service_urls)

    if not translated_text or len(translated_text) != len(text_list):
        raise exceptions.AutosubException(_("Error: Translation failed."))

    try:
        args.output_files.remove("bilingual")
        bilingual_sub = pysubs2.SSAFile()
        bilingual_sub.styles = src_sub.styles
        bilingual_sub.events = src_sub.events[:]
        if args.styles and \
                len(styles_list) == 2 and \
                (args.format == 'ass' or
                 args.format == 'ssa' or
                 args.format == 'ass.json'):
            sub_utils.pysubs2_ssa_event_add(src_ssafile=bilingual_sub,
                                            dst_ssafile=bilingual_sub,
                                            text_list=translated_text,
                                            style_name=styles_list[2])
        else:
            sub_utils.pysubs2_ssa_event_add(src_ssafile=bilingual_sub,
                                            dst_ssafile=bilingual_sub,
                                            text_list=translated_text,
                                            style_name=styles_list[0])

        if args.format != 'ass.json':
            bilingual_string = bilingual_sub.to_string(format_=args.format,
                                                       fps=fps)
        else:
            bilingual_string = bilingual_sub.to_string(format_='json')

        if args.format == 'mpl2':
            extension = 'mpl2.txt'
        else:
            extension = args.format

        bilingual_name = "{base}.{nt}.{extension}".format(
            base=args.output,
            nt=args.src_language + '&' + args.dst_language,
            extension=extension)

        subtitles_file_path = core.str_to_file(str_=bilingual_string,
                                               output=bilingual_name,
                                               input_m=input_m)
        # subtitles string to file
        print(
            _("Bilingual subtitles file "
              "created at \"{}\".").format(subtitles_file_path))

        if not args.output_files:
            raise exceptions.AutosubException(_("\nAll works done."))

    except KeyError:
        pass

    try:
        args.output_files.remove("dst")
        dst_sub = pysubs2.SSAFile()
        dst_sub.styles = src_sub.styles
        if len(styles_list) == 2:
            sub_utils.pysubs2_ssa_event_add(src_ssafile=src_sub,
                                            dst_ssafile=dst_sub,
                                            text_list=translated_text,
                                            style_name=styles_list[2])
        else:
            sub_utils.pysubs2_ssa_event_add(src_ssafile=src_sub,
                                            dst_ssafile=dst_sub,
                                            text_list=translated_text,
                                            style_name=styles_list[0])

        if args.format != 'ass.json':
            dst_string = dst_sub.to_string(format_=args.format, fps=fps)
        else:
            dst_string = dst_sub.to_string(format_='json')
        if args.format == 'mpl2':
            extension = 'mpl2.txt'
        else:
            extension = args.format
        dst_name = "{base}.{nt}.{extension}".format(base=args.output,
                                                    nt=args.dst_language,
                                                    extension=extension)
        subtitles_file_path = core.str_to_file(str_=dst_string,
                                               output=dst_name,
                                               input_m=input_m)
        # subtitles string to file
        print(
            _("Destination language subtitles "
              "file created at \"{}\".").format(subtitles_file_path))

    except KeyError:
        pass