PowerDVD22でBlu-rayが再生できなくなったので、PowerDVD24にアップグレードし、MovieJukeBoxから起動できるようにした
NVIDIAのグラフィックドライバーを610.88に上げるとPowerDVD22以下ではblu-rayが再生できなくなるという、ふざけた切り捨て。仕方ないのでPowerDVD24Ultraにアップグレードした。 NVIDIA GPU ドライバーをバージョン 610.88 以上にアップデートした後、PowerDVD 22 以前のバージョンで Blu-ray Disc を再生すると、エラーコード 0012が発生しディスクを再生することができません。
MovieJukeMoxではクリックでPowerDVDに連携して再生するようにしている。
PowerDVDのパスをソースコードに埋め込んでいたので、この際にPowerDVDのバージョンを自動取得し、かつ再生ファイルの事前存在チェック、PowerDVDのインストール状況をチェックするようにCopilotと対話しながら再作成した。どうせならKODIもこのURIスキームで起動するように変更し、JSON-RPCをGETで送っていたのをPOSTにして最新のKODIを利用できるように変更した。これまではJSON-RPCコマンドをJavaScriptとしてサーバサイドで生成し、それをブラウザのボタンに割り当てるような方式だったのを中継プログラム「StartProcMoviePlayer.exe」でPOSTするようにした。
元の記事は ブラウザからデスクトップアプリをパラメータを渡して起動する を参照。
改修後のソースコードは以下のとおり。MovieJukeBox側の改修は不要。
レジストリは 連携プログラムを StartProcMoviePlayer.exe と名称変更したので、以下の部分を修正
Copilot様のおかげですね。50分程度でコード作成してビルド&テスト&リリースまでできたよ。
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Text;
using System.Windows.Forms;
namespace StartProcMoviePlayer
{
internal static class Program
{
[STAThread]
static void Main(string[] args)
{
try
{
if (args.Length == 0)
return;
string uri = WebUtility.UrlDecode(args[0]);
if (!uri.StartsWith(
"movieplayer:",
StringComparison.OrdinalIgnoreCase))
{
return;
}
string moviePath =
uri.Substring("movieplayer:".Length);
if (!File.Exists(moviePath))
{
MessageBox.Show(
$"ファイルが見つかりません。\n\n{moviePath}",
"MoviePlayer",
MessageBoxButtons.OK,
MessageBoxIcon.Warning);
return;
}
DialogResult result = SelectPlayer();
if (result == DialogResult.Cancel)
return;
if (result == DialogResult.Yes)
{
LaunchPowerDVD(moviePath);
}
else
{
LaunchKodi(moviePath);
}
}
catch (Exception ex)
{
MessageBox.Show(
ex.ToString(),
"MoviePlayer Error",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
}
}
private static DialogResult SelectPlayer()
{
Form form = new Form();
form.Text = "再生方法を選択";
form.Width = 340;
form.Height = 140;
form.FormBorderStyle = FormBorderStyle.FixedDialog;
form.StartPosition = FormStartPosition.CenterScreen;
form.MaximizeBox = false;
form.MinimizeBox = false;
Button btnPowerDVD = new Button();
btnPowerDVD.Text = "PowerDVD";
btnPowerDVD.Width = 90;
btnPowerDVD.Left = 120;
btnPowerDVD.Top = 25;
Button btnKodi = new Button();
btnKodi.Text = "Kodi";
btnKodi.Width = 90;
btnKodi.Left = 15;
btnKodi.Top = 25;
Button btnCancel = new Button();
btnCancel.Text = "キャンセル";
btnCancel.Width = 90;
btnCancel.Left = 225;
btnCancel.Top = 25;
btnPowerDVD.Click += (s, e) =>
{
form.DialogResult = DialogResult.Yes;
form.Close();
};
btnKodi.Click += (s, e) =>
{
form.DialogResult = DialogResult.No;
form.Close();
};
btnCancel.Click += (s, e) =>
{
form.DialogResult = DialogResult.Cancel;
form.Close();
};
form.Controls.Add(btnKodi);
form.Controls.Add(btnPowerDVD);
form.Controls.Add(btnCancel);
form.AcceptButton = btnKodi;
form.CancelButton = btnCancel;
return form.ShowDialog();
}
private static void LaunchPowerDVD(string moviePath)
{
string exe = null;
string[] oldStyle =
{
@"C:\Program Files\CyberLink\PowerDVD22\PowerDVD.exe",
@"C:\Program Files\CyberLink\PowerDVD23\PowerDVD.exe",
@"C:\Program Files\CyberLink\PowerDVD24\PowerDVD.exe",
@"C:\Program Files\CyberLink\PowerDVD25\PowerDVD.exe"
};
exe = oldStyle.FirstOrDefault(File.Exists);
if (string.IsNullOrEmpty(exe))
{
string root =
@"C:\Program Files\CyberLink\PowerDVD";
if (Directory.Exists(root))
{
exe =
Directory.GetDirectories(root)
.Select(d => Path.Combine(d, "PowerDVD.exe"))
.OrderByDescending(x => x)
.FirstOrDefault(File.Exists);
}
}
if (string.IsNullOrEmpty(exe))
{
MessageBox.Show(
"PowerDVD.exeが見つかりません。",
"MoviePlayer",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
return;
}
Process.Start(new ProcessStartInfo
{
FileName = exe,
Arguments = $"\"{moviePath}\"",
UseShellExecute = true
});
}
private static void LaunchKodi(string moviePath)
{
if (!Process.GetProcessesByName("kodi").Any())
{
string[] kodiCandidates =
{
@"C:\Program Files\Kodi\kodi.exe",
@"C:\Program Files (x86)\Kodi\kodi.exe"
};
string kodiExe =
kodiCandidates.FirstOrDefault(File.Exists);
if (string.IsNullOrEmpty(kodiExe))
{
MessageBox.Show(
"Kodiが見つかりません。",
"MoviePlayer",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
return;
}
Process.Start(kodiExe);
System.Threading.Thread.Sleep(2000);
}
string smbPath =
moviePath.Replace("\\", "/");
if (smbPath.StartsWith("//"))
{
smbPath = "smb:" + smbPath;
}
string json =
"{"
+ "\"jsonrpc\":\"2.0\","
+ "\"method\":\"Player.Open\","
+ "\"params\":{"
+ "\"item\":{"
+ "\"file\":\"" + EscapeJson(smbPath) + "\""
+ "}"
+ "},"
+ "\"id\":1"
+ "}";
using (WebClient wc = new WebClient())
{
wc.Encoding = Encoding.UTF8;
wc.Headers[HttpRequestHeader.ContentType]
= "application/json";
wc.UploadString(
"http://localhost:8080/jsonrpc",
"POST",
json);
}
}
private static string EscapeJson(string text)
{
return text
.Replace("\\", "\\\\")
.Replace("\"", "\\\"");
}
}
}




コメント
コメントを投稿