Spaces:
Running
Running
Upload 3 files
Browse files- README.md +96 -6
- app.py +49 -0
- requirements.txt +12 -0
README.md
CHANGED
|
@@ -1,12 +1,102 @@
|
|
| 1 |
---
|
| 2 |
-
title:
|
| 3 |
-
emoji:
|
| 4 |
-
colorFrom:
|
| 5 |
-
colorTo:
|
| 6 |
sdk: gradio
|
| 7 |
-
sdk_version:
|
| 8 |
app_file: app.py
|
| 9 |
pinned: false
|
|
|
|
| 10 |
---
|
| 11 |
|
| 12 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
title: Share YouTube App
|
| 3 |
+
emoji: 📺
|
| 4 |
+
colorFrom: red
|
| 5 |
+
colorTo: blue
|
| 6 |
sdk: gradio
|
| 7 |
+
sdk_version: 4.44.0
|
| 8 |
app_file: app.py
|
| 9 |
pinned: false
|
| 10 |
+
license: mit
|
| 11 |
---
|
| 12 |
|
| 13 |
+
# Share YouTube App 📺
|
| 14 |
+
|
| 15 |
+
แอปพลิเคชันง่ายๆ สำหรับแชร์ลิงก์ YouTube พร้อมโน๊ตสั้นๆ ที่ผู้ใช้สามารถถูกใจและคอมเมนต์ได้
|
| 16 |
+
|
| 17 |
+
## ฟีเจอร์
|
| 18 |
+
|
| 19 |
+
- ✅ แชร์ลิงก์ YouTube พร้อมโน๊ตสั้นๆ
|
| 20 |
+
- ✅ แสดงผลวิดีโอ YouTube แบบ embed
|
| 21 |
+
- ✅ ระบบถูกใจ (Like)
|
| 22 |
+
- ✅ ระบบคอมเมนต์
|
| 23 |
+
- ✅ UI ที่สวยงามและใช้งานง่าย
|
| 24 |
+
- ✅ รองรับการใช้งานบนมือถือ
|
| 25 |
+
|
| 26 |
+
## การใช้งาน
|
| 27 |
+
|
| 28 |
+
1. กรอกชื่อของคุณ
|
| 29 |
+
2. ใส่ลิงก์ YouTube ที่ต้องการแชร์
|
| 30 |
+
3. เขียนโน๊ตสั้นๆ เกี่ยวกับวิดีโอ
|
| 31 |
+
4. กดปุ่ม "แชร์"
|
| 32 |
+
5. ดูลิงก์ที่แชร์ในฟีดด้านล่าง
|
| 33 |
+
6. สามารถถูกใจและคอมเมนต์ได้
|
| 34 |
+
|
| 35 |
+
## เทคโนโลยีที่ใช้
|
| 36 |
+
|
| 37 |
+
- **Backend**: Flask (Python)
|
| 38 |
+
- **Database**: SQLite
|
| 39 |
+
- **Frontend**: HTML, CSS, JavaScript
|
| 40 |
+
- **UI Framework**: Font Awesome Icons
|
| 41 |
+
- **Styling**: Custom CSS with Gradient Background
|
| 42 |
+
|
| 43 |
+
## การติดตั้งและรันในเครื่อง
|
| 44 |
+
|
| 45 |
+
```bash
|
| 46 |
+
# Clone repository
|
| 47 |
+
git clone <repository-url>
|
| 48 |
+
cd facebook-clone
|
| 49 |
+
|
| 50 |
+
# สร้าง virtual environment
|
| 51 |
+
python -m venv venv
|
| 52 |
+
source venv/bin/activate # Linux/Mac
|
| 53 |
+
# หรือ venv\Scripts\activate # Windows
|
| 54 |
+
|
| 55 |
+
# ติดตั้ง dependencies
|
| 56 |
+
pip install -r requirements.txt
|
| 57 |
+
|
| 58 |
+
# รันแอป
|
| 59 |
+
python app.py
|
| 60 |
+
```
|
| 61 |
+
|
| 62 |
+
แอปจะรันที่ `http://localhost:7860`
|
| 63 |
+
|
| 64 |
+
## โครงสร้างโปรเจกต์
|
| 65 |
+
|
| 66 |
+
```
|
| 67 |
+
facebook-clone/
|
| 68 |
+
├── app.py # Main application file for Hugging Face Spaces
|
| 69 |
+
├── requirements.txt # Python dependencies
|
| 70 |
+
├── README.md # This file
|
| 71 |
+
├── src/
|
| 72 |
+
│ ├── main.py # Original Flask app
|
| 73 |
+
│ ├── models/ # Database models
|
| 74 |
+
│ │ ├── user.py # User model
|
| 75 |
+
│ │ └── post.py # Post and Comment models
|
| 76 |
+
│ ├── routes/ # API routes
|
| 77 |
+
│ │ ├── user.py # User routes
|
| 78 |
+
│ │ └── post.py # Post routes
|
| 79 |
+
│ ├── static/ # Frontend files
|
| 80 |
+
│ │ ├── index.html # Main HTML file
|
| 81 |
+
│ │ ├── style.css # CSS styles
|
| 82 |
+
│ │ └── script.js # JavaScript functionality
|
| 83 |
+
│ └── database/ # SQLite database
|
| 84 |
+
│ └── app.db # Database file
|
| 85 |
+
└── venv/ # Virtual environment
|
| 86 |
+
```
|
| 87 |
+
|
| 88 |
+
## API Endpoints
|
| 89 |
+
|
| 90 |
+
### Posts
|
| 91 |
+
- `GET /api/posts` - ดึงโพสต์ทั้งหมด
|
| 92 |
+
- `POST /api/posts` - สร้างโพสต์ใหม่
|
| 93 |
+
- `POST /api/posts/{id}/like` - ถูกใจโพสต์
|
| 94 |
+
|
| 95 |
+
### Comments
|
| 96 |
+
- `GET /api/posts/{id}/comments` - ดึงคอมเมนต์ของโพสต์
|
| 97 |
+
- `POST /api/posts/{id}/comments` - เพิ่มคอมเมนต์
|
| 98 |
+
|
| 99 |
+
## License
|
| 100 |
+
|
| 101 |
+
MIT License - ดูรายละเอียดในไฟล์ LICENSE
|
| 102 |
+
|
app.py
ADDED
|
@@ -0,0 +1,49 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import os
|
| 2 |
+
import sys
|
| 3 |
+
# DON'T CHANGE THIS !!!
|
| 4 |
+
sys.path.insert(0, os.path.dirname(__file__))
|
| 5 |
+
|
| 6 |
+
from flask import Flask, send_from_directory
|
| 7 |
+
from flask_cors import CORS
|
| 8 |
+
from src.models.user import db
|
| 9 |
+
from src.routes.user import user_bp
|
| 10 |
+
from src.routes.post import post_bp
|
| 11 |
+
|
| 12 |
+
app = Flask(__name__, static_folder=os.path.join(os.path.dirname(__file__), 'src', 'static'))
|
| 13 |
+
app.config['SECRET_KEY'] = 'asdf#FGSgvasgf$5$WGT'
|
| 14 |
+
|
| 15 |
+
# Enable CORS for all routes
|
| 16 |
+
CORS(app)
|
| 17 |
+
|
| 18 |
+
app.register_blueprint(user_bp, url_prefix='/api')
|
| 19 |
+
app.register_blueprint(post_bp, url_prefix='/api')
|
| 20 |
+
|
| 21 |
+
# Database configuration
|
| 22 |
+
app.config['SQLALCHEMY_DATABASE_URI'] = f"sqlite:///{os.path.join(os.path.dirname(__file__), 'src', 'database', 'app.db')}"
|
| 23 |
+
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
|
| 24 |
+
db.init_app(app)
|
| 25 |
+
|
| 26 |
+
# Create database tables
|
| 27 |
+
with app.app_context():
|
| 28 |
+
db.create_all()
|
| 29 |
+
|
| 30 |
+
@app.route('/', defaults={'path': ''})
|
| 31 |
+
@app.route('/<path:path>')
|
| 32 |
+
def serve(path):
|
| 33 |
+
static_folder_path = app.static_folder
|
| 34 |
+
if static_folder_path is None:
|
| 35 |
+
return "Static folder not configured", 404
|
| 36 |
+
|
| 37 |
+
if path != "" and os.path.exists(os.path.join(static_folder_path, path)):
|
| 38 |
+
return send_from_directory(static_folder_path, path)
|
| 39 |
+
else:
|
| 40 |
+
index_path = os.path.join(static_folder_path, 'index.html')
|
| 41 |
+
if os.path.exists(index_path):
|
| 42 |
+
return send_from_directory(static_folder_path, 'index.html')
|
| 43 |
+
else:
|
| 44 |
+
return "index.html not found", 404
|
| 45 |
+
|
| 46 |
+
if __name__ == '__main__':
|
| 47 |
+
port = int(os.environ.get('PORT', 7860))
|
| 48 |
+
app.run(host='0.0.0.0', port=port, debug=False)
|
| 49 |
+
|
requirements.txt
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
blinker==1.9.0
|
| 2 |
+
click==8.2.1
|
| 3 |
+
Flask==3.1.1
|
| 4 |
+
flask-cors==6.0.0
|
| 5 |
+
Flask-SQLAlchemy==3.1.1
|
| 6 |
+
greenlet==3.2.4
|
| 7 |
+
itsdangerous==2.2.0
|
| 8 |
+
Jinja2==3.1.6
|
| 9 |
+
MarkupSafe==3.0.2
|
| 10 |
+
SQLAlchemy==2.0.41
|
| 11 |
+
typing_extensions==4.14.0
|
| 12 |
+
Werkzeug==3.1.3
|