creation of playlist
This commit is contained in:
parent
874b04bef0
commit
52513c10df
2
.gitignore
vendored
2
.gitignore
vendored
@ -1 +1,3 @@
|
|||||||
data
|
data
|
||||||
|
__pycache__
|
||||||
|
*.db
|
||||||
|
32
src/api/__init__.py
Normal file
32
src/api/__init__.py
Normal file
@ -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
|
58
src/api/abl/playlist.py
Normal file
58
src/api/abl/playlist.py
Normal file
@ -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('/<int:playlist_id>', 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]})
|
||||||
|
|
22
src/api/abl/user.py
Normal file
22
src/api/abl/user.py
Normal file
@ -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"
|
30
src/api/models.py
Normal file
30
src/api/models.py
Normal file
@ -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))
|
45
src/index.py
45
src/index.py
@ -1,47 +1,10 @@
|
|||||||
import tkinter as tk
|
from api import create_api
|
||||||
from PIL import ImageTk, Image
|
|
||||||
import os
|
|
||||||
import time
|
|
||||||
|
|
||||||
|
|
||||||
class SlideshowApp:
|
|
||||||
def __init__(self, root, image_paths):
|
|
||||||
self.root = root
|
|
||||||
self.paths = image_paths
|
|
||||||
self.idx = 0
|
|
||||||
|
|
||||||
self.image_label = tk.Label(root)
|
api = create_api()
|
||||||
self.image_label.pack()
|
|
||||||
self.image_label.pack(fill=tk.BOTH, expand=True)
|
|
||||||
|
|
||||||
self.show_next_image()
|
if __name__ == '__main__':
|
||||||
|
api.run(host="0.0.0.0", port=5500, debug=True)
|
||||||
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")
|
|
||||||
|
|
||||||
|
|
||||||
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()
|
|
||||||
|
Loading…
Reference in New Issue
Block a user