mAgicAnime 俺用改造版
Révision | a5753d88fd6d0f140f3c0901927fe7993ea8ef6f (tree) |
---|---|
l'heure | 2019-11-24 17:07:25 |
Auteur | yoshy <yoshy@user...> |
Commiter | yoshy |
[FIX] 曜日と時刻の平均でソートする際に現在日時以降の放送開始日時のみを有効とするよう修正
複数クールの再放送の場合、現四半期分までしか登録されていないため未登録分は1つ前の本/再放送の日時となりソート結果が不正となるため。
@@ -65,8 +65,11 @@ namespace magicAnime | ||
65 | 65 | public int priority = 30; // 優先度(最低10〜最高50) |
66 | 66 | public bool enableFilterKeyword = false; // 録画ファイルを指定文字列でフィルタ |
67 | 67 | public string filterKeyword = ""; // フィルタ文字列 |
68 | + // add yossiepon 20191124 begin | |
69 | + public DateTime mSortRepresentative; // ソートに使用する代表時刻 | |
70 | + // add yossiepon 20191124 end | |
68 | 71 | |
69 | - private int mStoryCount; | |
72 | + private int mStoryCount; | |
70 | 73 | // add yossiepon 20160806 begin |
71 | 74 | private int mSpecialStoryCount; |
72 | 75 | // add yossiepon 20160806 end |
@@ -82,8 +85,8 @@ namespace magicAnime | ||
82 | 85 | private EpisodeList mSpecialEpisodes; // この番組の符番されていない各話(Episode)の集合 |
83 | 86 | // add yossiepon 20160806 end |
84 | 87 | private Mutex mEpisodeLock = new Mutex(); |
85 | - private DateTime mLastUpdate; // データーベースからの最終更新時刻 | |
86 | - private Image mThambnailImage = null; | |
88 | + private DateTime mLastUpdate; // データーベースからの最終更新時刻 | |
89 | + private Image mThambnailImage = null; | |
87 | 90 | private Mutex mThambnailLock = new Mutex(); |
88 | 91 | |
89 | 92 |
@@ -588,19 +588,26 @@ namespace magicAnime | ||
588 | 588 | internal void SortAnime(AnimeSort sort) |
589 | 589 | { |
590 | 590 | lock( mAnimeList ) |
591 | - mAnimeList.Sort( sort ); | |
592 | - | |
593 | - } | |
594 | - | |
595 | - //========================================================================= | |
596 | - /// <summary> | |
597 | - /// 録画データをオンラインで更新する | |
598 | - /// </summary> | |
599 | - /// <remarks> | |
600 | - /// </remarks> | |
601 | - /// <history>2006/XX/XX 新規作成</history> | |
602 | - //========================================================================= | |
603 | - public void UpdateOnline( | |
591 | + // mod yossiepon 20191124 begin | |
592 | + // mAnimeList.Sort( sort ); | |
593 | + { | |
594 | + DateTime baseTime = DateTime.Now; | |
595 | + mAnimeList.ForEach(x => sort.PreScan(x, baseTime)); | |
596 | + mAnimeList.Sort(sort); | |
597 | + } | |
598 | + // mod yossiepon 20191124 end | |
599 | + | |
600 | + } | |
601 | + | |
602 | + //========================================================================= | |
603 | + /// <summary> | |
604 | + /// 録画データをオンラインで更新する | |
605 | + /// </summary> | |
606 | + /// <remarks> | |
607 | + /// </remarks> | |
608 | + /// <history>2006/XX/XX 新規作成</history> | |
609 | + //========================================================================= | |
610 | + public void UpdateOnline( | |
604 | 611 | List<AnimeProgram> animes , // [i] 更新対象の番組 |
605 | 612 | bool force , // [i] 強制更新 |
606 | 613 | ProgressUpdateDelegate callBack ) // [i] プログレス通知 |
@@ -13,21 +13,24 @@ using magicAnime.Properties; | ||
13 | 13 | |
14 | 14 | namespace magicAnime |
15 | 15 | { |
16 | - //========================================================================= | |
17 | - /// <summary> | |
18 | - /// AnimeProgramリストのソートコンペアラクラス | |
19 | - /// </summary> | |
20 | - /// <remarks> | |
21 | - /// </remarks> | |
22 | - /// <history>2006/XX/XX 新規作成</history> | |
23 | - //========================================================================= | |
24 | - class AnimeSort : System.Collections.Generic.IComparer<AnimeProgram> | |
25 | - { | |
26 | - //-------------------- | |
27 | - // コンペア条件 | |
28 | - //-------------------- | |
29 | - | |
30 | - public enum Order | |
16 | + //========================================================================= | |
17 | + /// <summary> | |
18 | + /// AnimeProgramリストのソートコンペアラクラス | |
19 | + /// </summary> | |
20 | + /// <remarks> | |
21 | + /// </remarks> | |
22 | + /// <history>2006/XX/XX 新規作成</history> | |
23 | + //========================================================================= | |
24 | + // mod yossiepon 20191124 begin | |
25 | + //class AnimeSort : System.Collections.Generic.IComparer<AnimeProgram> | |
26 | + abstract class AnimeSort : System.Collections.Generic.IComparer<AnimeProgram> | |
27 | + // mod yossiepon 20191124 end | |
28 | + { | |
29 | + //-------------------- | |
30 | + // コンペア条件 | |
31 | + //-------------------- | |
32 | + | |
33 | + public enum Order | |
31 | 34 | { |
32 | 35 | DayOfWeek, // 曜日ごと |
33 | 36 | NextOnair, // 次回放送日時順 |
@@ -41,36 +44,47 @@ namespace magicAnime | ||
41 | 44 | Limit1CoursOption = 2,// ソート基準を最新1クールに限る |
42 | 45 | }; |
43 | 46 | |
44 | - private Order order; | |
45 | - private OrderOption orderOption; | |
46 | - // private bool last; | |
47 | - | |
48 | - //========================================================================= | |
49 | - /// <summary> | |
50 | - /// コンストラクタ | |
51 | - /// </summary> | |
52 | - /// <remarks> | |
53 | - /// </remarks> | |
54 | - /// <history>2006/XX/XX 新規作成</history> | |
55 | - //========================================================================= | |
56 | - public AnimeSort( Order order, OrderOption option ) | |
47 | + // mod yossiepon 20191124 begin | |
48 | + //private Order order; | |
49 | + //private OrderOption orderOption; | |
50 | + //// private bool last; | |
51 | + protected Order order; | |
52 | + protected OrderOption orderOption; | |
53 | + // mod yossiepon 20191124 end | |
54 | + | |
55 | + //========================================================================= | |
56 | + /// <summary> | |
57 | + /// コンストラクタ | |
58 | + /// </summary> | |
59 | + /// <remarks> | |
60 | + /// </remarks> | |
61 | + /// <history>2006/XX/XX 新規作成</history> | |
62 | + //========================================================================= | |
63 | + public AnimeSort( Order order, OrderOption option ) | |
57 | 64 | { |
58 | 65 | this.order = order; |
59 | 66 | this.orderOption = option; |
60 | 67 | // this.last = last; |
61 | 68 | } |
62 | 69 | |
63 | - //========================================================================= | |
64 | - /// <summary> | |
65 | - /// AnimeProgramの放送時間コンペア | |
66 | - /// </summary> | |
67 | - /// <remarks> | |
68 | - /// </remarks> | |
69 | - /// <history>2006/XX/XX 新規作成</history> | |
70 | - //========================================================================= | |
71 | - public int Compare( AnimeProgram x, AnimeProgram y ) | |
72 | - { | |
73 | - AnimeEpisode nextA, nextB; | |
70 | + // add yossiepon 20191124 begin | |
71 | + public abstract void PreScan(AnimeProgram p, DateTime baseTime); | |
72 | + // add yossiepon 20191124 end | |
73 | + | |
74 | + //========================================================================= | |
75 | + /// <summary> | |
76 | + /// AnimeProgramの放送時間コンペア | |
77 | + /// </summary> | |
78 | + /// <remarks> | |
79 | + /// </remarks> | |
80 | + /// <history>2006/XX/XX 新規作成</history> | |
81 | + //========================================================================= | |
82 | + // mod yossiepon 20191124 begin | |
83 | + public abstract int Compare(AnimeProgram x, AnimeProgram y); | |
84 | +#if false | |
85 | + public int Compare(AnimeProgram x, AnimeProgram y) | |
86 | + { | |
87 | + AnimeEpisode nextA, nextB; | |
74 | 88 | AnimeProgram.NextEpisode resultA, resultB; |
75 | 89 | |
76 | 90 | //-------------------------- |
@@ -228,264 +242,9 @@ namespace magicAnime | ||
228 | 242 | return +1; |
229 | 243 | } |
230 | 244 | |
231 | - return 0; | |
245 | + return 0; | |
232 | 246 | } |
233 | - | |
234 | - } | |
235 | - | |
236 | - | |
237 | - | |
238 | - | |
239 | - | |
240 | - | |
241 | - | |
242 | - | |
243 | - | |
244 | - | |
245 | - | |
246 | - | |
247 | - | |
248 | - | |
249 | - | |
250 | - | |
251 | - | |
252 | - | |
253 | - | |
254 | - | |
255 | - | |
256 | - | |
257 | - | |
258 | - | |
259 | - | |
260 | - | |
261 | - | |
262 | - | |
263 | - | |
264 | - | |
265 | - | |
266 | - | |
267 | - | |
268 | - | |
269 | - | |
270 | - | |
271 | - | |
272 | - | |
273 | - | |
274 | - | |
275 | - | |
276 | - | |
277 | - | |
278 | - | |
279 | - | |
280 | - | |
281 | - | |
282 | - | |
283 | - | |
284 | - | |
285 | - | |
286 | - | |
287 | - | |
288 | - | |
289 | - | |
290 | - | |
291 | - | |
292 | - | |
293 | - | |
294 | - | |
295 | - | |
296 | - | |
297 | - | |
298 | - | |
299 | - | |
300 | - | |
301 | - | |
302 | - | |
303 | - | |
304 | - | |
305 | - | |
306 | - | |
307 | - | |
308 | - | |
309 | - | |
310 | - | |
311 | - | |
312 | - | |
313 | - | |
314 | - | |
315 | - | |
316 | - | |
317 | - | |
318 | - | |
319 | - | |
320 | - | |
321 | - | |
322 | - | |
323 | - | |
324 | - | |
325 | - | |
326 | - | |
327 | - | |
328 | - | |
329 | - | |
330 | - | |
331 | - | |
332 | - | |
333 | - | |
334 | - | |
335 | - | |
336 | - | |
337 | - | |
338 | - | |
339 | - | |
340 | - | |
341 | - | |
342 | - | |
343 | - | |
344 | - | |
345 | - | |
346 | - | |
347 | - | |
348 | - | |
349 | - | |
350 | - | |
351 | - | |
352 | - | |
353 | - | |
354 | - | |
355 | - | |
356 | - | |
357 | - | |
358 | - | |
359 | - | |
360 | - | |
361 | - | |
362 | - | |
363 | - | |
364 | - | |
365 | - | |
366 | - | |
367 | - | |
368 | - | |
369 | - | |
370 | - | |
371 | - | |
372 | - | |
373 | - | |
374 | - | |
375 | - | |
376 | - | |
377 | - | |
378 | - | |
379 | - | |
380 | - | |
381 | - | |
382 | - | |
383 | - | |
384 | - | |
385 | - | |
386 | - | |
387 | - | |
388 | - | |
389 | - | |
390 | - | |
391 | - | |
392 | - | |
393 | - | |
394 | - | |
395 | - | |
396 | - | |
397 | - | |
398 | - | |
399 | - | |
400 | - | |
401 | - | |
402 | - | |
403 | - | |
404 | - | |
405 | - | |
406 | - | |
407 | - | |
408 | - | |
409 | - | |
410 | - | |
411 | - | |
412 | - | |
413 | - | |
414 | - | |
415 | - | |
416 | - | |
417 | - | |
418 | - | |
419 | - | |
420 | - | |
421 | - | |
422 | - | |
423 | - | |
424 | - | |
425 | - | |
426 | - | |
427 | - | |
428 | - | |
429 | - | |
430 | - | |
431 | - | |
432 | - | |
433 | - | |
434 | - | |
435 | - | |
436 | - | |
437 | - | |
438 | - | |
439 | - | |
440 | - | |
441 | - | |
442 | - | |
443 | - | |
444 | - | |
445 | - | |
446 | - | |
447 | - | |
448 | - | |
449 | - | |
450 | - | |
451 | - | |
452 | - | |
453 | - | |
454 | - | |
455 | - | |
456 | - | |
457 | - | |
458 | - | |
459 | - | |
460 | - | |
461 | - | |
462 | - | |
463 | - | |
464 | - | |
465 | - | |
466 | - | |
467 | - | |
468 | - | |
469 | - | |
470 | - | |
471 | - | |
472 | - | |
473 | - | |
474 | - | |
475 | - | |
476 | - | |
477 | - | |
478 | - | |
479 | - | |
480 | - | |
481 | - | |
482 | - | |
483 | - | |
484 | - | |
485 | - | |
486 | - | |
487 | - | |
488 | - | |
489 | - | |
490 | - | |
247 | +#endif | |
248 | +// mod yossiepon 20191124 end | |
249 | + } | |
491 | 250 | } |
@@ -0,0 +1,192 @@ | ||
1 | +//========================================================================= | |
2 | +/// <summary> | |
3 | +/// AnimeProgramリストのソートコンペアクラス | |
4 | +/// </summary> | |
5 | +/// <remarks> | |
6 | +/// </remarks> | |
7 | +/// <history>2019/11/24 新規作成</history> | |
8 | +//========================================================================= | |
9 | +using System; | |
10 | +using System.Collections.Generic; | |
11 | +using magicAnime.Properties; | |
12 | + | |
13 | +namespace magicAnime | |
14 | +{ | |
15 | + //========================================================================= | |
16 | + /// <summary> | |
17 | + /// AnimeProgramリストのソートコンペアラクラス | |
18 | + /// </summary> | |
19 | + /// <remarks> | |
20 | + /// </remarks> | |
21 | + /// <history>2019/11/24 新規作成</history> | |
22 | + //========================================================================= | |
23 | + class AnimeSortMod : AnimeSort | |
24 | + { | |
25 | + private const int SECONDS_OF_DAY = 86400; | |
26 | + private const int SECONDS_OF_HOUR = 3600; | |
27 | + private const int HOURS_OF_DAY = 24; | |
28 | + private const int DAYS_OF_WEEK = 7; | |
29 | + | |
30 | + private const long TICKS_OF_SECOND = 10000000; | |
31 | + | |
32 | + //========================================================================= | |
33 | + /// <summary> | |
34 | + /// コンストラクタ | |
35 | + /// </summary> | |
36 | + /// <remarks> | |
37 | + /// </remarks> | |
38 | + /// <history>2019/11/24 新規作成</history> | |
39 | + //========================================================================= | |
40 | + public AnimeSortMod(Order order, OrderOption option) : base(order, option) | |
41 | + { | |
42 | + } | |
43 | + | |
44 | + //========================================================================= | |
45 | + /// <summary> | |
46 | + /// AnimeProgramを前処理スキャンしてソート代表値を決定する | |
47 | + /// </summary> | |
48 | + /// <param name="p">番組</param> | |
49 | + /// <param name="baseTime">ソート基準日時</param> | |
50 | + /// <remarks> | |
51 | + /// </remarks> | |
52 | + /// <history>2019/11/24 新規作成</history> | |
53 | + //========================================================================= | |
54 | + public override void PreScan(AnimeProgram p, DateTime baseTime) | |
55 | + { | |
56 | + p.mSortRepresentative = DateTime.MaxValue; | |
57 | + | |
58 | + // 話数が0の場合は前に回す | |
59 | + if ( (p.StoryCount == 0) && (p.SpecialStoryCount == 0) ) | |
60 | + { | |
61 | + p.mSortRepresentative = DateTime.MinValue; | |
62 | + return; | |
63 | + } | |
64 | + | |
65 | + switch (order) | |
66 | + { | |
67 | + // 曜日と時刻の平均を基準にソート | |
68 | + case Order.DayOfWeek: | |
69 | + PreScanDayOfWeek(p, baseTime); | |
70 | + break; | |
71 | + // 次回の放送日時でソート | |
72 | + default: | |
73 | + case Order.NextOnair: | |
74 | + PreScanNextOnAir(p, baseTime); | |
75 | + break; | |
76 | + } | |
77 | + } | |
78 | + | |
79 | + private void PreScanDayOfWeek(AnimeProgram p, DateTime baseTime) | |
80 | + { | |
81 | + //-------------------------- | |
82 | + // ソート基準日時以降の放送回を取得 | |
83 | + //(放送開始日時が基準日時以降であれば含める) | |
84 | + //-------------------------- | |
85 | + List<AnimeEpisode> normals = p.NormalEpisodes.FindAll(e => e.HasPlan && e.StartDateTime >= baseTime); | |
86 | + List<AnimeEpisode> specials = p.SpecialEpisodes.FindAll(e => e.HasPlan && e.StartDateTime >= baseTime); | |
87 | + | |
88 | + // 通常回が存在すれば | |
89 | + if (normals.Count > 0) | |
90 | + { | |
91 | + // 最新13話のみで判断する場合 | |
92 | + if ((orderOption & OrderOption.Limit1CoursOption) != 0) | |
93 | + { | |
94 | + // 通常回が14話以上あれば先頭の余分な放送回を削除 | |
95 | + if (normals.Count > 13) | |
96 | + { | |
97 | + normals.Sort(comp); | |
98 | + normals.RemoveRange(0, normals.Count - 13); | |
99 | + } | |
100 | + } | |
101 | + | |
102 | + // 通常回のみで曜日と時刻の平均をとる | |
103 | + long ticks = 0; | |
104 | + normals.ForEach(e => ticks += ModuloDateTimeOfWeek(e)); | |
105 | + p.mSortRepresentative = new DateTime(ticks / normals.Count * TICKS_OF_SECOND); | |
106 | + } | |
107 | + // 特番回のみ存在すれば | |
108 | + else if (specials.Count > 0) | |
109 | + { | |
110 | + // 基準日時以降で最も早く放送される特番回の放送開始日時を代表値とする | |
111 | + // 特番回のみの複数話で構成される場合、平均からずれる可能性がある。 | |
112 | + specials.Sort(comp); | |
113 | + p.mSortRepresentative = specials[0].StartDateTime; | |
114 | + } | |
115 | + // 放送終了分を末尾に回す | |
116 | + else | |
117 | + { | |
118 | + AnimeEpisode last = LastEpicode(p); | |
119 | + | |
120 | + // 放送終了分を末尾に回す | |
121 | + if ((orderOption & OrderOption.LastOrder) != 0) | |
122 | + { | |
123 | + // 放送終了分を一番最後に放送された順番で末尾に並べる | |
124 | + p.mSortRepresentative = last.StartDateTime; | |
125 | + return; | |
126 | + } | |
127 | + // 一番最後に放送された曜日と時刻で並べる | |
128 | + else | |
129 | + { | |
130 | + p.mSortRepresentative = new DateTime(ModuloDateTimeOfWeek(last) * TICKS_OF_SECOND); | |
131 | + } | |
132 | + } | |
133 | + } | |
134 | + | |
135 | + private void PreScanNextOnAir(AnimeProgram p, DateTime baseTime) | |
136 | + { | |
137 | + // 次の放送回を検索する | |
138 | + AnimeEpisode ep; | |
139 | + AnimeProgram.NextEpisode epType = p.GetNextEpisode(baseTime, out ep); | |
140 | + | |
141 | + // 次の放送回が存在しなければ | |
142 | + if (epType != AnimeProgram.NextEpisode.NextDecided) | |
143 | + { | |
144 | + // 一番最後に放送された放送回を選択する | |
145 | + ep = LastEpicode(p); | |
146 | + | |
147 | + // 放送終了分を末尾に回す | |
148 | + if ((orderOption & OrderOption.LastOrder) != 0) | |
149 | + { | |
150 | + // 放送終了分を一番最後に放送された順番で末尾に並べる | |
151 | + // 放送開始日時に100年を足したものを代表値とする | |
152 | + p.mSortRepresentative = ep.StartDateTime.AddYears(100); | |
153 | + return; | |
154 | + } | |
155 | + } | |
156 | + | |
157 | + // 取得した放送回の放送開始日時をソート代表値とする | |
158 | + p.mSortRepresentative = ep.StartDateTime; | |
159 | + } | |
160 | + | |
161 | + private static long ModuloDateTimeOfWeek(AnimeEpisode e) | |
162 | + { | |
163 | + long shiftDayOfWeek = 1; | |
164 | + return (e.StartDateTime.Ticks / TICKS_OF_SECOND | |
165 | + - (Settings.Default.hoursPerDay - HOURS_OF_DAY) * SECONDS_OF_HOUR + SECONDS_OF_DAY * shiftDayOfWeek) | |
166 | + % (SECONDS_OF_DAY * DAYS_OF_WEEK); | |
167 | + } | |
168 | + | |
169 | + private static AnimeEpisode LastEpicode(AnimeProgram p) | |
170 | + { | |
171 | + List<AnimeEpisode> episodes = p.Episodes; | |
172 | + episodes.Sort(comp); | |
173 | + | |
174 | + return episodes[episodes.Count - 1]; | |
175 | + } | |
176 | + | |
177 | + private static Comparison<AnimeEpisode> comp = (x, y) => x.StartDateTime.CompareTo(y.StartDateTime); | |
178 | + | |
179 | + //========================================================================= | |
180 | + /// <summary> | |
181 | + /// AnimeProgramの放送時間コンペア | |
182 | + /// </summary> | |
183 | + /// <remarks> | |
184 | + /// </remarks> | |
185 | + /// <history>2019/11/24 新規作成</history> | |
186 | + //========================================================================= | |
187 | + public override int Compare(AnimeProgram x, AnimeProgram y) | |
188 | + { | |
189 | + return x.mSortRepresentative.CompareTo(y.mSortRepresentative); | |
190 | + } | |
191 | + } | |
192 | +} |
@@ -65,10 +65,13 @@ namespace magicAnime.UserInterface | ||
65 | 65 | orderOption |= AnimeSort.OrderOption.Limit1CoursOption; |
66 | 66 | } |
67 | 67 | |
68 | - AnimeSort comparer = new AnimeSort( order, orderOption ); | |
68 | + // mod yossiepon 20191124 begin | |
69 | + //AnimeSort comparer = new AnimeSort(order, orderOption); | |
70 | + AnimeSort comparer = new AnimeSortMod(order, orderOption); | |
71 | + // mod yossiepon 20191124 end | |
69 | 72 | |
70 | -// <MOD> 2010/01/06 -> | |
71 | - server.SortAnime( comparer ); | |
73 | + // <MOD> 2010/01/06 -> | |
74 | + server.SortAnime( comparer ); | |
72 | 75 | // server.Animes.Sort( comparer ); |
73 | 76 | // <MOD> 2010/01/06 <- |
74 | 77 |
@@ -78,6 +78,7 @@ | ||
78 | 78 | <Compile Include="PathHelper.cs" /> |
79 | 79 | <Compile Include="DateTimeHelper.cs" /> |
80 | 80 | <Compile Include="MakeThumbnail.cs" /> |
81 | + <Compile Include="RecordingManager\AnimeSortMod.cs" /> | |
81 | 82 | <Compile Include="UserInterface\StationTableDialog.cs"> |
82 | 83 | <SubType>Form</SubType> |
83 | 84 | </Compile> |