shethjenil commited on
Commit
5aa3719
·
verified ·
1 Parent(s): 7ec1d2c

Update patch.js

Browse files
Files changed (1) hide show
  1. patch.js +117 -107
patch.js CHANGED
@@ -1,107 +1,117 @@
1
- function base64ToUrl(base64, mimeType = '') {
2
- // Split the base64 string if it contains a data URL prefix
3
- const [prefix, data] = base64.includes(',') ? base64.split(',') : ['', base64];
4
-
5
- // Try to extract the MIME type from the prefix if not provided
6
- const mime = mimeType || (prefix.match(/data:(.*?);base64/) || [])[1] || 'application/octet-stream';
7
-
8
- // Decode base64 to raw binary data
9
- const binary = atob(data);
10
- const len = binary.length;
11
- const bytes = new Uint8Array(len);
12
- for (let i = 0; i < len; i++) {
13
- bytes[i] = binary.charCodeAt(i);
14
- }
15
-
16
- // Create a blob and generate a URL
17
- const blob = new Blob([bytes], { type: mime });
18
- return URL.createObjectURL(blob);
19
- }
20
-
21
- function getElementByXpath(path, timeout = 5000) {
22
- return new Promise((resolve, reject) => {
23
- const intervalTime = 500;
24
- let elapsedTime = 0;
25
- const interval = setInterval(() => {
26
- let node = document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
27
- if (node) {
28
- clearInterval(interval);
29
- resolve(node);
30
- }
31
- elapsedTime += intervalTime;
32
- if (elapsedTime >= timeout) {
33
- clearInterval(interval);
34
- reject(new Error(`XPath "${path}" not found within ${timeout}ms`));
35
- }
36
- }, intervalTime);
37
- });
38
- }
39
-
40
- async function uploadFileFromURL(url, filename, file_element) {
41
- try {
42
- if (!file_element) throw new Error("File input element not found.");
43
- const response = await fetch(url);
44
- if (!response.ok) throw new Error(`Failed to fetch file: ${response.statusText}`);
45
- const blob = await response.blob();
46
- const newFile = new File([blob], filename, { type: blob.type });
47
- const dataTransfer = new DataTransfer();
48
- if (file_element.multiple) {
49
- for (const file of file_element.files) {
50
- dataTransfer.items.add(file);
51
- }
52
- }
53
- dataTransfer.items.add(newFile);
54
- file_element.files = dataTransfer.files;
55
- file_element.dispatchEvent(new Event("change", { bubbles: true }));
56
- } catch (error) {
57
- console.error("Error:", error);
58
- }
59
- }
60
-
61
- function waitForElement(selector, timeout = 5000) {
62
- return new Promise((resolve, reject) => {
63
- const intervalTime = 500;
64
- let elapsedTime = 0;
65
-
66
- const interval = setInterval(() => {
67
- const element = document.querySelector(selector);
68
- if (element) {
69
- clearInterval(interval);
70
- resolve(element);
71
- }
72
-
73
- elapsedTime += intervalTime;
74
- if (elapsedTime >= timeout) {
75
- clearInterval(interval);
76
- reject(new Error(`Element "${selector}" not found within ${timeout}ms`));
77
- }
78
- }, intervalTime);
79
- });
80
- }
81
-
82
- document.addEventListener("DOMContentLoaded", function () {
83
- getElementByXpath("//*[text()='Hide top bar']", 5000)
84
- .then((node) => {
85
- node.scrollIntoView();
86
- node.click();
87
- return waitForElement("#midi_file_input");
88
- })
89
- .then((file_upload) => {
90
- if (!file_upload) throw new Error("File input element not found.");
91
-
92
- // Wait for stability before proceeding
93
- return new Promise(resolve => setTimeout(() => resolve(file_upload), 500));
94
- })
95
- .then((file_upload) => {
96
- return waitForElement(".show_top_button").then((node) => {
97
- node.remove();
98
- selector = document.getElementById("renderer_mode_selector");
99
- selector.selectedIndex = 2;
100
- selector.dispatchEvent(new Event('change'));
101
- // return uploadFileFromURL("/output.mid", "output.mid", file_upload);
102
- });
103
- })
104
- .catch((error) => {
105
- console.error("Error:", error);
106
- });
107
- });
 
 
 
 
 
 
 
 
 
 
 
1
+ function base64ToUrl(base64, mimeType = '') {
2
+ // Split the base64 string if it contains a data URL prefix
3
+ const [prefix, data] = base64.includes(',') ? base64.split(',') : ['', base64];
4
+
5
+ // Try to extract the MIME type from the prefix if not provided
6
+ const mime = mimeType || (prefix.match(/data:(.*?);base64/) || [])[1] || 'application/octet-stream';
7
+
8
+ // Decode base64 to raw binary data
9
+ const binary = atob(data);
10
+ const len = binary.length;
11
+ const bytes = new Uint8Array(len);
12
+ for (let i = 0; i < len; i++) {
13
+ bytes[i] = binary.charCodeAt(i);
14
+ }
15
+
16
+ // Create a blob and generate a URL
17
+ const blob = new Blob([bytes], { type: mime });
18
+ return URL.createObjectURL(blob);
19
+ }
20
+
21
+ function getElementByXpath(path, timeout = 5000) {
22
+ return new Promise((resolve, reject) => {
23
+ const intervalTime = 500;
24
+ let elapsedTime = 0;
25
+ const interval = setInterval(() => {
26
+ let node = document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
27
+ if (node) {
28
+ clearInterval(interval);
29
+ resolve(node);
30
+ }
31
+ elapsedTime += intervalTime;
32
+ if (elapsedTime >= timeout) {
33
+ clearInterval(interval);
34
+ reject(new Error(`XPath "${path}" not found within ${timeout}ms`));
35
+ }
36
+ }, intervalTime);
37
+ });
38
+ }
39
+
40
+ async function uploadFileFromURL(url, filename, file_element) {
41
+ try {
42
+ if (!file_element) throw new Error("File input element not found.");
43
+ const response = await fetch(url);
44
+ if (!response.ok) throw new Error(`Failed to fetch file: ${response.statusText}`);
45
+ const blob = await response.blob();
46
+ const newFile = new File([blob], filename, { type: blob.type });
47
+ const dataTransfer = new DataTransfer();
48
+ if (file_element.multiple) {
49
+ for (const file of file_element.files) {
50
+ dataTransfer.items.add(file);
51
+ }
52
+ }
53
+ dataTransfer.items.add(newFile);
54
+ file_element.files = dataTransfer.files;
55
+ file_element.dispatchEvent(new Event("change", { bubbles: true }));
56
+ } catch (error) {
57
+ console.error("Error:", error);
58
+ }
59
+ }
60
+
61
+ function waitForElement(selector, timeout = 5000) {
62
+ return new Promise((resolve, reject) => {
63
+ const intervalTime = 500;
64
+ let elapsedTime = 0;
65
+
66
+ const interval = setInterval(() => {
67
+ const element = document.querySelector(selector);
68
+ if (element) {
69
+ clearInterval(interval);
70
+ resolve(element);
71
+ }
72
+
73
+ elapsedTime += intervalTime;
74
+ if (elapsedTime >= timeout) {
75
+ clearInterval(interval);
76
+ reject(new Error(`Element "${selector}" not found within ${timeout}ms`));
77
+ }
78
+ }, intervalTime);
79
+ });
80
+ }
81
+
82
+ document.addEventListener("DOMContentLoaded", function () {
83
+ getElementByXpath("//*[text()='Hide top bar']", 5000)
84
+ .then((node) => {
85
+ node.scrollIntoView();
86
+ node.click();
87
+ return waitForElement("#midi_file_input");
88
+ })
89
+ .then((file_upload) => {
90
+ if (!file_upload) throw new Error("File input element not found.");
91
+
92
+ // Wait for stability before proceeding
93
+ return new Promise(resolve => setTimeout(() => resolve(file_upload), 500));
94
+ })
95
+ .then((file_upload) => {
96
+ return waitForElement(".show_top_button").then((node) => {
97
+ node.remove();
98
+ selector = document.getElementById("renderer_mode_selector");
99
+ selector.selectedIndex = 2;
100
+ selector.dispatchEvent(new Event('change'));
101
+ // return uploadFileFromURL("/output.mid", "output.mid", file_upload);
102
+ });
103
+ })
104
+ .catch((error) => {
105
+ console.error("Error:", error);
106
+ });
107
+ });
108
+ window.addEventListener("message", async (event) => {
109
+ if (event.data?.type === "load-midi" && event.data.name) {
110
+ const url = event.data.url;
111
+ const file_name = event.data.name
112
+ const input = document.getElementById("midi_file_input");
113
+ if (url && input) {
114
+ await uploadFileFromURL(url, file_name, input);
115
+ }
116
+ }
117
+ });