Skip to content

Commit

Permalink
jkcommentviewerで取得したyoutubeコメントファイルがxmlとして読めなくなる不具合を修正する画面作成
Browse files Browse the repository at this point in the history
  • Loading branch information
nnn-revo2012 committed Dec 31, 2021
1 parent 8a2dc5a commit 028ae7a
Show file tree
Hide file tree
Showing 7 changed files with 314 additions and 4 deletions.
45 changes: 45 additions & 0 deletions comeconv/Form1.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

61 changes: 60 additions & 1 deletion comeconv/Form1.cs
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,6 @@ private async void tabPage1_DragDrop(object sender, DragEventArgs e)
if (Utils.IsXmlFileType(files[i]) >= 10)
{
AddLog("jkcommentviewerのyoutubeコメントファイルは変換の必要ありません。", 1);
continue;
}
else
await Task.Run(() => ConvXml(files[i]));
Expand Down Expand Up @@ -375,5 +374,65 @@ private void Form1_FormClosing(object sender, FormClosingEventArgs e)
props.SaveData();
}
}

private async void repair_DragDrop(object sender, DragEventArgs e)
{
string[] files = (string[])e.Data.GetData(DataFormats.FileDrop, false);

try
{
if (ProgramStatus == 1) return;

GetForm();
ClearLog();

var exec_file = props.ExecFile;
if (!File.Exists(exec_file))
{
exec_file = GetExecFile(exec_file);
if (!File.Exists(exec_file))
AddLog("FFmpeg.exe がありません。", 2);
}
props.ExecFile = exec_file;
LogFile = null;

ProgramStatus = 1;
//1ファイルずつ順次実行する
for (int i = 0; i < files.Length; i++)
{
var filetype = Utils.IsFileType(files[i]);
if (filetype == 0)
{
if (Utils.IsXmlFileType(files[i]) != 10)
{
AddLog("jkcommentviewerのyoutubeコメントファイル以外は修復できません。", 1);
AddLog("また、一度修復したyoutubeコメントファイル以外は修復できません。", 1);
}
else
await Task.Run(() => RepairXml(files[i]));
}
}
ProgramStatus = 0;

}
catch (Exception Ex)
{
//if (_ndb != null)
//{
// _ndb.Dispose();
//}
AddLog("ドラッグ&ドロップできません。\r\n" + Ex.Message, 2);
}

}

private void repair_DragEnter(object sender, DragEventArgs e)
{
if (e.Data.GetDataPresent(DataFormats.FileDrop))
e.Effect = DragDropEffects.All;
else
e.Effect = DragDropEffects.None;

}
}
}
36 changes: 36 additions & 0 deletions comeconv/Form1_Sub.cs
Original file line number Diff line number Diff line change
Expand Up @@ -337,6 +337,42 @@ private void ConvVideo(string filename)
}
}

//コメントファイルを修復
private void RepairXml(string filename, string mode = "repair")
{
var result = false;
var backupfile = "";
var newfile = "";
try
{
backupfile = Utils.GetBackupFileName(filename, ".org");
File.Move(filename, backupfile);
newfile = filename;

AddLog("コメント修復します。", 1);
AddLog("元ファイル: " + Path.GetFileName(backupfile), 1);
AddLog("修復ファイル: " + Path.GetFileName(newfile), 1);
{
using (var conv = new RepairXmlFile(this, props))
result = conv.XmlRepair(backupfile, newfile);
if (result)
{
AddLog("コメント修復終了しました。", 1);
}
else
{
AddLog("コメント変換に失敗しました。", 1);
}
}
return;
}
catch (Exception Ex)
{
DebugWrite.Writeln(nameof(RepairXml), Ex);
return;
}
}

public bool ExecFFmpeg(ExecPsInfo epi)
{
ExecConvert ecv = null;
Expand Down
2 changes: 1 addition & 1 deletion comeconv/Prop/Version.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ namespace comeconv.Prop
{
public class Ver
{
public static readonly string Version = "0.0.1.15";
public static readonly string Version = "0.0.1.16";
public static readonly string VerDate = "2021/12/28";

public static string GetFullVersion()
Expand Down
166 changes: 166 additions & 0 deletions comeconv/RepairXmlFile.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,166 @@
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;
using System.IO;
using System.Xml;
using System.Xml.XPath;
using System.Xml.Linq;
using System.Diagnostics;
using System.Web;
using System.Globalization;
using System.Text.RegularExpressions;

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

using comeconv.Prop;
using comeconv.Util;

namespace comeconv
{
public class RepairXmlFile : IDisposable
{
#region IDisposable Support
private bool disposedValue = false; // 重複する呼び出しを検出するには

private Form1 _form = null;
private Props _props = null;

//Debug
public bool IsDebug { get; set; }

public RepairXmlFile(Form1 fo, Props props)
{
IsDebug = false;

this._form = fo;
this._props = props;
}

~RepairXmlFile()
{
this.Dispose();
}

//壊れたXML形式のコメントファイルを読み込み復旧を試みる
public bool XmlRepair(string sfile, string dfile)
{
var enc = new System.Text.UTF8Encoding(false);

try
{
if (!File.Exists(sfile))
{
return false;
}
using (var sr = new StreamReader(sfile, enc))
using (var sw = new StreamWriter(dfile, true, enc))
{
string line;
while (!sr.EndOfStream) // ファイルが最後になるまで順に読み込み
{
line = sr.ReadLine();
if (line.TrimStart().StartsWith("<chat "))
{
while (!line.EndsWith("</chat>"))
{
line += "\r\n" + sr.ReadLine();
}
//チャットの処理
{
var ttt = RepairChatData(line, _props).TrimEnd();
if (!string.IsNullOrEmpty(ttt))
sw.WriteLine(ttt);
//else
//_form.AddLog("deleted:" + line, 9);
}
}
else if (line.TrimStart().StartsWith("<thread "))
{
sw.WriteLine(line);
}
else
{
sw.WriteLine(line);
}
}
}
}
catch (Exception Ex)
{
DebugWrite.Writeln(nameof(XmlRepair), Ex);
return false;
}
return true;
}

//private static Regex _RegGift = new Regex("\"([^\"]+)\" (\\d+) \"([^\"]*)\" \"([^\"]+)\" ?(\\d*)", RegexOptions.Compiled);
private static Regex _RegVpos = new Regex("vpos=\"(\\d+)\"", RegexOptions.Compiled);
private static Regex _RegDate = new Regex("date=\"(\\d+)\"", RegexOptions.Compiled);
private static Regex _RegComment = new Regex("date_usec=\"0\">(.*)</chat>", RegexOptions.Compiled);
private string RepairChatData(string chat, Props props)
{
var data = new Dictionary<string, string>();
if (string.IsNullOrEmpty(chat))
return "";

try
{
data["vpos"] = _RegVpos.Match(chat).Groups[1].ToString();
data["date"] = _RegDate.Match(chat).Groups[1].ToString();
//data["mail"] = "";
//data["premium"] = "";
var ttt = _RegComment.Match(chat).Groups[1].ToString();
ttt= ttt.Replace("&amp;lt;", "&lt;");
ttt = ttt.Replace("&amp;gt;", "&gt;");
data["content"] = Utils.Decode(ttt);
return ConvComment.Table2Xml(data);
}
catch (Exception Ex)
{
DebugWrite.Writeln(nameof(RepairChatData), Ex);
return "";
}
}


protected virtual void Dispose(bool disposing)
{
if (!disposedValue)
{
if (disposing)
{
// TODO: マネージド状態を破棄します (マネージド オブジェクト)。
}

// TODO: アンマネージド リソース (アンマネージド オブジェクト) を解放し、下のファイナライザーをオーバーライドします。
// TODO: 大きなフィールドを null に設定します。

disposedValue = true;
}
}

// TODO: 上の Dispose(bool disposing) にアンマネージド リソースを解放するコードが含まれる場合にのみ、ファイナライザーをオーバーライドします。
// ~ConvComment() {
// // このコードを変更しないでください。クリーンアップ コードを上の Dispose(bool disposing) に記述します。
// Dispose(false);
// }

// このコードは、破棄可能なパターンを正しく実装できるように追加されました。
public void Dispose()
{
// このコードを変更しないでください。クリーンアップ コードを上の Dispose(bool disposing) に記述します。
Dispose(true);
// TODO: 上のファイナライザーがオーバーライドされる場合は、次の行のコメントを解除してください。
// GC.SuppressFinalize(this);
}
#endregion

}
}
7 changes: 5 additions & 2 deletions comeconv/Util/Utils.cs
Original file line number Diff line number Diff line change
Expand Up @@ -163,8 +163,11 @@ public static int IsXmlFileType(string filename)
if (len > 0)
{
var str = new string(_read_buf);
if (str.IndexOf("youtube_icon_url=") > -1)
result = 10; //jkcommentviewerのyoutubeライブ
if (str.IndexOf("user_name=") > -1)
{
//10 ファイル修復機能で修正してない 11 修正済
result = str.IndexOf("youtube_icon_url=") > -1 ? 10 : 11;
}
else
result = 0;
}
Expand Down
Loading

0 comments on commit 028ae7a

Please sign in to comment.