subx_cli/core/formats/
transformers.rs1use crate::core::formats::converter::FormatConverter;
16use crate::core::formats::{Subtitle, SubtitleFormatType};
17
18impl FormatConverter {
19 pub(crate) fn transform_subtitle(
30 &self,
31 subtitle: Subtitle,
32 target_format: &str,
33 ) -> crate::Result<Subtitle> {
34 match (subtitle.format.as_str(), target_format) {
35 ("srt", "ass") => self.srt_to_ass(subtitle),
36 ("ass", "srt") => self.ass_to_srt(subtitle),
37 ("srt", "vtt") => self.srt_to_vtt(subtitle),
38 ("vtt", "srt") => self.vtt_to_srt(subtitle),
39 ("ass", "vtt") => self.ass_to_vtt(subtitle),
40 ("vtt", "ass") => self.vtt_to_ass(subtitle),
41 (source, target) if source == target => Ok(subtitle),
42 _ => Err(crate::error::SubXError::subtitle_format(
43 subtitle.format.to_string(),
44 format!(
45 "Unsupported conversion: {} -> {}",
46 subtitle.format, target_format
47 ),
48 )),
49 }
50 }
51
52 pub(crate) fn srt_to_ass(&self, mut subtitle: Subtitle) -> crate::Result<Subtitle> {
54 let _default_style = crate::core::formats::ass::AssStyle {
55 name: "Default".to_string(),
56 font_name: "Arial".to_string(),
57 font_size: 16,
58 primary_color: crate::core::formats::ass::Color::white(),
59 secondary_color: crate::core::formats::ass::Color::red(),
60 outline_color: crate::core::formats::ass::Color::black(),
61 shadow_color: crate::core::formats::ass::Color::black(),
62 bold: false,
63 italic: false,
64 underline: false,
65 alignment: 2,
66 };
67 for entry in &mut subtitle.entries {
68 if self.config.preserve_styling {
69 entry.styling = Some(self.extract_srt_styling(&entry.text)?);
70 }
71 entry.text = self.convert_srt_tags_to_ass(&entry.text);
72 }
73 subtitle.format = SubtitleFormatType::Ass;
74 subtitle.metadata.original_format = SubtitleFormatType::Srt;
75 Ok(subtitle)
76 }
77
78 pub(crate) fn ass_to_srt(&self, mut subtitle: Subtitle) -> crate::Result<Subtitle> {
80 for entry in &mut subtitle.entries {
81 entry.text = self.strip_ass_tags(&entry.text);
82 if self.config.preserve_styling {
83 entry.text = self.convert_ass_tags_to_srt(&entry.text);
84 }
85 entry.styling = None;
86 }
87 subtitle.format = SubtitleFormatType::Srt;
88 Ok(subtitle)
89 }
90
91 pub(crate) fn srt_to_vtt(&self, mut subtitle: Subtitle) -> crate::Result<Subtitle> {
93 subtitle.metadata.title = Some("WEBVTT".to_string());
94 for entry in &mut subtitle.entries {
95 entry.text = self.convert_srt_tags_to_vtt(&entry.text);
96 }
97 subtitle.format = SubtitleFormatType::Vtt;
98 Ok(subtitle)
99 }
100
101 pub(crate) fn ass_to_vtt(&self, subtitle: Subtitle) -> crate::Result<Subtitle> {
103 let subtitle = self.ass_to_srt(subtitle)?;
105 self.srt_to_vtt(subtitle)
106 }
107
108 pub(crate) fn vtt_to_srt(&self, mut subtitle: Subtitle) -> crate::Result<Subtitle> {
110 for entry in &mut subtitle.entries {
112 if self.config.preserve_styling {
113 entry.text = self.convert_vtt_tags_to_srt(&entry.text);
114 } else {
115 entry.text = self.strip_vtt_tags(&entry.text);
116 }
117 entry.styling = None;
118 }
119 subtitle.format = SubtitleFormatType::Srt;
120 Ok(subtitle)
121 }
122
123 pub(crate) fn vtt_to_ass(&self, subtitle: Subtitle) -> crate::Result<Subtitle> {
125 let subtitle = self.vtt_to_srt(subtitle)?;
127 self.srt_to_ass(subtitle)
128 }
129}