diff --git a/.gitignore b/.gitignore index 1269488..cc79b9f 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ data +__pycache__ +*.db diff --git a/src/api/__init__.py b/src/api/__init__.py new file mode 100644 index 0000000..248fe24 --- /dev/null +++ b/src/api/__init__.py @@ -0,0 +1,32 @@ +from flask import Flask +from flask_sqlalchemy import SQLAlchemy +from flask_cors import CORS +from os import path +import logging + + +db = SQLAlchemy() +DB_NAME = 'database.db' + + +def create_api(): + app = Flask(__name__) + CORS(app) + logging.getLogger('flask_cors').level = logging.DEBUG + #CORS(app, resources={r"/*": {"origin": ["http://localhost:3008"]}}) + app.config['SQLALCHEMY_DATABASE_URI'] = f'sqlite:///{DB_NAME}' + db.init_app(app) + + from .abl.user import user + from .abl.playlist import playlist + + app.register_blueprint(user, url_prefix='/api/user') + app.register_blueprint(playlist, url_prefix='/api/playlist') + + from .models import User, Playlist, PlaylistFile, File + + with app.app_context(): + db.create_all() + + + return app diff --git a/src/api/abl/playlist.py b/src/api/abl/playlist.py new file mode 100644 index 0000000..aca5914 --- /dev/null +++ b/src/api/abl/playlist.py @@ -0,0 +1,58 @@ +from flask import Blueprint, request, Response, jsonify +from flask_cors import cross_origin +from ..models import Playlist, PlaylistFile +from .. import db +from datetime import datetime +from sqlalchemy.sql import func + +playlist = Blueprint('playlist', __name__) + +@playlist.route('/', methods=['PUT']) +def create(): + data = request.get_json() + new_playlist = Playlist(name=data['name']) + db.session.add(new_playlist) + db.session.flush() + db.session.commit() + + print(new_playlist.as_dict()) + return Response( + response=new_playlist.as_dict(), + status=200, + mimetype="application/json" + ) + +@playlist.route('/', methods=["GET"]) +def list(): + playlists = db.session.query(Playlist).all() + + res = [] + for playlist in playlists: + p = playlist.as_dict() + p['last_modified'] = p['last_modified'].isoformat() + res.append(p) + + return jsonify(res) + +@playlist.route('/', methods=["GET"]) +def get_playlist(playlist_id): + query = db.session.query(\ + Playlist.name,\ + func.group_concat(PlaylistFile.id).label('files')\ + ).\ + join(PlaylistFile, Playlist.id == PlaylistFile.playlist_id).\ + filter(Playlist.id == playlist_id).\ + group_by(Playlist.id).\ + all() + + query = db.session.query( \ + Playlist.name, \ + func.group_concat(Playlist.id == PlaylistFile.playlist_id) \ + ) \ + .outerjoin(PlaylistFile, Playlist.id == PlaylistFile.playlist_id) \ + .filter(Playlist.id == playlist_id) \ + .group_by(Playlist.id) \ + .first() + + return jsonify({'name': query[0], 'files': query[1]}) + diff --git a/src/api/abl/user.py b/src/api/abl/user.py new file mode 100644 index 0000000..2efc2bf --- /dev/null +++ b/src/api/abl/user.py @@ -0,0 +1,22 @@ +from flask import Blueprint, request +from ..models import User +from werkzeug.security import generate_password_hash, check_password_hash + +user = Blueprint('user', __name__) + +@user.route('create', methods=['PUT']) +def create(): + print(request.get_json()) + return "ok" + generate_password_hash("i", method='sha256') + db.session.add(new_user) + db.session.commit() + return "ok" + +@user.route('delete', methods=['DELETE']) +def delete(): + return "ok" + +@user.route('list', methods=['GET']) +def list(): + return "ok" diff --git a/src/api/models.py b/src/api/models.py new file mode 100644 index 0000000..105f316 --- /dev/null +++ b/src/api/models.py @@ -0,0 +1,30 @@ +from . import db +from flask_login import UserMixin +from sqlalchemy.sql import func + +class PlaylistFile(db.Model): + id = db.Column(db.Integer, primary_key = True) + playlist_id = db.Column(db.Integer, db.ForeignKey('playlist.id')) +# file_id = db.Column(db.Integer, db.ForeignKey('file.id')) + +class File(db.Model): + id = db.Column(db.Integer, primary_key = True) + name = db.Column(db.String(150)) + type = db.Column(db.String(15)) + +class Playlist(db.Model): + id = db.Column(db.Integer, primary_key = True) + name = db.Column(db.String(150)) + last_modified = db.Column(db.DateTime(timezone=True), default=func.now()) + read_permissions = db.Column(db.Integer, default=0) + write_permissions = db.Column(db.Integer, default=0) + execute_permissions = db.Column(db.Integer, default=0) + files = db.relationship('PlaylistFile') + + def as_dict(self): + return {c.name: getattr(self, c.name) for c in self.__table__.columns} + +class User(db.Model, UserMixin): + id = db.Column(db.Integer, primary_key = True) + login = db.Column(db.String(150)) + password = db.Column(db.String(150)) diff --git a/src/index.py b/src/index.py index 0c450e0..ba70c5a 100644 --- a/src/index.py +++ b/src/index.py @@ -1,47 +1,10 @@ -import tkinter as tk -from PIL import ImageTk, Image -import os -import time +from api import create_api -class SlideshowApp: - def __init__(self, root, image_paths): - self.root = root - self.paths = image_paths - self.idx = 0 + +api = create_api() - self.image_label = tk.Label(root) - self.image_label.pack() - self.image_label.pack(fill=tk.BOTH, expand=True) - - self.show_next_image() - - def show_next_image(self): - img_path = self.paths[self.idx] - image = Image.open(img_path) - - # Get root window width and height - screen_width = self.root.winfo_width() - screen_height = self.root.winfo_height() - - # Resize the image to fit the screen - image = image.resize((screen_width, screen_height), Image.ANTIALIAS) - - photo = ImageTk.PhotoImage(image) - self.image_label.config(image=photo) - self.image_label.image = photo - - self.idx = (self.idx + 1) % len(self.paths) - self.root.after(2000, self.show_next_image) - -def main(): - root = tk.Tk() - root.title("Image Slideshow") +if __name__ == '__main__': + api.run(host="0.0.0.0", port=5500, debug=True) - img_paths = ["./data/960x0-1053101061.jpg", "./data/my-linux-desktop-1131547615.png", "./data/glzrkk83f4621-1200x671-54057802.jpg", "./data/yjdoiycuw04lvrebijtw-605729284.jpg"] - app = SlideshowApp(root, img_paths) - root.mainloop() - -if __name__ == "__main__": - main()