Spaces:
Running
Running
Update app.py
Browse files
app.py
CHANGED
@@ -1,4 +1,4 @@
|
|
1 |
-
from flask import Flask, render_template, request, redirect, url_for, jsonify, session
|
2 |
import requests
|
3 |
import os
|
4 |
from datetime import timedelta
|
@@ -30,15 +30,6 @@ HUGGINGFACE_URLS = [
|
|
30 |
"https://huggingface.co/spaces/openfree/Article-Generator",
|
31 |
]
|
32 |
|
33 |
-
# Get direct iframe URL for Huggingface spaces
|
34 |
-
def get_iframe_url(url):
|
35 |
-
parts = url.split('/')
|
36 |
-
if len(parts) >= 6 and parts[3] == 'spaces':
|
37 |
-
owner = parts[4]
|
38 |
-
repo = parts[5]
|
39 |
-
return f"https://{owner}-{repo}.hf.space"
|
40 |
-
return url
|
41 |
-
|
42 |
# Extract title from the last part of URL
|
43 |
def extract_title(url):
|
44 |
parts = url.split("/")
|
@@ -67,6 +58,83 @@ def validate_token(token):
|
|
67 |
|
68 |
return False, None
|
69 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
70 |
# Homepage route
|
71 |
@app.route('/')
|
72 |
def home():
|
@@ -118,7 +186,7 @@ def get_urls():
|
|
118 |
search_query = request.args.get('search', '').lower()
|
119 |
|
120 |
results = []
|
121 |
-
for url in HUGGINGFACE_URLS:
|
122 |
title = extract_title(url)
|
123 |
|
124 |
if search_query and search_query not in url.lower() and search_query not in title.lower():
|
@@ -126,7 +194,7 @@ def get_urls():
|
|
126 |
|
127 |
results.append({
|
128 |
'url': url,
|
129 |
-
'
|
130 |
'title': title
|
131 |
})
|
132 |
|
@@ -578,7 +646,7 @@ if __name__ == '__main__':
|
|
578 |
}
|
579 |
|
580 |
urls.forEach(item => {
|
581 |
-
const { url,
|
582 |
|
583 |
// Create grid item
|
584 |
const gridItem = document.createElement('div');
|
@@ -608,7 +676,7 @@ if __name__ == '__main__':
|
|
608 |
|
609 |
// Create iframe to display the content
|
610 |
const iframe = document.createElement('iframe');
|
611 |
-
iframe.src =
|
612 |
iframe.title = title;
|
613 |
iframe.allow = 'accelerometer; camera; encrypted-media; geolocation; gyroscope; microphone; midi';
|
614 |
iframe.setAttribute('allowfullscreen', '');
|
|
|
1 |
+
from flask import Flask, render_template, request, redirect, url_for, jsonify, session, Response
|
2 |
import requests
|
3 |
import os
|
4 |
from datetime import timedelta
|
|
|
30 |
"https://huggingface.co/spaces/openfree/Article-Generator",
|
31 |
]
|
32 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
33 |
# Extract title from the last part of URL
|
34 |
def extract_title(url):
|
35 |
parts = url.split("/")
|
|
|
58 |
|
59 |
return False, None
|
60 |
|
61 |
+
# Create a redirect page for each URL
|
62 |
+
def create_frame_page(url, title):
|
63 |
+
return f'''
|
64 |
+
<!DOCTYPE html>
|
65 |
+
<html lang="ko">
|
66 |
+
<head>
|
67 |
+
<meta charset="UTF-8">
|
68 |
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
69 |
+
<title>{title}</title>
|
70 |
+
<style>
|
71 |
+
body, html {{
|
72 |
+
margin: 0;
|
73 |
+
padding: 0;
|
74 |
+
height: 100%;
|
75 |
+
overflow: hidden;
|
76 |
+
}}
|
77 |
+
.container {{
|
78 |
+
position: absolute;
|
79 |
+
width: 100%;
|
80 |
+
height: 100%;
|
81 |
+
display: flex;
|
82 |
+
flex-direction: column;
|
83 |
+
}}
|
84 |
+
.header {{
|
85 |
+
background: #f5f5f5;
|
86 |
+
padding: 10px;
|
87 |
+
display: flex;
|
88 |
+
justify-content: space-between;
|
89 |
+
align-items: center;
|
90 |
+
border-bottom: 1px solid #ddd;
|
91 |
+
}}
|
92 |
+
.header h3 {{
|
93 |
+
margin: 0;
|
94 |
+
font-size: 16px;
|
95 |
+
}}
|
96 |
+
.header a {{
|
97 |
+
color: #4CAF50;
|
98 |
+
text-decoration: none;
|
99 |
+
}}
|
100 |
+
.frame-container {{
|
101 |
+
flex-grow: 1;
|
102 |
+
position: relative;
|
103 |
+
}}
|
104 |
+
iframe {{
|
105 |
+
position: absolute;
|
106 |
+
top: 0;
|
107 |
+
left: 0;
|
108 |
+
width: 100%;
|
109 |
+
height: 100%;
|
110 |
+
border: none;
|
111 |
+
}}
|
112 |
+
</style>
|
113 |
+
</head>
|
114 |
+
<body>
|
115 |
+
<div class="container">
|
116 |
+
<div class="header">
|
117 |
+
<h3>{title}</h3>
|
118 |
+
<a href="{url}" target="_blank">새 창에서 열기</a>
|
119 |
+
</div>
|
120 |
+
<div class="frame-container">
|
121 |
+
<iframe src="{url}" allowfullscreen="true" frameborder="0" allow="accelerometer; camera; encrypted-media; geolocation; gyroscope; microphone; midi"></iframe>
|
122 |
+
</div>
|
123 |
+
</div>
|
124 |
+
</body>
|
125 |
+
</html>
|
126 |
+
'''
|
127 |
+
|
128 |
+
# Route to serve a framed page
|
129 |
+
@app.route('/frame/<int:url_id>')
|
130 |
+
def frame(url_id):
|
131 |
+
try:
|
132 |
+
url = HUGGINGFACE_URLS[url_id]
|
133 |
+
title = extract_title(url)
|
134 |
+
return create_frame_page(url, title)
|
135 |
+
except IndexError:
|
136 |
+
return "URL not found", 404
|
137 |
+
|
138 |
# Homepage route
|
139 |
@app.route('/')
|
140 |
def home():
|
|
|
186 |
search_query = request.args.get('search', '').lower()
|
187 |
|
188 |
results = []
|
189 |
+
for idx, url in enumerate(HUGGINGFACE_URLS):
|
190 |
title = extract_title(url)
|
191 |
|
192 |
if search_query and search_query not in url.lower() and search_query not in title.lower():
|
|
|
194 |
|
195 |
results.append({
|
196 |
'url': url,
|
197 |
+
'frameUrl': f'/frame/{idx}',
|
198 |
'title': title
|
199 |
})
|
200 |
|
|
|
646 |
}
|
647 |
|
648 |
urls.forEach(item => {
|
649 |
+
const { url, frameUrl, title } = item;
|
650 |
|
651 |
// Create grid item
|
652 |
const gridItem = document.createElement('div');
|
|
|
676 |
|
677 |
// Create iframe to display the content
|
678 |
const iframe = document.createElement('iframe');
|
679 |
+
iframe.src = frameUrl;
|
680 |
iframe.title = title;
|
681 |
iframe.allow = 'accelerometer; camera; encrypted-media; geolocation; gyroscope; microphone; midi';
|
682 |
iframe.setAttribute('allowfullscreen', '');
|