File size: 2,867 Bytes
8ac3a87
 
 
 
31c4a0e
c81c490
8ac3a87
898cc4c
8ac3a87
898cc4c
31c4a0e
8ac3a87
898cc4c
31c4a0e
8ac3a87
08e6637
 
 
 
31c4a0e
8ac3a87
 
 
 
 
 
 
 
 
 
08e6637
8ac3a87
31c4a0e
8ac3a87
31c4a0e
 
8ac3a87
08e6637
 
 
31c4a0e
8ac3a87
 
 
31c4a0e
08e6637
 
31c4a0e
8ac3a87
 
 
31c4a0e
 
 
 
 
8ac3a87
31c4a0e
 
8ac3a87
31c4a0e
 
8ac3a87
 
 
08e6637
31c4a0e
08e6637
 
8ac3a87
 
 
31c4a0e
 
 
 
 
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
# app.py
from fastapi import FastAPI
from fastapi.responses import HTMLResponse
from fastapi.staticfiles import StaticFiles
import pathlib, os, uvicorn

BASE = pathlib.Path(__file__).parent

app = FastAPI()

# ── 정적 파일 (JS / CSS / 이미지 / MP3) μ„œλΉ™ ──
app.mount("/static", StaticFiles(directory=BASE), name="static")

# ── index.html 원문 ──
INDEX_HTML = """
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<title>FlipBook – μ—…λ‘œλ“œ + μ‚¬μš΄λ“œ</title>
<link rel="stylesheet" href="/static/flipbook.css">
<script src="/static/three.js"></script>
<script src="/static/iscroll.js"></script>
<script src="/static/mark.js"></script>
<script src="/static/mod3d.js"></script>
<script src="/static/flipbook.js"></script>
<script src="/static/flipbook.book3.js"></script>
<script src="/static/flipbook.scroll.js"></script>
<script src="/static/flipbook.swipe.js"></script>
<script src="/static/flipbook.webgl.js"></script>
<style>
 body{margin:0;font-family:sans-serif;background:#f4f4f4}
 #viewer{width:900px;height:600px;margin:40px auto;background:#fff;border:1px solid #ccc}
 .upload-wrapper{display:flex;justify-content:center}
 #uploadBtn{all:unset;width:44px;height:44px;line-height:44px;text-align:center;
            font-size:26px;border-radius:50%;cursor:pointer;background:#ffb84d;color:#fff}
 #fileInput{display:none}
</style>
</head>
<body>
<h2 style="text-align:center">Real3D FlipBook – μ—…λ‘œλ“œ βœ¨πŸ“–</h2>
<div id="viewer"></div>
<div class="upload-wrapper">
  <button id="uploadBtn" title="이미지 μ—…λ‘œλ“œ">πŸ“·</button>
  <input id="fileInput" type="file" accept="image/*" multiple>
</div>
<script>
let book=null, holder=document.getElementById('viewer');
document.getElementById('uploadBtn').onclick=()=>document.getElementById('fileInput').click();
document.getElementById('fileInput').onchange=e=>{
  if(!e.target.files.length) return;
  const files=[...e.target.files], pages=[], tot=files.length; let cnt=0;
  files.forEach((f,i)=>{const r=new FileReader();r.onload=x=>{
      pages[i]={src:x.target.result,thumb:x.target.result};
      if(++cnt===tot) makeBook(pages);
  };r.readAsDataURL(f);});
};
function makeBook(p){
  if(book){book.destroy();holder.innerHTML='';}
  book=new FlipBook(holder,{
    pages:p,viewMode:'webgl',autoSize:true,flipDuration:800,backgroundColor:'#fff',
    sound:true,assets:{flipMp3:'/static/turnPage2.mp3',hardFlipMp3:'/static/turnPage2.mp3'},
    controlsProps:{enableFullscreen:true,thumbnails:true}
  });
}
</script>
</body></html>
"""

@app.get("/", response_class=HTMLResponse)
async def root():
    return INDEX_HTML

# ── Hugging Faceκ°€ β€˜python app.py’ 둜 μ‹€ν–‰ν•  λ•Œ 직접 uvicorn을 띄움 ──
if __name__ == "__main__":
    port = int(os.environ.get("PORT", 7860))
    uvicorn.run("app:app", host="0.0.0.0", port=port, reload=False)