minidlnagui.py
· 2.2 KiB · Python
Raw
# 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()
| 1 | # https://github.com/blha303/PythonMiniDLNARestAPI |
| 2 | |
| 3 | # Run this on a client machine (not the media server) |
| 4 | # This is my first GUI! |
| 5 | |
| 6 | # Copyright 2013 Steven Smith (blha303). All Rights Reserved. |
| 7 | # New BSD license |
| 8 | # http://www.opensource.org/licenses/BSD-3-Clause |
| 9 | |
| 10 | from Tkinter import * |
| 11 | import tkMessageBox |
| 12 | import requests |
| 13 | import json |
| 14 | |
| 15 | hostname = "home.blha303.com.au" |
| 16 | port = "5000" |
| 17 | url = "http://%s:%s/api/DETAILS" % (hostname, port if port else "5000") |
| 18 | fields = ['ARTIST', 'ID', 'PATH', 'SIZE', 'TIMESTAMP', 'TITLE', 'DURATION', 'BITRATE', |
| 19 | 'SAMPLERATE', 'CREATOR', 'ALBUM', 'GENRE', 'COMMENT', 'CHANNELS', 'DISC', |
| 20 | 'TRACK', 'DATE', 'RESOLUTION', 'THUMBNAIL', 'ALBUM_ART', 'ROTATION', |
| 21 | 'DLNA_PN', 'MIME'] |
| 22 | |
| 23 | def search(term, name='artist'): |
| 24 | url = "http://home.blha303.com.au:5000/api/DETAILS" |
| 25 | headers = {'Content-Type': 'application/json'} |
| 26 | filters = [dict(name=name.upper(), op='like', val=term)] |
| 27 | params = dict(q=json.dumps(dict(filters=filters))) |
| 28 | response = requests.get(url, params=params, headers=headers) |
| 29 | assert response.status_code == 200 |
| 30 | return response.json() |
| 31 | |
| 32 | master = Tk() |
| 33 | master.wm_title("MiniDLNA REST API gui (by blha303)") |
| 34 | windows = PanedWindow() |
| 35 | windows.pack(fill=BOTH, expand=1) |
| 36 | textbox = Text(windows) |
| 37 | windows.add(textbox) |
| 38 | rightside = PanedWindow(windows, orient=VERTICAL) |
| 39 | windows.add(rightside) |
| 40 | top = Entry(rightside) |
| 41 | rightside.add(top) |
| 42 | middle = Listbox(rightside) |
| 43 | x = 1 |
| 44 | for i in fields: |
| 45 | middle.insert(x, i) |
| 46 | x += 1 |
| 47 | |
| 48 | rightside.add(middle) |
| 49 | |
| 50 | def buttonCallback(): |
| 51 | term = top.get() |
| 52 | name = middle.get(middle.curselection() if middle.curselection() else 0) |
| 53 | data = search(term, name=name) |
| 54 | textbox.delete(1.0, END) |
| 55 | if data['num_results'] == 0: |
| 56 | textbox.insert(INSERT, str(data)) |
| 57 | return |
| 58 | else: |
| 59 | output = [] |
| 60 | for i in data['objects']: |
| 61 | if str(i['PATH']) != "None": |
| 62 | output.append("PATH: " + str(i['PATH'])) |
| 63 | for a in fields: |
| 64 | if a != "PATH": |
| 65 | output.append(" " + a + ": " + str(i[a])) |
| 66 | output.append("") |
| 67 | textbox.insert(INSERT, "\n".join(output)) |
| 68 | |
| 69 | bottom = Button(rightside, text="Submit", command=buttonCallback) |
| 70 | rightside.add(bottom) |
| 71 | mainloop() |
| 72 |
minidlnarestserver.py
· 1.6 KiB · Python
Raw
# 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')
| 1 | # Requirements (rather, the versions of these requirements that I have): |
| 2 | # Flask==0.10.1 |
| 3 | # Flask-Restless==0.12.0 |
| 4 | # Flask-SQLAlchemy==1.0 |
| 5 | # SQLAlchemy==0.8.2 |
| 6 | |
| 7 | # Run this on the media server. It runs on port 5000 by default. |
| 8 | |
| 9 | # Copyright 2013 Steven Smith (blha303). All Rights Reserved. |
| 10 | # New BSD license |
| 11 | # http://www.opensource.org/licenses/BSD-3-Clause |
| 12 | |
| 13 | import flask |
| 14 | import flask.ext.sqlalchemy |
| 15 | app = flask.Flask(__name__) |
| 16 | app.config['DEBUG'] = True |
| 17 | app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////var/lib/minidlna/files.db' |
| 18 | #app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///data.db' |
| 19 | db = flask.ext.sqlalchemy.SQLAlchemy(app) |
| 20 | |
| 21 | class Details(db.Model): |
| 22 | __tablename__ = "DETAILS" |
| 23 | ID = db.Column(db.Integer, primary_key=True) |
| 24 | PATH = db.Column(db.Text) |
| 25 | SIZE = db.Column(db.Integer) |
| 26 | TIMESTAMP = db.Column(db.Integer) |
| 27 | TITLE = db.Column(db.Text) |
| 28 | DURATION = db.Column(db.Text) |
| 29 | BITRATE = db.Column(db.Integer) |
| 30 | SAMPLERATE = db.Column(db.Integer) |
| 31 | CREATOR = db.Column(db.Text) |
| 32 | ARTIST = db.Column(db.Text) |
| 33 | ALBUM = db.Column(db.Text) |
| 34 | GENRE = db.Column(db.Text) |
| 35 | COMMENT = db.Column(db.Text) |
| 36 | CHANNELS = db.Column(db.Integer) |
| 37 | DISC = db.Column(db.Integer) |
| 38 | TRACK = db.Column(db.Integer) |
| 39 | DATE = db.Column(db.Date) |
| 40 | RESOLUTION = db.Column(db.Text) |
| 41 | THUMBNAIL = db.Column(db.Boolean) |
| 42 | ALBUM_ART = db.Column(db.Integer) |
| 43 | ROTATION = db.Column(db.Integer) |
| 44 | DLNA_PN = db.Column(db.Text) |
| 45 | MIME = db.Column(db.Text) |
| 46 | |
| 47 | import flask.ext.restless |
| 48 | |
| 49 | manager = flask.ext.restless.APIManager(app, flask_sqlalchemy_db=db) |
| 50 | |
| 51 | manager.create_api(Details, methods=['GET'], results_per_page=20) |
| 52 | |
| 53 | app.run(host='0.0.0.0') |
| 54 |