-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathcontent.js
180 lines (153 loc) · 6.45 KB
/
content.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
// 会議中のURLの正規表現
const meetUrlPattern = /https:\/\/meet\.google\.com\/[a-z]{3}-[a-z]{4}-[a-z]{3}/;
let captionsSaved = false; // 保存が行われたかを記録するフラグ
let captionsData = []; // 字幕の内容を保存する配列
let currentText = ''; // 現在の字幕内容を保存/
let backupText = ''; // バックアップ
let previousLen = -1; // 前のlenの値を保存する
let meetStartTime = null; // {meet開始時刻} に対応
let captionStartTime = null; // {字幕ログ開始時刻} に対応
let captionEndTime; // {字幕ログ終了時刻} に対応
// URLの変更を監視する関数
const checkMeetingStatus = () => {
const currentUrl = window.location.href;
if (meetUrlPattern.test(currentUrl) && !meetStartTime) {
meetStartTime = dateTime();
}
};
// 字幕ログの有効/無効を確認する関数
const logEnabled = () => {
chrome.storage.local.get('isLogEnabled', (data) => {
// console.log(data.isLogEnabled ? '字幕ログが有効:' : '字幕ログが無効:');
if (data.isLogEnabled) monitorCaptions();
});
};
// 字幕の表示を監視する関数
const monitorCaptions = () => {
const captionsContainer = document.querySelector('div[jsname="dsyhDe"].iOzk7.XDPoIe');
if (!captionsContainer) return;
if (captionsContainer.style.display === '') {
// console.log('字幕が表示されました');
captionsSaved = false;
if (!captionStartTime) captionStartTime = dateTime();
extractCaptions(captionsContainer); // 字幕を抽出
} else if (captionsContainer.style.display === 'none') {
// console.log('字幕が非表示');
captionEndTime = dateTime();
if (captionsData.length > 0 && !captionsSaved) {
updateCaptionsData(currentText);
saveCaptions(); // 字幕をファイルに保存
currentText = '';
backupText = '';
captionsSaved = true;
}
}
};
// 字幕のテキストを抽出して配列に追加する関数
const extractCaptions = (captionsContainer) => {
const captionDivs = captionsContainer.querySelectorAll('[jsname="tgaKEf"]');
let newText = ''; // 新しい字幕内容を保存する変数
captionDivs.forEach(span => {
newText += span.textContent.trim(); // スペースを取り除きながら内容を追加
});
let commonSubstring = matchCaptions(currentText, newText); // 共通部分を探す
currentText = currentText.slice(0, currentText.indexOf(commonSubstring)) + newText; // マージ
// console.log('現在の字幕:', currentText);
// console.log("captionsData.length:", captionsData.length);
// console.log("previousLen", previousLen);
// console.log("currentText.length", currentText.length);
if (previousLen !== 0 && currentText.length === 0) { // バックアップ
// console.log("前回の値から0になったため:", backupText);
updateCaptionsData(backupText);
// console.log("更新後のcaptionsData:", captionsData);
}
if (currentText.length > 500) {
updateCaptionsData(currentText);
currentText = ''; // currentTextをクリア
}
backupText = currentText;
previousLen = currentText.length;
};
const updateCaptionsData = (text) => { // captionsDataを更新する関数
let lastArrayText = captionsData[captionsData.length - 1];
if (lastArrayText) {
let commonArray = matchCaptions(lastArrayText, text);
let arrayText = lastArrayText.slice(0, lastArrayText.indexOf(commonArray)) + commonArray;
lastArrayText = arrayText;
let newArrayText = text.slice(text.indexOf(commonArray) + commonArray.length);
captionsData.push(newArrayText);
// console.log("更新するnewArrayText:", newArrayText);
} else {
captionsData.push(text);
// console.log("更新するtext:", text);
}
// console.log("更新後のcaptionsData:", captionsData);
};
// 共通部分を見つける関数
const matchCaptions = (str1, str2) => {
if (!str1 || !str2) return '';
let commonSubstring = '';
for (let i = 0; i < str1.length; i++) {
for (let j = i; j < str1.length; j++) {
let substring = str1.substring(i, j + 1);
if (str2.includes(substring) && substring.length > commonSubstring.length) {
commonSubstring = substring;
}
}
}
return commonSubstring;
};
// 字幕を保存する関数
const saveCaptions = () => {
chrome.storage.local.get('settings', (data) => {
let fileName, fileFormat, headerText;
if (data.settings) {
// 設定からファイル名と形式を取得
fileName = data.settings.fileName;
fileFormat = data.settings.fileFormat;
headerText = data.settings.headerText;
} else {
// デフォルト設定
fileName = 'captions';
fileFormat = 'text/plain';
headerText =
`-----------------------------------------------\n` +
`プロジェクトの打ち合わせ\n` +
`meet開始時刻 : {meet開始時刻}\n` +
`字幕ログ開始時刻: {字幕ログ開始時刻}\n` +
`字幕ログ終了時刻: {字幕ログ終了時刻}\n` +
`-----------------------------------------------\n`;
}
headerText = headerText
.replace(/{meet開始時刻}/g, meetStartTime)
.replace(/{字幕ログ開始時刻}/g, captionStartTime)
.replace(/{字幕ログ終了時刻}/g, captionEndTime);
captionStartTime = null;
captionEndTime = null;
// ファイル作成
const blob = new Blob([headerText + '\n' + captionsData.join('')], { type: fileFormat });
const url = URL.createObjectURL(blob);
const a = document.createElement('a');
a.href = url;
a.download = fileName; // ダウンロードするファイル名を設定
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
captionsData = []; // 字幕データをリセット
});
};
const dateTime = () => {
// 現在の日付と時刻を取得
const now = new Date();
const year = now.getFullYear(); // 年
const month = String(now.getMonth() + 1).padStart(2, '0'); // 月
const day = String(now.getDate()).padStart(2, '0'); // 日
const hours = String(now.getHours()).padStart(2, '0'); // 時
const minutes = String(now.getMinutes()).padStart(2, '0'); // 分
const formattedDateTime = `${year}-${month}-${day} ${hours}:${minutes}`;
return formattedDateTime;
};
// URL変更監視
const observer = new MutationObserver(() => logEnabled());
observer.observe(document, { childList: true, attributes: true, subtree: true });
checkMeetingStatus(); // 初回チェック