[gnome-subtitles] Added initial support for the FAB Subtitler subtitle format (#634230)



commit 5d035a893173fafd19f6f119da095ff9e387bb9c
Author: Pedro Castro <mail pedrocastro org>
Date:   Wed Nov 17 21:33:42 2010 +0000

    Added initial support for the FAB Subtitler subtitle format (#634230)

 gnome-subtitles.mdp                                |    2 +-
 src/Glade/MainWindow.glade                         |   20 +++---
 src/SubLib/Core/Domain/Enumerations.cs             |    5 +-
 .../IO/SubtitleFormats/BuiltInSubtitleFormats.cs   |    5 +-
 .../SubtitleFormats/SubtitleFormatFABSubtitler.cs  |   64 ++++++++++++++++++++
 5 files changed, 82 insertions(+), 14 deletions(-)
---
diff --git a/gnome-subtitles.mdp b/gnome-subtitles.mdp
index f05c2ff..cbade67 100644
--- a/gnome-subtitles.mdp
+++ b/gnome-subtitles.mdp
@@ -250,7 +250,7 @@
     <File subtype="Code" buildaction="Compile" name="src/GnomeSubtitles/Ui/Component/NewlineTypeComboBox.cs" />
     <File subtype="Code" buildaction="Compile" name="src/GnomeSubtitles/Ui/VideoPreview/SubtitleTracker.cs" />
     <File subtype="Code" buildaction="Compile" name="src/GnomeSubtitles/Core/Backup.cs" />
-    <File subtype="Code" buildaction="Compile" name="src/SubLib/IO/SubtitleFormats/SubtitleFormatFADSubtitler.cs" />
+    <File subtype="Code" buildaction="Compile" name="src/SubLib/IO/SubtitleFormats/SubtitleFormatFABSubtitler.cs" />
   </Contents>
   <References>
     <ProjectReference type="Gac" localcopy="True" refto="Mono.Posix, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" />
diff --git a/src/Glade/MainWindow.glade b/src/Glade/MainWindow.glade
index 0484fa8..9bffa7a 100644
--- a/src/Glade/MainWindow.glade
+++ b/src/Glade/MainWindow.glade
@@ -1,4 +1,4 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8"?>
 <glade-interface>
   <!-- interface-requires gtk+ 2.16 -->
   <!-- interface-naming-policy toplevel-contextual -->
@@ -248,8 +248,8 @@
                         <property name="use_underline">True</property>
                         <property name="use_stock">True</property>
                         <signal name="activate" handler="OnEditRedo"/>
-                        <accelerator key="Y" signal="activate" modifiers="GDK_CONTROL_MASK"/>
                         <accelerator key="Z" signal="activate" modifiers="GDK_SHIFT_MASK | GDK_CONTROL_MASK"/>
+                        <accelerator key="Y" signal="activate" modifiers="GDK_CONTROL_MASK"/>
                       </widget>
                     </child>
                     <child>
@@ -532,8 +532,8 @@
                         <property name="label" translatable="yes">Find Ne_xt</property>
                         <property name="use_underline">True</property>
                         <signal name="activate" handler="OnSearchFindNext"/>
-                        <accelerator key="F3" signal="activate"/>
                         <accelerator key="g" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+                        <accelerator key="F3" signal="activate"/>
                       </widget>
                     </child>
                     <child>
@@ -543,8 +543,8 @@
                         <property name="label" translatable="yes">Find Pre_vious</property>
                         <property name="use_underline">True</property>
                         <signal name="activate" handler="OnSearchFindPrevious"/>
-                        <accelerator key="F3" signal="activate" modifiers="GDK_SHIFT_MASK"/>
                         <accelerator key="g" signal="activate" modifiers="GDK_SHIFT_MASK | GDK_CONTROL_MASK"/>
+                        <accelerator key="F3" signal="activate" modifiers="GDK_SHIFT_MASK"/>
                       </widget>
                     </child>
                     <child>
@@ -803,8 +803,8 @@
                         <property name="use_underline">True</property>
                         <property name="use_stock">False</property>
                         <signal name="activate" handler="OnVideoPlayPause"/>
-                        <accelerator key="F5" signal="activate"/>
                         <accelerator key="p" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+                        <accelerator key="F5" signal="activate"/>
                         <child internal-child="image">
                           <widget class="GtkImage" id="videoPlayPauseImage">
                             <property name="visible">True</property>
@@ -831,8 +831,8 @@
                         <property name="use_underline">True</property>
                         <property name="use_stock">False</property>
                         <signal name="activate" handler="OnVideoRewind"/>
-                        <accelerator key="F6" signal="activate"/>
                         <accelerator key="k" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+                        <accelerator key="F6" signal="activate"/>
                         <child internal-child="image">
                           <widget class="GtkImage" id="videoRewindImage">
                             <property name="visible">True</property>
@@ -850,8 +850,8 @@
                         <property name="use_underline">True</property>
                         <property name="use_stock">False</property>
                         <signal name="activate" handler="OnVideoForward"/>
-                        <accelerator key="F7" signal="activate"/>
                         <accelerator key="l" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+                        <accelerator key="F7" signal="activate"/>
                         <child internal-child="image">
                           <widget class="GtkImage" id="videoForwardImage">
                             <property name="visible">True</property>
@@ -891,8 +891,8 @@
                         <property name="label" translatable="yes">Seek _to Selection</property>
                         <property name="use_underline">True</property>
                         <signal name="activate" handler="OnVideoSeekToSelection"/>
-                        <accelerator key="F4" signal="activate" modifiers="GDK_SHIFT_MASK | GDK_CONTROL_MASK"/>
                         <accelerator key="r" signal="activate" modifiers="GDK_SHIFT_MASK | GDK_CONTROL_MASK"/>
+                        <accelerator key="F4" signal="activate" modifiers="GDK_SHIFT_MASK | GDK_CONTROL_MASK"/>
                       </widget>
                     </child>
                     <child>
@@ -902,8 +902,8 @@
                         <property name="label" translatable="yes">Select Nearest Subtitle</property>
                         <property name="use_underline">True</property>
                         <signal name="activate" handler="OnVideoSelectNearestSubtitle"/>
-                        <accelerator key="r" signal="activate" modifiers="GDK_CONTROL_MASK"/>
                         <accelerator key="F4" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+                        <accelerator key="r" signal="activate" modifiers="GDK_CONTROL_MASK"/>
                       </widget>
                     </child>
                     <child>
@@ -912,8 +912,8 @@
                         <property name="label" translatable="yes">Auto Select Subtitle</property>
                         <property name="use_underline">True</property>
                         <signal name="toggled" handler="OnVideoAutoSelectSubtitles"/>
-                        <accelerator key="j" signal="activate" modifiers="GDK_CONTROL_MASK"/>
                         <accelerator key="F3" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+                        <accelerator key="j" signal="activate" modifiers="GDK_CONTROL_MASK"/>
                       </widget>
                     </child>
                     <child>
diff --git a/src/SubLib/Core/Domain/Enumerations.cs b/src/SubLib/Core/Domain/Enumerations.cs
index 751c158..74bb0a2 100644
--- a/src/SubLib/Core/Domain/Enumerations.cs
+++ b/src/SubLib/Core/Domain/Enumerations.cs
@@ -98,7 +98,10 @@ public enum SubtitleType {
     KaraokeLyricsLRC,
 
     /// <summary>Adobe Encore DVD subtitle type.</summary>
-	AdobeEncoreDVD
+	AdobeEncoreDVD,
+	
+	/// <summary>FAB Subtitler subtitle type.</summary>
+	FABSubtitler
 };
 
 /// <summary>
diff --git a/src/SubLib/IO/SubtitleFormats/BuiltInSubtitleFormats.cs b/src/SubLib/IO/SubtitleFormats/BuiltInSubtitleFormats.cs
index 7c0e140..1541a36 100644
--- a/src/SubLib/IO/SubtitleFormats/BuiltInSubtitleFormats.cs
+++ b/src/SubLib/IO/SubtitleFormats/BuiltInSubtitleFormats.cs
@@ -1,6 +1,6 @@
 /*
  * This file is part of SubLib.
- * Copyright (C) 2005-2008 Pedro Castro
+ * Copyright (C) 2005-2010 Pedro Castro
  *
  * SubLib is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -49,7 +49,8 @@ internal static class BuiltInSubtitleFormats {
         new SubtitleFormatPowerDivX(),
         new SubtitleFormatKaraokeLyricsVKT(),
         new SubtitleFormatKaraokeLyricsLRC(),
-        new SubtitleFormatAdobeEncoreDVD()
+        new SubtitleFormatAdobeEncoreDVD(),
+        new SubtitleFormatFABSubtitler()
 	};
 	
 	internal static SubtitleFormat[] SubtitleFormats {
diff --git a/src/SubLib/IO/SubtitleFormats/SubtitleFormatFABSubtitler.cs b/src/SubLib/IO/SubtitleFormats/SubtitleFormatFABSubtitler.cs
new file mode 100644
index 0000000..938b4c9
--- /dev/null
+++ b/src/SubLib/IO/SubtitleFormats/SubtitleFormatFABSubtitler.cs
@@ -0,0 +1,64 @@
+/*
+ * This file is part of SubLib.
+ * Copyright (C) 2010 Pedro Castro
+ *
+ * SubLib is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * SubLib is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+using SubLib.Core.Domain;
+using SubLib.IO.Input;
+using System;
+using System.Text.RegularExpressions;
+
+namespace SubLib.IO.SubtitleFormats {
+
+internal class SubtitleFormatFABSubtitler : SubtitleFormat {
+	
+	internal SubtitleFormatFABSubtitler () {
+		name = "FAB Subtitler";
+		type = SubtitleType.FABSubtitler;
+		mode = SubtitleMode.Times;
+		extensions = new string[] { "txt" };
+		lineBreak = "\n";
+		
+		format = @"\d\d:\d\d:\d\d:\d\d\s+\d\d:\d\d:\d\d:\d\d";
+		
+		subtitleIn = @"(?<StartHours>\d+)\s*:\s*(?<StartMinutes>\d+)\s*:\s*(?<StartSeconds>\d+)\s*:\s*(?<StartMillisecondsAsFrames>\d+)\s+(?<EndHours>\d+)\s*:\s*(?<EndMinutes>\d+)\s*:\s*(?<EndSeconds>\d+)\s*:\s*(?<EndMillisecondsAsFrames>\d+).*(\n(?<Text>(.*(?!\n\d+(\s*:\s*\d+){2})\n?)*.))?";
+		
+		subtitleOut = null;
+	}
+	
+	internal override void GlobalInputGetProperties (string text, ParsingProperties properties) {
+		properties.OriginalFrameRate = 25; //Framerate has to be PAL or NTSC, defaulting to PAL
+	}
+	
+	internal override string GetDynamicSubtitleOut (SubtitleProperties properties) {
+		bool isFrameRatePAL = IsFrameRatePAL(properties.CurrentFrameRate);
+		string suf = GetFrameRateSuffix(isFrameRatePAL);
+		return "<<StartHours>>:<<StartMinutes>>:<<StartSeconds>>:<<StartMillisecondsAsFrames" + suf + ">>  <<EndHours>>:<<EndMinutes>>:<<EndSeconds>>:<<EndMillisecondsAsFrames" + suf + ">>\n<<Text>>\n";
+	}
+	
+	/// <summary>Returns whether the frame rate is closer to PAL (25) or to NTSC (29.97).</summary>
+	private bool IsFrameRatePAL (float frameRate) {
+		return (Math.Abs(frameRate - 25) <= Math.Abs(frameRate - 29.97));
+	}
+	
+	private string GetFrameRateSuffix (bool isFrameRatePAL) {
+		return (isFrameRatePAL ? "PAL" : "NTSC");
+	}
+
+}
+
+}



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]