4
4
using SubDBSharp . Http ;
5
5
using System ;
6
6
using System . Collections . Generic ;
7
+ using System . Diagnostics ;
7
8
using System . IO ;
8
9
using System . Linq ;
9
10
using System . Text ;
@@ -18,7 +19,7 @@ public partial class Main : Form
18
19
private string _rootDirectory ;
19
20
20
21
// Contains list of movie/tv-show to be downloaded
21
- private IList < MediaInfo > _mediaFiles ;
22
+ private readonly IList < MediaInfo > _mediaFiles ;
22
23
23
24
// SubDbSharp api client
24
25
private readonly SubDBClient _client ;
@@ -34,12 +35,11 @@ public Main()
34
35
35
36
IgnoreExtensions = new HashSet < string > ( )
36
37
{
37
- ".srt" , ".txt" , ".nfo" , ".mp3" , ".jpg" , ".rar" , ".zip" , ".7zip"
38
+ ".srt" , ".txt" , ".nfo" , ".mp3" , ".jpg" , ".rar" , ".zip" , ".7zip" , ".png"
38
39
} ;
39
40
40
41
_mediaFiles = new List < MediaInfo > ( ) ;
41
42
42
-
43
43
// initialize encoding combobox
44
44
InitializeEncoding ( ) ;
45
45
@@ -50,17 +50,16 @@ public Main()
50
50
private void InitializeLanguageCombobox ( )
51
51
{
52
52
// .Result can produce a deadlock in certain scenario's
53
- Response languages = _client . GetAvailableLanguagesAsync ( ) . Result ;
53
+ Response languages = _client . GetAvailableLanguagesAsync ( ) . GetAwaiter ( ) . GetResult ( ) ;
54
54
55
55
byte [ ] buffer = ( byte [ ] ) languages . Body ;
56
56
string csvLanguage = Encoding . UTF8 . GetString ( buffer , 0 , buffer . Length ) ;
57
57
58
58
// e.g: en, pt, fr...
59
59
foreach ( string language in csvLanguage . Split ( ',' ) )
60
60
{
61
- var cbi = new LanguageItem ( language ) ;
62
- // TODO: Review why after .ToString() return EnglishName (e.g: English) it keeps
63
- // showing "en" instead...
61
+ LanguageItem cbi = new LanguageItem ( language ) ;
62
+ // TODO: Review why after .ToString() return EnglishName (e.g: English) it keeps showing "en" instead...
64
63
comboBoxLanguage . Items . Add ( cbi ) ;
65
64
}
66
65
@@ -73,7 +72,7 @@ private void InitializeEncoding()
73
72
int utf8Idx = - 1 ;
74
73
foreach ( EncodingInfo encoding in Encoding . GetEncodings ( ) )
75
74
{
76
- var ei = new EncodingItem
75
+ EncodingItem ei = new EncodingItem
77
76
{
78
77
Encoding = encoding . GetEncoding ( )
79
78
} ;
@@ -91,14 +90,12 @@ private void InitializeEncoding()
91
90
92
91
private void ButtonBrowse_Click ( object sender , EventArgs e )
93
92
{
94
- using ( var fbd = new FolderBrowserDialog ( ) )
93
+ using ( FolderBrowserDialog folderDialog = new FolderBrowserDialog { ShowNewFolderButton = true , SelectedPath = _rootDirectory } )
95
94
{
96
- // Configure folder dialog
97
-
98
- if ( fbd . ShowDialog ( ) == DialogResult . OK )
95
+ if ( folderDialog . ShowDialog ( ) == DialogResult . OK )
99
96
{
100
- textBoxPath . Text = fbd . SelectedPath ;
101
- // get all movie files and store them in a list for later access...
97
+ _rootDirectory = folderDialog . SelectedPath ;
98
+ textBoxPath . Text = folderDialog . SelectedPath ;
102
99
}
103
100
}
104
101
}
@@ -108,19 +105,20 @@ private int LoadMedias()
108
105
_mediaFiles . Clear ( ) ;
109
106
foreach ( string file in Directory . GetFiles ( _rootDirectory ) )
110
107
{
111
- if ( IgnoreExtensions . Contains ( Path . GetExtension ( file ) ) )
108
+ // filter extension
109
+ string lowerExtension = Path . GetExtension ( file ) ;
110
+ if ( IgnoreExtensions . Contains ( lowerExtension ) )
112
111
{
113
112
continue ;
114
113
}
115
- var mf = new MediaInfo ( file ) ;
116
- _mediaFiles . Add ( mf ) ;
114
+
115
+ _mediaFiles . Add ( MediaInfo . FromFile ( file ) ) ;
117
116
}
118
117
return _mediaFiles . Count ;
119
118
}
120
119
121
120
private async void ButtonDownload_Click ( object sender , EventArgs e )
122
121
{
123
-
124
122
// validation fails
125
123
if ( ! IsValid ( ) )
126
124
{
@@ -134,54 +132,67 @@ private async void ButtonDownload_Click(object sender, EventArgs e)
134
132
//disable all controls
135
133
ChangeControlsState ( false ) ;
136
134
137
- await DownloadAsync ( ) ;
135
+ await DownloadAsync ( ) . ConfigureAwait ( true ) ;
138
136
139
- //await Task.Yield(); was an attemp to continue on main thread
137
+ // force async
138
+ //await Task.Yield();
140
139
//ChangeControlsStates(false);
141
-
142
140
}
143
141
144
142
private async Task DownloadAsync ( )
145
143
{
146
- var cbi = ( LanguageItem ) comboBoxLanguage . SelectedItem ;
144
+ LanguageItem cbi = ( LanguageItem ) comboBoxLanguage . SelectedItem ;
147
145
148
146
// encoding used to write content in file
149
147
Encoding writeEncoding = ( ( EncodingItem ) comboBoxEncoding . SelectedItem ) . Encoding ;
150
148
151
- // REPORT DOWNLOAD PROGRESS
152
- var progressHandler = new Progress < int > ( value =>
149
+ // report download progress
150
+ Progress < string > progressReporter = new Progress < string > ( value =>
153
151
{
154
- progressBar1 . Value += value ;
152
+ //progressBar1.Value += value;
153
+ progressBar1 . Value += 1 ;
154
+ if ( File . Exists ( value ) )
155
+ {
156
+ Trace . WriteLine ( "file downloaded!" ) ;
157
+ }
155
158
if ( progressBar1 . Value == progressBar1 . Maximum )
156
159
{
157
160
MessageBox . Show ( "Download completed!" ) ;
158
161
ChangeControlsState ( true ) ;
159
162
}
160
163
} ) ;
161
164
162
- var progress = progressHandler as IProgress < int > ;
165
+ // this need to happen because Progress<T> implement IProgress interface explicitly
166
+ IProgress < string > reporter = progressReporter ;
163
167
164
168
for ( int i = 0 ; i < _mediaFiles . Count ; ++ i )
165
169
{
166
170
MediaInfo mediaInfo = _mediaFiles [ i ] ;
167
- Response response = await _client . DownloadSubtitleAsync ( mediaInfo . Hash , cbi . CultureInfo . TwoLetterISOLanguageName ) . ConfigureAwait ( false ) ;
168
171
169
- // report progress
170
- progress ? . Report ( 1 ) ;
172
+ Response response = await _client . DownloadSubtitleAsync ( mediaInfo . Hash ,
173
+ cbi . CultureInfo . TwoLetterISOLanguageName ) . ConfigureAwait ( false ) ;
171
174
175
+ // download failed
172
176
if ( response . StatusCode != System . Net . HttpStatusCode . OK )
173
177
{
178
+ Trace . WriteLine ( $ "Failed downloadeding: { _mediaFiles [ i ] . FileInfo . Name } ") ;
174
179
continue ;
175
180
}
176
- string path = Path . Combine ( Path . GetDirectoryName ( mediaInfo . FileInfo . FullName ) , Path . GetFileNameWithoutExtension ( mediaInfo . FileInfo . Name ) + ".srt" ) ;
181
+
182
+ // generate file output location
183
+ string path = Path . Combine ( Path . GetDirectoryName ( mediaInfo . FileInfo . FullName ) ,
184
+ Path . GetFileNameWithoutExtension ( mediaInfo . FileInfo . Name ) + ".srt" ) ;
177
185
178
186
byte [ ] buffer = ( byte [ ] ) response . Body ;
179
187
180
- // encoding used to read data
181
- Encoding readEncoding = EncodingDetector . DetectAnsiEncoding ( buffer ) ;
188
+ // read content using guessed encoding
189
+ string content = EncodingDetector . DetectAnsiEncoding ( buffer ) . GetString ( buffer , 0 , buffer . Length ) ;
182
190
183
- string content = readEncoding . GetString ( buffer , 0 , buffer . Length ) ;
191
+ // write downloaded file to disk
184
192
File . WriteAllText ( path , content , writeEncoding ) ;
193
+
194
+ // report progress
195
+ reporter ? . Report ( path ) ;
185
196
}
186
197
}
187
198
@@ -197,7 +208,6 @@ private void ChangeControlsState(bool enabled)
197
208
198
209
private bool IsValid ( )
199
210
{
200
- _rootDirectory = textBoxPath . Text . Trim ( ) ;
201
211
if ( ! Path . IsPathRooted ( _rootDirectory ) )
202
212
{
203
213
MessageBox . Show ( "Invalid path!" ) ;
@@ -217,7 +227,7 @@ private bool IsValid()
217
227
return true ;
218
228
}
219
229
220
- private void textBox1_DragEnter ( object sender , DragEventArgs e )
230
+ private void TextBox1_DragEnter ( object sender , DragEventArgs e )
221
231
{
222
232
e . Effect = e . Data . GetDataPresent ( DataFormats . FileDrop ) ? DragDropEffects . Copy : DragDropEffects . None ;
223
233
}
@@ -231,4 +241,5 @@ private void textBox1_DragDrop(object sender, DragEventArgs e)
231
241
}
232
242
}
233
243
}
244
+
234
245
}
0 commit comments