diff --git a/FoxIPTV.sln b/FoxIPTV.sln index fc8b536..4498ac0 100644 --- a/FoxIPTV.sln +++ b/FoxIPTV.sln @@ -19,16 +19,16 @@ Global GlobalSection(ProjectConfigurationPlatforms) = postSolution {709ECA77-1F4B-4EA2-A90B-29272AF1E341}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {709ECA77-1F4B-4EA2-A90B-29272AF1E341}.Debug|Any CPU.Build.0 = Debug|Any CPU - {709ECA77-1F4B-4EA2-A90B-29272AF1E341}.Debug|x64.ActiveCfg = Debug|x64 - {709ECA77-1F4B-4EA2-A90B-29272AF1E341}.Debug|x64.Build.0 = Debug|x64 - {709ECA77-1F4B-4EA2-A90B-29272AF1E341}.Debug|x86.ActiveCfg = Debug|x86 - {709ECA77-1F4B-4EA2-A90B-29272AF1E341}.Debug|x86.Build.0 = Debug|x86 + {709ECA77-1F4B-4EA2-A90B-29272AF1E341}.Debug|x64.ActiveCfg = Debug|Any CPU + {709ECA77-1F4B-4EA2-A90B-29272AF1E341}.Debug|x64.Build.0 = Debug|Any CPU + {709ECA77-1F4B-4EA2-A90B-29272AF1E341}.Debug|x86.ActiveCfg = Debug|Any CPU + {709ECA77-1F4B-4EA2-A90B-29272AF1E341}.Debug|x86.Build.0 = Debug|Any CPU {709ECA77-1F4B-4EA2-A90B-29272AF1E341}.Release|Any CPU.ActiveCfg = Release|Any CPU {709ECA77-1F4B-4EA2-A90B-29272AF1E341}.Release|Any CPU.Build.0 = Release|Any CPU - {709ECA77-1F4B-4EA2-A90B-29272AF1E341}.Release|x64.ActiveCfg = Release|x64 - {709ECA77-1F4B-4EA2-A90B-29272AF1E341}.Release|x64.Build.0 = Release|x64 - {709ECA77-1F4B-4EA2-A90B-29272AF1E341}.Release|x86.ActiveCfg = Release|x86 - {709ECA77-1F4B-4EA2-A90B-29272AF1E341}.Release|x86.Build.0 = Release|x86 + {709ECA77-1F4B-4EA2-A90B-29272AF1E341}.Release|x64.ActiveCfg = Release|Any CPU + {709ECA77-1F4B-4EA2-A90B-29272AF1E341}.Release|x64.Build.0 = Release|Any CPU + {709ECA77-1F4B-4EA2-A90B-29272AF1E341}.Release|x86.ActiveCfg = Release|Any CPU + {709ECA77-1F4B-4EA2-A90B-29272AF1E341}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/FoxIPTV/Classes/Extensions.cs b/FoxIPTV/Classes/Extensions.cs index 0a6e3fd..5e5dfaa 100644 --- a/FoxIPTV/Classes/Extensions.cs +++ b/FoxIPTV/Classes/Extensions.cs @@ -14,6 +14,11 @@ public static class Extensions { public static List Difference(this T valueA, T valueB) { + if (valueA == null || valueB == null) + { + throw new ArgumentException(); + } + var differences = new List(); var properties = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); diff --git a/FoxIPTV/Classes/FixedQueue.cs b/FoxIPTV/Classes/FixedQueue.cs index c1477c1..f4afd37 100644 --- a/FoxIPTV/Classes/FixedQueue.cs +++ b/FoxIPTV/Classes/FixedQueue.cs @@ -21,7 +21,7 @@ class FixedQueue : ConcurrentQueue lock (_fixedQueueLock) { - while (Count > FixedSize && TryDequeue(out var tempObj)) { } + while (Count > FixedSize && TryDequeue(out _)) { } } } } diff --git a/FoxIPTV/Classes/Settings.cs b/FoxIPTV/Classes/Settings.cs index de806ad..12e81bf 100644 --- a/FoxIPTV/Classes/Settings.cs +++ b/FoxIPTV/Classes/Settings.cs @@ -2,11 +2,10 @@ namespace FoxIPTV.Classes { + using Newtonsoft.Json; using System.Drawing; using System.IO; - using System.Linq; using System.Threading; - using Newtonsoft.Json; public class Settings { @@ -20,8 +19,6 @@ public class Settings public Size TvFormSize { get; set; } = new Size(0, 0); - public string TvFormState { get; set; } - public Point TvFormOldLocation { get; set; } = new Point(0,0); public Size TvFormOldSize { get; set; } = new Size(0, 0); @@ -51,21 +48,23 @@ public class Settings public void Save() { - var differences = _loadedSettingsData.Difference(this); - - if (differences.Count == 0) + if (_loadedSettingsData != null) { - return; - } - - _fileLock.EnterWriteLock(); + var differences = _loadedSettingsData.Difference(this); + if (differences.Count == 0) + { + return; + } #if DEBUG - foreach (var diff in differences) - { - TvCore.LogDebug($"[Settings] {diff}"); - } + foreach (var diff in differences) + { + TvCore.LogDebug($"[Settings] {diff}"); + } #endif + } + + _fileLock.EnterWriteLock(); try { diff --git a/FoxIPTV/Classes/TvCore.cs b/FoxIPTV/Classes/TvCore.cs index d2e015a..2649e32 100644 --- a/FoxIPTV/Classes/TvCore.cs +++ b/FoxIPTV/Classes/TvCore.cs @@ -1,7 +1,5 @@ // Copyright (c) 2019 Fox Council - MIT License - https://github.com/FoxCouncil/FoxIPTV -using System.Drawing; - namespace FoxIPTV.Classes { using Newtonsoft.Json; @@ -9,6 +7,7 @@ namespace FoxIPTV.Classes using System; using System.Collections.Concurrent; using System.Collections.Generic; + using System.Drawing; using System.IO; using System.Linq; using System.Net; @@ -17,7 +16,6 @@ namespace FoxIPTV.Classes using System.Threading.Tasks; using System.Timers; using System.Windows.Forms; - using Properties; using Timer = System.Timers.Timer; public static class TvCore @@ -104,7 +102,7 @@ static TvCore() LogStart(); - LogInfo("[TVCore] Startup: Begining Fox IPTV Setup..."); + LogMessage($"[TVCore] Startup: Fox IPTV {Assembly.GetEntryAssembly().GetName().Version}..."); LogInfo("[TVCore] Startup: Binding ThreadException & UnhandledException..."); @@ -208,7 +206,7 @@ void LogException(Exception ex) BlacklistLoad(); - LogDebug($"[TVCore] Startup: Finished Fox IPTV TVCore Startup"); + LogMessage("[TVCore] Startup: Finished Fox IPTV TVCore Startup"); } public static void LogError(string message) => Log(TvCoreLogLevel.Error, message); @@ -228,10 +226,10 @@ public static async Task Start() ChangeState(TvCoreState.Starting); - var processedData = await CurrentService.Process(); + var (channels, guide) = await CurrentService.Process(); - Channels = processedData.Item1; - Guide = processedData.Item2; + Channels = channels; + Guide = guide; ChannelIndexList = Channels.Select(x => x.Index).ToList(); @@ -305,6 +303,7 @@ public static void AddFavoriteChannel(string channelId) FavoritesSave(); } +/* public static void AddFavoriteChannels(IEnumerable channelIds) { LogDebug("[TVCore] AddFavoriteChannels()"); @@ -314,6 +313,7 @@ public static void AddFavoriteChannels(IEnumerable channelIds) FavoritesSave(); } +*/ public static void RemoveFavoriteChannel(string channelId) { diff --git a/FoxIPTV/Classes/TvIconData.cs b/FoxIPTV/Classes/TvIconData.cs index 51c3e43..3b2af69 100644 --- a/FoxIPTV/Classes/TvIconData.cs +++ b/FoxIPTV/Classes/TvIconData.cs @@ -1,13 +1,14 @@ // Copyright (c) 2019 Fox Council - MIT License - https://github.com/FoxCouncil/FoxIPTV -using System; -using System.Globalization; -using System.Linq; -using Vlc.DotNet.Core.Interops; -using Vlc.DotNet.Core.Interops.Signatures; - namespace FoxIPTV.Classes { + using System; + using System.Diagnostics.CodeAnalysis; + using System.Globalization; + using System.Linq; + using Vlc.DotNet.Core.Interops; + using Vlc.DotNet.Core.Interops.Signatures; + public class TvIconData : IEquatable { private const string VIDEO_CODEC = "VC_{0}"; @@ -17,23 +18,37 @@ public class TvIconData : IEquatable private const string AUDIO_CHANNELS = "CH_{0}"; private const string AUDIO_RATE = "AR_{0}KHZ"; - public bool ClosedCaptioning; - public string VideoCodec; - public string VideoSize; - public string FrameRate; - public string AudioCodec; - public string AudioChannel; - public string AudioRate; + public bool ClosedCaptioning { get; set; } + + public string VideoCodec { get; set; } + + public string VideoSize { get; set; } + + public string FrameRate { get; set; } + + public string AudioCodec { get; set; } + + public string AudioChannel { get; set; } + + public string AudioRate { get; set; } /// public override bool Equals(object obj) { - if (ReferenceEquals(null, obj)) return false; - if (ReferenceEquals(this, obj)) return true; - if (obj.GetType() != GetType()) return false; - return Equals((TvIconData)obj); + if (obj is null) + { + return false; + } + + if (ReferenceEquals(this, obj)) + { + return true; + } + + return obj.GetType() == GetType() && Equals((TvIconData) obj); } + [SuppressMessage("ReSharper", "NonReadonlyMemberInGetHashCode")] public override int GetHashCode() { unchecked @@ -91,7 +106,7 @@ public static TvIconData CreateData(bool closedCaptioning, MediaTrack[] mediaTra if (videoTrack.FrameRateNum > 0) { - var frameRateStr = Math.Ceiling((double)videoTrack.FrameRateNum / (double)videoTrack.FrameRateDen).ToString(); + var frameRateStr = Math.Ceiling(videoTrack.FrameRateNum / (double)videoTrack.FrameRateDen).ToString(CultureInfo.InvariantCulture); if (videoTrack.FrameRateNum > 90 && videoTrack.FrameRateDen == 1) { diff --git a/FoxIPTV/Controls/GuideLayoutPanel.cs b/FoxIPTV/Controls/GuideLayoutPanel.cs index 2e8a86f..a44c5c6 100644 --- a/FoxIPTV/Controls/GuideLayoutPanel.cs +++ b/FoxIPTV/Controls/GuideLayoutPanel.cs @@ -6,7 +6,6 @@ namespace FoxIPTV.Controls using System.Drawing; using System.Linq; using System.Threading; - using System.Threading.Tasks; using System.Windows.Forms; using Classes; using Properties; @@ -371,19 +370,23 @@ private void Draw(bool drawAnyway = false) { borderedLabel.MouseEnter += (s, a) => { - var window = s as IWin32Window; - - _toolTip.Show(string.Empty, window, 0); + if (s is IWin32Window window) + { + _toolTip.Show(string.Empty, window, 0); + } }; borderedLabel.MouseMove += (s, a) => { - var window = s as IWin32Window; const int offset = 5; var newPoint = new Point(a.Location.X + offset, a.Location.Y + offset); _toolTip.ToolTipTitle = $"{channelCurrentProgramme.Start.ToLocalTime():h:mm tt} to {channelCurrentProgramme.Stop.ToLocalTime():h:mm tt} - {channelCurrentProgramme.BlockLength * 10} minutes"; - _toolTip.Show($"{channelCurrentProgramme.Title}\n{channelCurrentProgramme.Description}", window, newPoint); + + if (s is IWin32Window window) + { + _toolTip.Show($"{channelCurrentProgramme.Title}\n{channelCurrentProgramme.Description}", window, newPoint); + } }; borderedLabel.MouseLeave += (s, a) => { _toolTip.Hide(this); }; diff --git a/FoxIPTV/Forms/AboutForm.cs b/FoxIPTV/Forms/AboutForm.cs index 37583b9..cb8a33f 100644 --- a/FoxIPTV/Forms/AboutForm.cs +++ b/FoxIPTV/Forms/AboutForm.cs @@ -1,17 +1,10 @@ // Copyright (c) 2019 Fox Council - MIT License - https://github.com/FoxCouncil/FoxIPTV -using System; -using System.Collections.Generic; -using System.ComponentModel; -using System.Data; -using System.Drawing; -using System.Linq; -using System.Text; -using System.Threading.Tasks; -using System.Windows.Forms; - namespace FoxIPTV.Forms { + using System; + using System.Windows.Forms; + public partial class AboutForm : Form { public AboutForm() diff --git a/FoxIPTV/Forms/ChannelsForm.Designer.cs b/FoxIPTV/Forms/ChannelsForm.Designer.cs index 97109f4..c3b5d3d 100644 --- a/FoxIPTV/Forms/ChannelsForm.Designer.cs +++ b/FoxIPTV/Forms/ChannelsForm.Designer.cs @@ -104,9 +104,9 @@ private void InitializeComponent() this.textBoxAllChannelsSearch.Size = new System.Drawing.Size(264, 20); this.textBoxAllChannelsSearch.TabIndex = 1; this.textBoxAllChannelsSearch.Text = "Search..."; - this.textBoxAllChannelsSearch.TextChanged += new System.EventHandler(this.textBoxAllChannelsSearch_TextChanged); - this.textBoxAllChannelsSearch.Enter += new System.EventHandler(this.textBoxAllChannelsSearch_Enter); - this.textBoxAllChannelsSearch.Leave += new System.EventHandler(this.textBoxAllChannelsSearch_Leave); + this.textBoxAllChannelsSearch.TextChanged += new System.EventHandler(this.TextBoxAllChannelsSearch_TextChanged); + this.textBoxAllChannelsSearch.Enter += new System.EventHandler(this.TextBoxAllChannelsSearch_Enter); + this.textBoxAllChannelsSearch.Leave += new System.EventHandler(this.TextBoxAllChannelsSearch_Leave); // // flowLayoutPanel1 // @@ -133,7 +133,7 @@ private void InitializeComponent() this.buttonFilterNone.Tag = "None"; this.buttonFilterNone.Text = "None"; this.buttonFilterNone.UseVisualStyleBackColor = true; - this.buttonFilterNone.Click += new System.EventHandler(this.buttonFilter_Click); + this.buttonFilterNone.Click += new System.EventHandler(this.ButtonFilter_Click); // // buttonFilterCountries // @@ -146,7 +146,7 @@ private void InitializeComponent() this.buttonFilterCountries.Tag = "Countries"; this.buttonFilterCountries.Text = "Countries"; this.buttonFilterCountries.UseVisualStyleBackColor = true; - this.buttonFilterCountries.Click += new System.EventHandler(this.buttonFilter_Click); + this.buttonFilterCountries.Click += new System.EventHandler(this.ButtonFilter_Click); // // splitContainer // @@ -278,7 +278,7 @@ private void InitializeComponent() this.buttonFavoriteAdd.TabIndex = 1; this.buttonFavoriteAdd.Text = "Add To Favourites"; this.buttonFavoriteAdd.UseVisualStyleBackColor = true; - this.buttonFavoriteAdd.Click += new System.EventHandler(this.buttonFavoriteAdd_Click); + this.buttonFavoriteAdd.Click += new System.EventHandler(this.ButtonFavoriteAdd_Click); // // buttonFavoriteRemove // @@ -292,7 +292,7 @@ private void InitializeComponent() this.buttonFavoriteRemove.TabIndex = 2; this.buttonFavoriteRemove.Text = "Remove Favourite"; this.buttonFavoriteRemove.UseVisualStyleBackColor = true; - this.buttonFavoriteRemove.Click += new System.EventHandler(this.buttonFavoriteRemove_Click); + this.buttonFavoriteRemove.Click += new System.EventHandler(this.ButtonFavoriteRemove_Click); // // ChannelsForm // diff --git a/FoxIPTV/Forms/ChannelsForm.cs b/FoxIPTV/Forms/ChannelsForm.cs index 37e004c..7791f16 100644 --- a/FoxIPTV/Forms/ChannelsForm.cs +++ b/FoxIPTV/Forms/ChannelsForm.cs @@ -2,12 +2,12 @@ namespace FoxIPTV.Forms { + using Classes; + using Properties; using System; + using System.Linq; using System.Threading; using System.Windows.Forms; - using Classes; - using System.Linq; - using Properties; public partial class ChannelsForm : Form { @@ -15,7 +15,7 @@ public partial class ChannelsForm : Form private bool _isInitialized; - private bool _isChannelChanging = false; + private bool _isChannelChanging; private string _allChannelsFilter; @@ -98,7 +98,7 @@ private void UpdateGui() treeViewAllChannels.SelectedNode = treeViewAllChannels.Nodes[0].Nodes[currentChannelIndex.ToString()]; } - labelChannelName.Text = $"{TvCore.CurrentChannel.Index}\n{TvCore.CurrentChannel.Name.Replace(": ", "\n")}"; + labelChannelName.Text = string.Format(Resources.ChannelsForm_ChannelNameLabel, TvCore.CurrentChannel.Index, TvCore.CurrentChannel.Name.Replace(": ", "\n")); if (TvCore.CurrentChannel.Logo == null) { @@ -154,13 +154,13 @@ private void LoadChannels() tvChannelCategories.Sort(); - var tmpTreeNode = new TreeNode("NodeRoot") { Name = "NodeRoot", Text = $"{_allChannelCategoryFilter} ({tvChannelCategories.Count})" }; + var tmpTreeNode = new TreeNode("NodeRoot") { Name = "NodeRoot", Text = string.Format(Resources.ChannelsForm_CategoryNodeTitle, _allChannelCategoryFilter, tvChannelCategories.Count) }; foreach (var channelCat in tvChannelCategories) { var tvChannelByCat = tvChannels.FindAll(x => x.Name.ToLower().StartsWith(channelCat.ToLower() + ":")); - var tmpCatTreeNode = new TreeNode($"NodeCat{channelCat}") { Name = $"NodeCat{channelCat}", Text = channelCat + $" ({tvChannelByCat.Count})" }; + var tmpCatTreeNode = new TreeNode($"NodeCat{channelCat}") { Name = $"NodeCat{channelCat}", Text = string.Format(Resources.ChannelsForm_CategoryNodeTitle, channelCat, tvChannelByCat.Count) }; foreach (var channel in tvChannelByCat) { @@ -173,7 +173,7 @@ private void LoadChannels() if (tvChannelsCopy.Any()) { - var naCatTreeNode = new TreeNode("NodeCatNA") { Name = "NodeCatNA", Text = $"N/A ({tvChannelsCopy.Count})" }; + var naCatTreeNode = new TreeNode("NodeCatNA") { Name = "NodeCatNA", Text = string.Format(Resources.ChannelsForm_CategoryNotAvailableTitle, tvChannelsCopy.Count) }; foreach (var channel in tvChannelsCopy.ToList()) { @@ -193,7 +193,7 @@ private void LoadChannels() } else { - var tmpTreeNode = new TreeNode("NodeRoot") { Name = "NodeRoot", Text = $"All Channels ({tvChannels.Count})" }; + var tmpTreeNode = new TreeNode("NodeRoot") { Name = "NodeRoot", Text = string.Format(Resources.ChannelsForm_AllChannelsTitle, tvChannels.Count) }; foreach (var channel in tvChannels) { @@ -220,7 +220,7 @@ private void LoadFavoriteChannels() return; } - var tmpTreeNode = new TreeNode("NodeRoot") { Name = "NodeRoot", Text = $"Favorite Channels ({channelFavoritesCount})" }; + var tmpTreeNode = new TreeNode("NodeRoot") { Name = "NodeRoot", Text = string.Format(Resources.ChannelsForm_FavoritesRootTitle, channelFavoritesCount) }; foreach (var channelId in TvCore.ChannelFavorites) { @@ -252,7 +252,7 @@ private void ChannelsForm_FormClosing(object sender, FormClosingEventArgs e) Hide(); } - private void textBoxAllChannelsSearch_Enter(object sender, EventArgs e) + private void TextBoxAllChannelsSearch_Enter(object sender, EventArgs e) { if (textBoxAllChannelsSearch.Text == SearchTextFieldPlaceholder) { @@ -260,7 +260,7 @@ private void textBoxAllChannelsSearch_Enter(object sender, EventArgs e) } } - private void textBoxAllChannelsSearch_Leave(object sender, EventArgs e) + private void TextBoxAllChannelsSearch_Leave(object sender, EventArgs e) { if (string.IsNullOrWhiteSpace(textBoxAllChannelsSearch.Text)) { @@ -268,26 +268,19 @@ private void textBoxAllChannelsSearch_Leave(object sender, EventArgs e) } } - private void textBoxAllChannelsSearch_TextChanged(object sender, EventArgs e) + private void TextBoxAllChannelsSearch_TextChanged(object sender, EventArgs e) { if (textBoxAllChannelsSearch.Text == SearchTextFieldPlaceholder) { return; } - if (!string.IsNullOrWhiteSpace(textBoxAllChannelsSearch.Text)) - { - _allChannelsFilter = textBoxAllChannelsSearch.Text; - } - else - { - _allChannelsFilter = string.Empty; - } + _allChannelsFilter = !string.IsNullOrWhiteSpace(textBoxAllChannelsSearch.Text) ? textBoxAllChannelsSearch.Text : string.Empty; LoadAll(); } - private void buttonFilter_Click(object sender, EventArgs e) + private void ButtonFilter_Click(object sender, EventArgs e) { if (!(sender is Button button)) { @@ -319,7 +312,7 @@ private void buttonFilter_Click(object sender, EventArgs e) LoadAll(); } - private void buttonFavoriteAdd_Click(object sender, EventArgs e) + private void ButtonFavoriteAdd_Click(object sender, EventArgs e) { var channelIdx = int.Parse(treeViewAllChannels.SelectedNode.Name); @@ -327,17 +320,16 @@ private void buttonFavoriteAdd_Click(object sender, EventArgs e) if (channel == null) { - MessageBox.Show("Oops"); + TvCore.LogError("[.NET] Channel was not found when adding to favorite channels"); + return; } - else - { - TvCore.AddFavoriteChannel(channel.Id); - LoadAll(); - } + TvCore.AddFavoriteChannel(channel.Id); + + LoadAll(); } - private void buttonFavoriteRemove_Click(object sender, EventArgs e) + private void ButtonFavoriteRemove_Click(object sender, EventArgs e) { var channelIdx = int.Parse(treeViewFavoriteChannels.SelectedNode.Name); @@ -345,14 +337,13 @@ private void buttonFavoriteRemove_Click(object sender, EventArgs e) if (channel == null) { - MessageBox.Show("Oops"); + TvCore.LogError("[.NET] Channel was not found when removing a favorite channel"); + return; } - else - { - TvCore.RemoveFavoriteChannel(channel.Id); - LoadAll(); - } + TvCore.RemoveFavoriteChannel(channel.Id); + + LoadAll(); } } } diff --git a/FoxIPTV/Forms/GuideForm.Designer.cs b/FoxIPTV/Forms/GuideForm.Designer.cs index 375efb7..858d03b 100644 --- a/FoxIPTV/Forms/GuideForm.Designer.cs +++ b/FoxIPTV/Forms/GuideForm.Designer.cs @@ -98,7 +98,7 @@ private void InitializeComponent() // this.timer.Enabled = true; this.timer.Interval = 375; - this.timer.Tick += new System.EventHandler(this.timer_Tick); + this.timer.Tick += new System.EventHandler(this.Timer_Tick); // // GuideForm // diff --git a/FoxIPTV/Forms/GuideForm.cs b/FoxIPTV/Forms/GuideForm.cs index 4e7e3a3..ef0e525 100644 --- a/FoxIPTV/Forms/GuideForm.cs +++ b/FoxIPTV/Forms/GuideForm.cs @@ -41,9 +41,9 @@ private void GuideForm_FormClosing(object sender, FormClosingEventArgs e) Hide(); } - private void timer_Tick(object sender, EventArgs e) + private void Timer_Tick(object sender, EventArgs e) { - labelDateTime.Text = $"{DateTime.Now:F}"; + labelDateTime.Text = string.Format(Resources.GuideForm_HeaderTimeFormat, DateTime.Now); } } } diff --git a/FoxIPTV/Forms/LoginForm.cs b/FoxIPTV/Forms/LoginForm.cs index d736803..1a27fc4 100644 --- a/FoxIPTV/Forms/LoginForm.cs +++ b/FoxIPTV/Forms/LoginForm.cs @@ -1,20 +1,21 @@ // Copyright (c) 2019 Fox Council - MIT License - https://github.com/FoxCouncil/FoxIPTV -using System; -using System.Collections.Generic; -using System.Drawing; -using System.Windows.Forms; -using FoxIPTV.Classes; - namespace FoxIPTV.Forms { + using System; + using System.Collections.Generic; + using System.Drawing; + using System.Windows.Forms; + using Classes; + using Properties; + public partial class LoginForm : Form { - private Size _originalFormSize; + private readonly Size _originalFormSize; - private List