Last active
July 13, 2018 13:26
-
-
Save blha303/6307989 to your computer and use it in GitHub Desktop.
MiniDLNA Python REST API server and associated Tkinter GUI for reading from it https://github.com/blha303/PythonMiniDLNARestAPI
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# https://github.com/blha303/PythonMiniDLNARestAPI | |
# Run this on a client machine (not the media server) | |
# This is my first GUI! | |
# Copyright 2013 Steven Smith (blha303). All Rights Reserved. | |
# New BSD license | |
# http://www.opensource.org/licenses/BSD-3-Clause | |
from Tkinter import * | |
import tkMessageBox | |
import requests | |
import json | |
hostname = "home.blha303.com.au" | |
port = "5000" | |
url = "http://%s:%s/api/DETAILS" % (hostname, port if port else "5000") | |
fields = ['ARTIST', 'ID', 'PATH', 'SIZE', 'TIMESTAMP', 'TITLE', 'DURATION', 'BITRATE', | |
'SAMPLERATE', 'CREATOR', 'ALBUM', 'GENRE', 'COMMENT', 'CHANNELS', 'DISC', | |
'TRACK', 'DATE', 'RESOLUTION', 'THUMBNAIL', 'ALBUM_ART', 'ROTATION', | |
'DLNA_PN', 'MIME'] | |
def search(term, name='artist'): | |
url = "http://home.blha303.com.au:5000/api/DETAILS" | |
headers = {'Content-Type': 'application/json'} | |
filters = [dict(name=name.upper(), op='like', val=term)] | |
params = dict(q=json.dumps(dict(filters=filters))) | |
response = requests.get(url, params=params, headers=headers) | |
assert response.status_code == 200 | |
return response.json() | |
master = Tk() | |
master.wm_title("MiniDLNA REST API gui (by blha303)") | |
windows = PanedWindow() | |
windows.pack(fill=BOTH, expand=1) | |
textbox = Text(windows) | |
windows.add(textbox) | |
rightside = PanedWindow(windows, orient=VERTICAL) | |
windows.add(rightside) | |
top = Entry(rightside) | |
rightside.add(top) | |
middle = Listbox(rightside) | |
x = 1 | |
for i in fields: | |
middle.insert(x, i) | |
x += 1 | |
rightside.add(middle) | |
def buttonCallback(): | |
term = top.get() | |
name = middle.get(middle.curselection() if middle.curselection() else 0) | |
data = search(term, name=name) | |
textbox.delete(1.0, END) | |
if data['num_results'] == 0: | |
textbox.insert(INSERT, str(data)) | |
return | |
else: | |
output = [] | |
for i in data['objects']: | |
if str(i['PATH']) != "None": | |
output.append("PATH: " + str(i['PATH'])) | |
for a in fields: | |
if a != "PATH": | |
output.append(" " + a + ": " + str(i[a])) | |
output.append("") | |
textbox.insert(INSERT, "\n".join(output)) | |
bottom = Button(rightside, text="Submit", command=buttonCallback) | |
rightside.add(bottom) | |
mainloop() |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Requirements (rather, the versions of these requirements that I have): | |
# Flask==0.10.1 | |
# Flask-Restless==0.12.0 | |
# Flask-SQLAlchemy==1.0 | |
# SQLAlchemy==0.8.2 | |
# Run this on the media server. It runs on port 5000 by default. | |
# Copyright 2013 Steven Smith (blha303). All Rights Reserved. | |
# New BSD license | |
# http://www.opensource.org/licenses/BSD-3-Clause | |
import flask | |
import flask.ext.sqlalchemy | |
app = flask.Flask(__name__) | |
app.config['DEBUG'] = True | |
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////var/lib/minidlna/files.db' | |
#app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data.db' | |
db = flask.ext.sqlalchemy.SQLAlchemy(app) | |
class Details(db.Model): | |
__tablename__ = "DETAILS" | |
ID = db.Column(db.Integer, primary_key=True) | |
PATH = db.Column(db.Text) | |
SIZE = db.Column(db.Integer) | |
TIMESTAMP = db.Column(db.Integer) | |
TITLE = db.Column(db.Text) | |
DURATION = db.Column(db.Text) | |
BITRATE = db.Column(db.Integer) | |
SAMPLERATE = db.Column(db.Integer) | |
CREATOR = db.Column(db.Text) | |
ARTIST = db.Column(db.Text) | |
ALBUM = db.Column(db.Text) | |
GENRE = db.Column(db.Text) | |
COMMENT = db.Column(db.Text) | |
CHANNELS = db.Column(db.Integer) | |
DISC = db.Column(db.Integer) | |
TRACK = db.Column(db.Integer) | |
DATE = db.Column(db.Date) | |
RESOLUTION = db.Column(db.Text) | |
THUMBNAIL = db.Column(db.Boolean) | |
ALBUM_ART = db.Column(db.Integer) | |
ROTATION = db.Column(db.Integer) | |
DLNA_PN = db.Column(db.Text) | |
MIME = db.Column(db.Text) | |
import flask.ext.restless | |
manager = flask.ext.restless.APIManager(app, flask_sqlalchemy_db=db) | |
manager.create_api(Details, methods=['GET'], results_per_page=20) | |
app.run(host='0.0.0.0') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment