Last active 1531452378

MiniDLNA Python REST API server and associated Tkinter GUI for reading from it https://github.com/blha303/PythonMiniDLNARestAPI

Revision f0e33df131ee9e2f6918c672eefdce2491bc2789

README.md Raw

I made this because I really wanted to be able to search my media server with Python. Please leave questions in the comments below, or email me: https://github.com/blha303

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