• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
Aucun tag

Frequently used words (click to add to your profile)

javac++androidlinuxc#windowsobjective-ccocoa誰得qtpythonphprubygameguibathyscaphec計画中(planning stage)翻訳omegatframeworktwitterdomtestvb.netdirectxゲームエンジンbtronarduinopreviewer

mAgicAnime 俺用改造版


Commit MetaInfo

Révisiona5753d88fd6d0f140f3c0901927fe7993ea8ef6f (tree)
l'heure2019-11-24 17:07:25
Auteuryoshy <yoshy@user...>
Commiteryoshy

Message de Log

[FIX] 曜日と時刻の平均でソートする際に現在日時以降の放送開始日時のみを有効とするよう修正
複数クールの再放送の場合、現四半期分までしか登録されていないため未登録分は1つ前の本/再放送の日時となりソート結果が不正となるため。

Change Summary

Modification

--- a/RecordingManager/AnimeProgram.cs
+++ b/RecordingManager/AnimeProgram.cs
@@ -65,8 +65,11 @@ namespace magicAnime
6565 public int priority = 30; // 優先度(最低10〜最高50)
6666 public bool enableFilterKeyword = false; // 録画ファイルを指定文字列でフィルタ
6767 public string filterKeyword = ""; // フィルタ文字列
68+ // add yossiepon 20191124 begin
69+ public DateTime mSortRepresentative; // ソートに使用する代表時刻
70+ // add yossiepon 20191124 end
6871
69- private int mStoryCount;
72+ private int mStoryCount;
7073 // add yossiepon 20160806 begin
7174 private int mSpecialStoryCount;
7275 // add yossiepon 20160806 end
@@ -82,8 +85,8 @@ namespace magicAnime
8285 private EpisodeList mSpecialEpisodes; // この番組の符番されていない各話(Episode)の集合
8386 // add yossiepon 20160806 end
8487 private Mutex mEpisodeLock = new Mutex();
85- private DateTime mLastUpdate; // データーベースからの最終更新時刻
86- private Image mThambnailImage = null;
88+ private DateTime mLastUpdate; // データーベースからの最終更新時刻
89+ private Image mThambnailImage = null;
8790 private Mutex mThambnailLock = new Mutex();
8891
8992
--- a/RecordingManager/AnimeServer.cs
+++ b/RecordingManager/AnimeServer.cs
@@ -588,19 +588,26 @@ namespace magicAnime
588588 internal void SortAnime(AnimeSort sort)
589589 {
590590 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(
604611 List<AnimeProgram> animes , // [i] 更新対象の番組
605612 bool force , // [i] 強制更新
606613 ProgressUpdateDelegate callBack ) // [i] プログレス通知
--- a/RecordingManager/AnimeSort.cs
+++ b/RecordingManager/AnimeSort.cs
@@ -13,21 +13,24 @@ using magicAnime.Properties;
1313
1414 namespace magicAnime
1515 {
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
3134 {
3235 DayOfWeek, // 曜日ごと
3336 NextOnair, // 次回放送日時順
@@ -41,36 +44,47 @@ namespace magicAnime
4144 Limit1CoursOption = 2,// ソート基準を最新1クールに限る
4245 };
4346
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 )
5764 {
5865 this.order = order;
5966 this.orderOption = option;
6067 // this.last = last;
6168 }
6269
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;
7488 AnimeProgram.NextEpisode resultA, resultB;
7589
7690 //--------------------------
@@ -228,264 +242,9 @@ namespace magicAnime
228242 return +1;
229243 }
230244
231- return 0;
245+ return 0;
232246 }
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+ }
491250 }
--- /dev/null
+++ b/RecordingManager/AnimeSortMod.cs
@@ -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+}
--- a/UserInterface/SortDialog.cs
+++ b/UserInterface/SortDialog.cs
@@ -65,10 +65,13 @@ namespace magicAnime.UserInterface
6565 orderOption |= AnimeSort.OrderOption.Limit1CoursOption;
6666 }
6767
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
6972
70-// <MOD> 2010/01/06 ->
71- server.SortAnime( comparer );
73+ // <MOD> 2010/01/06 ->
74+ server.SortAnime( comparer );
7275 // server.Animes.Sort( comparer );
7376 // <MOD> 2010/01/06 <-
7477
--- a/magicAnime.csproj
+++ b/magicAnime.csproj
@@ -78,6 +78,7 @@
7878 <Compile Include="PathHelper.cs" />
7979 <Compile Include="DateTimeHelper.cs" />
8080 <Compile Include="MakeThumbnail.cs" />
81+ <Compile Include="RecordingManager\AnimeSortMod.cs" />
8182 <Compile Include="UserInterface\StationTableDialog.cs">
8283 <SubType>Form</SubType>
8384 </Compile>