From 6051aa0f78e07a069ea44230a72d2e765a1893ba Mon Sep 17 00:00:00 2001 From: sr55 Date: Fri, 31 Jul 2009 15:50:17 +0000 Subject: [PATCH] WinGui: - Fixed and issue during scan where missing audio track information would cause the log parser to throw an exception. - Added support for "Growl for Windows" http://growlforwindows.com/gfw/ - Thanks to bdunnington git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@2739 b64f7644-9d1e-0410-96f1-a4d463321fa5 --- win/C#/Changelog.html | 32 ++++-- win/C#/EncodeQueue/EncodeAndQueueHandler.cs | 3 + win/C#/Functions/GrowlCommunicator.cs | 109 ++++++++++++++++++++ win/C#/HandBrakeCS.csproj | 11 ++ win/C#/Parsing/AudioTrack.cs | 6 +- win/C#/frmMain.cs | 5 +- win/C#/frmOptions.Designer.cs | 1 + win/C#/frmOptions.resx | 3 - win/C#/libraries/Growl.Connector.dll | Bin 0 -> 61440 bytes win/C#/libraries/Growl.CoreLibrary.dll | Bin 0 -> 24576 bytes 10 files changed, 157 insertions(+), 13 deletions(-) create mode 100644 win/C#/Functions/GrowlCommunicator.cs create mode 100644 win/C#/libraries/Growl.Connector.dll create mode 100644 win/C#/libraries/Growl.CoreLibrary.dll diff --git a/win/C#/Changelog.html b/win/C#/Changelog.html index 9bec1dafe..bf5df3582 100644 --- a/win/C#/Changelog.html +++ b/win/C#/Changelog.html @@ -8,7 +8,29 @@ Windows Platform Specific Changlog.
-

Major Changes

+

Changes since Snapshot 1 - SVN2592

+ +

Major Changes

+ - Added support for Sparkle for Windows.
+ - Import MacGUI presets.
+ - External SRT supported added.
+ +

Minor Improvements / Changes

+ - Some UI layout changes / improvements
+ - Added new options: preferred language, "Dub Foreign language audio" and "Use Foreign language audio and Subtitles"
+ - Remove M4v from format dropdown and add new option "Use iPod/iTunes friendly (.m4v) file extension for MP4
+ + +

Fixed

+ - Re-written the Picture Settings Panel code so it should now work alot better.
+ - Issue where the GUI would error if the encode was stoped too quickly.
+ - Numerous other fixes including: Quality slider resetting to 0 and other settings lost when a title change occurs.
+ - Fixes some scaling / quality issues with QuickTime preview. Also added a possible fix for QT not working on 64bit systems.
+ + + +

Changes since 0.9.3

+

Major Changes

- Video Preview window using QuickTime or VLC. (5 to 60 second preview clips)
- Re-designed audio tab. Now uses a List and allows for >4 audio channels.
@@ -21,9 +43,7 @@ Windows Platform Specific Changlog.
- Improved control over how logs are stored. Logs are now kept in the Application data folder for each user.
- The Main window and the Queue "Start/Stop" buttons are now linked. Start on the main window starts the Queue. They are no longer separate.
- - -

Minor Improvements / Changes

+

Minor Improvements / Changes

- Resizable queue Window
- Scanning a source no longer uses a separate popup window. Scanning simply disables the main window, and displays the status much like the MacGUI
- Queue recovery now uses an XML file.
@@ -44,9 +64,7 @@ Windows Platform Specific Changlog.
- CLI status can now be displayed in-GUI instead of the CLI readout. (Experimental)
- Misc Typo's
- - -

Fixed

+

Fixed

- Source and Destination fields unpopulated on queue in certain conditions.
- Several bugs in the way x264 widgets are handled with custom x264 strings.
- Fixed a null pointer exception after scan if all presets had been deleted.
diff --git a/win/C#/EncodeQueue/EncodeAndQueueHandler.cs b/win/C#/EncodeQueue/EncodeAndQueueHandler.cs index 319163de6..a3f8ca6c0 100644 --- a/win/C#/EncodeQueue/EncodeAndQueueHandler.cs +++ b/win/C#/EncodeQueue/EncodeAndQueueHandler.cs @@ -448,6 +448,9 @@ namespace Handbrake.EncodeQueue case "Lock System": Win32.LockWorkStation(); break; + case "Growl Notification": + GrowlCommunicator.Notify(); + break; case "Quit HandBrake": Application.Exit(); break; diff --git a/win/C#/Functions/GrowlCommunicator.cs b/win/C#/Functions/GrowlCommunicator.cs new file mode 100644 index 000000000..eb4091a43 --- /dev/null +++ b/win/C#/Functions/GrowlCommunicator.cs @@ -0,0 +1,109 @@ +using System; +using System.Collections.Generic; +using System.Text; +using Growl.Connector; +using Growl.CoreLibrary; + +namespace Handbrake.Functions +{ + /// + /// Provides all functionality for communicating with Growl for Windows. + /// + /// + /// This class is implemented as a static class because: + /// 1. It allows nearly all of the Growl-related code to be in one place + /// 2. It prevents the main form, queue handler, and any other part of Handbrake from having to declare + /// or track any new instance variables + /// + public static class GrowlCommunicator + { + /// + /// The that actually talks to Growl + /// + private static GrowlConnector growl; + + /// + /// The Handbrake application instance that is registered with Growl + /// + private static Application application; + + /// + /// Notification shown upon completion of encoding + /// + public static NotificationType EncodingComplete; + + + /// + /// Checks to see if Growl is currently running on the local machine. + /// + /// + /// true if Growl is running; + /// false otherwise + /// + public static bool IsRunning() + { + Initialize(); + + return growl.IsGrowlRunning(); + } + + /// + /// Registers Handbrake with the local Growl instance + /// + /// + /// This should usually be called at application start-up + /// + public static void Register() + { + Initialize(); + + growl.Register(application, new NotificationType[] { EncodingComplete }); + } + + /// + /// Sends a notification to Growl. (Since Handbrake currently only supports one type of notification with + /// static text, this is a shortcut method). + /// + public static void Notify() + { + string title = "Encoding Complete"; + string text = "Put down that cocktail...\nyour Handbrake encode is done."; + Notification notification = new Notification(application.Name, EncodingComplete.Name, String.Empty, title, text); + + growl.Notify(notification); + } + + /// + /// Sends a notification to Growl. (This is the more generic version that could be used in the future if + /// more notification types are implemented) + /// + /// The type of notification to send + /// The notification title + /// The notification text + /// The notification image as a url + public static void Notify(NotificationType notificationType, string title, string text, string imageUrl) + { + Notification notification = new Notification(application.Name, notificationType.Name, String.Empty, title, text); + notification.Icon = imageUrl; + + growl.Notify(notification); + } + + /// + /// Initializes the GrowlCommunicator + /// + private static void Initialize() + { + if (growl == null) + { + growl = new GrowlConnector(); + growl.EncryptionAlgorithm = Cryptography.SymmetricAlgorithmType.PlainText; + + application = new Application("Handbrake"); + application.Icon = global::Handbrake.Properties.Resources.logo64; + + EncodingComplete = new NotificationType("Encoding Complete"); + } + } + } +} diff --git a/win/C#/HandBrakeCS.csproj b/win/C#/HandBrakeCS.csproj index e89fa5471..9f1667cb9 100644 --- a/win/C#/HandBrakeCS.csproj +++ b/win/C#/HandBrakeCS.csproj @@ -91,6 +91,16 @@ x86 + + False + libraries\Growl.Connector.dll + True + + + False + libraries\Growl.CoreLibrary.dll + True + @@ -190,6 +200,7 @@ frmUpdater.cs + diff --git a/win/C#/Parsing/AudioTrack.cs b/win/C#/Parsing/AudioTrack.cs index c4e1bbc22..56a35194b 100644 --- a/win/C#/Parsing/AudioTrack.cs +++ b/win/C#/Parsing/AudioTrack.cs @@ -99,6 +99,8 @@ namespace Handbrake.Parsing Match bitrate = Regex.Match(audio_track, @"([0-9]*)bps"); string subformat = m.Groups[4].Value.Trim().Contains("iso639") ? null : m.Groups[4].Value; + string samplerateVal = samplerate.Success ? samplerate.Groups[0].Value.Replace("Hz", "").Trim() : "0"; + string bitrateVal = bitrate.Success ? bitrate.Groups[0].Value.Replace("bps", "").Trim() : "0"; if (track.Success) { @@ -108,8 +110,8 @@ namespace Handbrake.Parsing m_language = track.Groups[2].Value, m_format = m.Groups[3].Value, m_subFormat = subformat, - m_frequency = int.Parse(samplerate.Groups[0].Value.Replace("Hz","").Trim()), - m_bitrate = int.Parse(bitrate.Groups[0].Value.Replace("bps","").Trim()), + m_frequency = int.Parse(samplerateVal), + m_bitrate = int.Parse(bitrateVal), m_iso639_2 = iso639_2.Value.Replace("iso639-2: ", "").Replace(")", "") }; return thisTrack; diff --git a/win/C#/frmMain.cs b/win/C#/frmMain.cs index e40f558f7..94e2cc6d0 100644 --- a/win/C#/frmMain.cs +++ b/win/C#/frmMain.cs @@ -119,6 +119,9 @@ namespace Handbrake if (Properties.Settings.Default.tooltipEnable) ToolTip.Active = true; + // Register with Growl (if not using Growl for the encoding completion action, this wont hurt anything) + GrowlCommunicator.Register(); + //Finished Loading lblStatus.Text = "Loading Complete!"; Application.DoEvents(); @@ -1440,7 +1443,7 @@ namespace Handbrake dvdInfoPath); } - using (StreamReader sr = new StreamReader(dvdInfoPath)) + using (StreamReader sr = new StreamReader("scanlog.txt")) { thisDVD = DVD.Parse(sr); sr.Close(); diff --git a/win/C#/frmOptions.Designer.cs b/win/C#/frmOptions.Designer.cs index 9d54c4ec2..ff14b8a89 100644 --- a/win/C#/frmOptions.Designer.cs +++ b/win/C#/frmOptions.Designer.cs @@ -176,6 +176,7 @@ namespace Handbrake "Hibernate", "Lock system", "Log off", + "Growl Notification", "Quit HandBrake"}); this.drp_completeOption.Location = new System.Drawing.Point(106, 119); this.drp_completeOption.Name = "drp_completeOption"; diff --git a/win/C#/frmOptions.resx b/win/C#/frmOptions.resx index 427cdd964..139d8245b 100644 --- a/win/C#/frmOptions.resx +++ b/win/C#/frmOptions.resx @@ -120,9 +120,6 @@ 132, 18 - - 132, 18 - 17, 17 diff --git a/win/C#/libraries/Growl.Connector.dll b/win/C#/libraries/Growl.Connector.dll new file mode 100644 index 0000000000000000000000000000000000000000..29e33d610fa8bd15387e3281ceada7a90b9d8ee3 GIT binary patch literal 61440 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 L2q*&oB?5l|LfG6R literal 0 HcmV?d00001 diff --git a/win/C#/libraries/Growl.CoreLibrary.dll b/win/C#/libraries/Growl.CoreLibrary.dll new file mode 100644 index 0000000000000000000000000000000000000000..0cfe12d3331d60230cdbd4d7c6bd5f72e9513c33 GIT binary patch literal 24576 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 literal 0 HcmV?d00001 -- 2.40.0