第24回 ファイル追加日時条件で再生スキップする

今回は再生条件のうち、ファイルの追加日時による再生スキップ操作を実装します。
実際には「追加日時」を特定するのは困難なため、ファイル作成日時を利用した簡易的な処理です。

最初に前回、曲もしくはアーティストどちらかのレーティングが指定以上なら再生するというオプションを忘れていたため、それを追加します。
いずれかのレーティング指定の開始を示す数値入力欄「numericUpDownRatingAnyStart」
いずれかのレーティング指定の最後を示す数値入力欄「numericUpDownRatingAnyEnd」
をそれぞれMax=5に設定(5=★★★★★)。

そしてOptionクラス内にファイル追加日時の判定処理を、Form1のGetNextIndex()にそれを呼び出す処理を入れます。

■PlayConditionForm.cs
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 MP3Player
{
	public partial class PlayConditionForm : Form
	{
		public PlayConditionForm()
		{
			InitializeComponent();

			textBoxFolder.ReadOnly = true;
			textBoxFolder.Text = Form1._option.strFolder;

			numericUpDownPlayDayStart.Value = Form1._option.nPlayDayStart;
			numericUpDownPlayDayEnd.Value = Form1._option.nPlayDayEnd;

			numericUpDownRatingStart.Value = Form1._option.nPlayRatingStart;
			numericUpDownRatingEnd.Value = Form1._option.nPlayRatingEnd;

			numericUpDownRatingArtistStart.Value = Form1._option.nPlayRatingArtistStart;
			numericUpDownRatingArtistEnd.Value = Form1._option.nPlayRatingArtistEnd;

			//以下を追加
			numericUpDownRatingAnyStart.Value = Form1._option.nPlayRatingAnyStart;
			numericUpDownRatingAnyEnd.Value = Form1._option.nPlayRatingAnyEnd;
		}


		private void buttonSelectFolder_Click(object sender, EventArgs e)
		{
			FolderBrowserDialog dlg = new FolderBrowserDialog();

			dlg.Description = "再生フォルダの選択";
			dlg.RootFolder = Environment.SpecialFolder.Desktop;
			dlg.SelectedPath = textBoxFolder.Text;
			dlg.ShowNewFolderButton = false;

			DialogResult ret = dlg.ShowDialog(this);
			if (ret == DialogResult.OK)
			{
				textBoxFolder.Text = dlg.SelectedPath;
			}
		}

		private void buttonOk_Click(object sender, EventArgs e)
		{
			Form1._option.strFolder = textBoxFolder.Text;

			Form1._option.nPlayDayStart = (int)numericUpDownPlayDayStart.Value;
			Form1._option.nPlayDayEnd = (int)numericUpDownPlayDayEnd.Value;

			Form1._option.nPlayRatingStart = (int)numericUpDownRatingStart.Value;
			Form1._option.nPlayRatingEnd = (int)numericUpDownRatingEnd.Value;

			Form1._option.nPlayRatingArtistStart = (int)numericUpDownRatingArtistStart.Value;
			Form1._option.nPlayRatingArtistEnd = (int)numericUpDownRatingArtistEnd.Value;

			//以下を追加
			Form1._option.nPlayRatingAnyStart = (int)numericUpDownRatingAnyStart.Value;
			Form1._option.nPlayRatingAnyEnd = (int)numericUpDownRatingAnyEnd.Value;

			Close();
		}

		private void buttonCancel_Click(object sender, EventArgs e)
		{
			Close();
		}
	}
}
■Option.csへ以下を追加
		//以下を追加
		/// <summary>
		/// 再生する最低レーティング(曲/アーティストレーティングどちらも対象)
		/// 
		/// 例えば「1ならレーティング1以上のを再生」
		/// </summary>
		public int nPlayRatingAnyStart
		{
			get { return _nPlayRatingAnyStart; }
			set { _nPlayRatingAnyStart = value; }
		}
		int _nPlayRatingAnyStart = 0;


		//以下を追加
		/// <summary>
		/// 再生する最高レーティング(曲/アーティストレーティングどちらも対象)
		/// 
		/// 例えば「1ならレーティング1以下の=レーティング1もしくはゼロのを再生」
		/// </summary>
		public int nPlayRatingAnyEnd
		{
			get { return _nPlayRatingAnyEnd; }
			set { _nPlayRatingAnyEnd = value; }
		}
		int _nPlayRatingAnyEnd = 5;


		//以下を追加
		/// <summary>
		/// 再生期間のチェック
		/// 
		/// ファイルの追加日時が再生条件設定を満たしていればtrue
		/// </summary>
		public bool IsPlayDayTermOK(AudioItem item)
		{
			//条件設定されていないならtrue
			if (_nPlayDayEnd == 0 && _nPlayDayStart == 0)
				return true;
			try
			{
				DateTime dtFile = File.GetCreationTime(item.strFile);		//ファイル作成日時で判断
				TimeSpan span = DateTime.Now - dtFile;

				if (_nPlayDayStart > 0)
				{
					if (span.TotalDays > _nPlayDayStart)
						return false;
				}
				if (_nPlayDayEnd > 0)
				{
					if (span.TotalDays < _nPlayDayEnd)
						return false;
				}

				return true;
			}
			catch (Exception)
			{
			}
			return false;
		}
■Form1のGetNextIndex()を変更
		/// <summary>
		/// 次の再生曲インデックスを決める
		/// </summary>
		int GetNextIndex()
		{
			if (_listFiles.Count == 0)
				return -1;

			int nIndex;
			Random rnd = new Random(Environment.TickCount);

			while (true)
			{
				if (_listPlayNext.Count == 0)
				{
					//未来の曲リストが空ならランダムで曲を決定
					nIndex = rnd.Next(0, _listFiles.Count);
				}
				else
				{
					//未来の曲リストから次の曲を決定
					nIndex = _listPlayNext[0];
					_listPlayNext.RemoveAt(0);
				}

				//同じ曲は連続で演奏しない
				if (nIndex == _nCurrentIndex)
					continue;

				//NGファイル指定されていないかチェック
				if (_option.IsNGFile(_listFiles[nIndex]))
					continue;

				//mp3情報を取得
				string strTitle;
				string strArtist;
				string strAlbum;
				Utility.GetMp3Info(_listFiles[nIndex], out strTitle, out strArtist, out strAlbum);

				//アーティストがNG指定されていないかチェック
				if (_option.IsNGArtist(strArtist))
					continue;

				//曲名がNGワードを含まないかチェック
				if (_option.IsNGWord(strTitle))
					continue;

				//以下を追加
				//ファイル追加日時が再生条件を満たすかチェック
				if (_option.IsPlayDayTermOK(_listFiles[nIndex]) == false)
					continue;

				break;
			}

			return nIndex;
		}

プロジェクトファイルをダウンロード


カテゴリー「MP3プレーヤーを作る(C#)」 のエントリー