File size: 5,918 Bytes
d0c2b7c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24392a5
 
 
 
 
d0c2b7c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import tempfile
import time
from selenium import webdriver
from PIL import Image
import os
import subprocess
import json
import chromedriver_autoinstaller
from selenium.webdriver.chrome.service import Service as ChromeService
from selenium.webdriver.chrome.options import Options

chrome_path = "/tmp/chrome-extract/opt/google/chrome/google-chrome"

# Function to install and configure Chrome without sudo
def setup_chrome():
    chrome_url = "https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb"
    chrome_deb_path = "/tmp/google-chrome-stable_current_amd64.deb"
    subprocess.run(["wget", chrome_url, "-O", chrome_deb_path])

    extract_dir = "/tmp/chrome-extract"
    os.makedirs(extract_dir, exist_ok=True)

    # Extract Chrome browser files
    subprocess.run(["ar", "x", chrome_deb_path], cwd=extract_dir)
    data_tar_path = os.path.join(extract_dir, "data.tar.xz")
    subprocess.run(["tar", "xf", data_tar_path], cwd=extract_dir)

    # Set Chrome browser path
    
    os.environ["CHROME_BINARY"] = chrome_path

    # Add Chrome path to system PATH
    os.environ["PATH"] = f"{os.path.dirname(chrome_path)}:{os.environ['PATH']}"

    # Install ChromeDriver
    chromedriver_autoinstaller.install()

    #return chrome_path

# Function to convert HTML content to an image
def html_to_image(html_content):
    # Save HTML content in a temporary file
    with tempfile.NamedTemporaryFile(delete=False, suffix='.html') as html_file:
        html_file.write(html_content.encode('utf-8'))
        html_file_path = html_file.name
    
    options = Options()
    options.binary_location = chrome_path
    options.add_argument("--headless")  # For headless mode
    options.add_argument("--no-sandbox")
    options.add_argument("--disable-dev-shm-usage")

    # Start the Chrome browser
    driver = webdriver.Chrome(service=ChromeService(), options=options)
    
    # Load the HTML file
    driver.get(f'file://{html_file_path}')
    
    # Wait for the page to load
    time.sleep(2)
    
    # Get the page dimensions
    width = driver.execute_script("return document.body.scrollWidth")
    height = driver.execute_script("return document.body.scrollHeight")
    
    # Resize window to the page size
    driver.set_window_size(width, height)
    
    # Capture screenshot and save as a PNG file
    screenshot_path = tempfile.NamedTemporaryFile(delete=False, suffix='.png').name
    driver.save_screenshot(screenshot_path)
    
    # Close the browser
    driver.quit()
    
    return screenshot_path

def render_abc(abc_string):
    abc_string = json.dumps(abc_string)
    print("in render_abc")
    html_template = f"""
    <!DOCTYPE html>
    <html>
    <head>
        <script src="https://cdn.jsdelivr.net/npm/abcjs@6.4.2/dist/abcjs-basic.min.js"></script>
    </head>
    <body>
        <div id='abcjs-render' style='text-align: center;'></div>
        <script>
            var abcNotation = {abc_string};
            ABCJS.renderAbc('abcjs-render', abcNotation);
        </script>
    </body>
    </html>
    """
    

    screenshot_path = html_to_image(html_template)
    return screenshot_path

    #return html_template


# Initialize the environment
#chrome_path = setup_chrome()

# Example of how to call the function
html_content = """
    <!DOCTYPE html>
    <html lang="en">
    <head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>ABCJS Example</title>
        <script src="https://cdn.jsdelivr.net/npm/abcjs@6.4.3/dist/abcjs-basic.min.js"></script>
    </head>
    <body>
        <div id="abc"></div>
        <script>
            var abcNotation = `
X:1
T:菊次郎的夏天(Summer版本C)
%%score { 1 | 2 }
L:1/16
Q:1/4=114
M:4/4
I:linebreak $
K:C
V:1 treble nm="钢琴" snm="Pno."
V:2 bass 
L:1/8
V:1
"^Moderato" z16 | z16 | z16 | z8 z4 .GI6J.cI7J.dI8J.eI9J |: %4
 !>!dI10J2.cI11JcI12J- cI13J8 .GI14J.cI15J.dI16J.eI17J | %5
 !>!dI18J2cI19J.dI20J z2 .eI22J2 !>!eI23J4 .GI24J.cI25J.dI26J.eI27J | %6
 !>!dI28J2.cI29JcI30J- cI31J8 .GI32J.cI33J.dI34J.eI35J | %7
 !>!dI36J2cI37J.dI38J z2 .gI40J2 !>!eI41J4 eI42J2fI43J2 | %8
!mf! [eI44JgI45J]2[eI46JgI47J][eI48J-gI49J-]- [eI50JgI51J]2gI52J2 gI53J2eI54JcI55J- cI56J2eI57JfI58J | %9
 [eI59JgI60J]2[eI61JgI62J][eI63J-gI64J-]- [eI65JgI66J]2[eI67JgI68J]2 gI69J2eI70JcI71J- cI72J2cI73JdI74J | %10
 eI75J2eI76JeI77J- eI78J2eI79J2 eI80J2aI81J2 (3!>!dI82JeI83JdI84JcI85J2 |1 %11
 !>!dI86J8 z4 .GI88J.cI89J.dI90J.eI91J :|2 !>!cI92J8 z8 || z16 | z16 | z16 | %16
 !>![G,I97JCI98JEI99J]16 |] %17
V:2
 A,,I100J.E,I101J.A,I102J.E,I103J F,,I104J.C,I105J.F,I106J.C,I107J | %1
 G,,I108J.D,I109J.G,I110J.D,I111J C,I112J.G,I113J.CI114J.G,I115J | %2
 A,,I116J.E,I117J.A,I118J.E,I119J F,,I120J.C,I121J.F,I122J.C,I123J | %3
 G,,I124J.D,I125J.G,I126J.D,I127J C,I128J.G,I129J.CI130J.G,I131J |: %4
 A,,I132J.E,I133J.A,I134J.E,I135J F,,I136J.C,I137J.F,I138J.C,I139J | %5
 G,,I140J.D,I141J.G,I142J.D,I143J C,I144J.G,I145J.CI146J.G,I147J | %6
 A,,I148J.E,I149J.A,I150J.E,I151J F,,I152J.C,I153J.F,I154J.C,I155J | %7
 G,,I156J.D,I157J.G,I158J.D,I159J C,I160J.G,I161J.CI162J.G,I163J | %8
 G,,I164J.D,I165J.G,I166J.D,I167J F,,I168J.C,I169J.F,I170J.C,I171J | %9
 E,,I172J.B,,I173J.E,I174J.B,,I175J A,,I176J.E,I177J.A,I178J.E,I179J | %10
 D,,I180J.A,,I181J.D,I182J.A,,I183J F,,I184J2 z2 |1 %11
 G,,I186J.D,I187J.G,I188J.D,I189J G,,I190J.D,I191J.G,I192J.D,I193J :|2 %12
 C,I194JG,I195JCI196JG,I197J A,,I198JE,I199JA,I200JE,I201J || %13
 F,,I202JC,I203JF,I204JC,I205J G,,I206JD,I207JG,I208JD,I209J | %14
 C,I210JG,I211JCI212JG,I213J A,,I214JE,I215JA,I216JE,I217J | %15
 F,,I218JC,I219JF,I220JC,I221J G,,I222JD,I223JG,I224JD,I225J | !>!C,I226J8 |] %17

                `;
            ABCJS.renderAbc("abc", abcNotation);
        </script>
    </body>
    </html>
"""
#screenshot_path = html_to_image(html_content, chrome_path)
#print(f"Screenshot saved at: {screenshot_path}")