tiny-dlna 0.3.0__tar.gz → 0.4.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tiny-dlna
3
- Version: 0.3.0
3
+ Version: 0.4.0
4
4
  Summary: a tiny DLNA receiver
5
5
  Home-page: https://github.com/mitnk/tiny-dlna
6
6
  Author: mitnk
@@ -23,7 +23,7 @@ Usages
23
23
 
24
24
  setup(
25
25
  name='tiny-dlna',
26
- version='0.3.0',
26
+ version='0.4.0',
27
27
  description='a tiny DLNA receiver',
28
28
  long_description=DESC,
29
29
  url='https://github.com/mitnk/tiny-dlna',
@@ -1,24 +1,27 @@
1
+ import datetime
1
2
  import logging
2
3
  import socket
3
4
 
4
5
  SSDP_MULTICAST = '239.255.255.250'
5
6
  SSDP_PORT = 1900
6
- LOCATION = "http://192.168.1.228:5000/description.xml"
7
- USN = 'uuid:dlna-tiny-render-t001::upnp:rootdevice'
7
+ RENDER_PORT = 55000
8
+ LOCATION = f'http://192.168.1.228:{RENDER_PORT}/description.xml'
9
+ UUID = 'd095ee0c-7bed-43d0-bf98-f815496e8383'
10
+ logger = logging.getLogger('ssdp')
8
11
 
9
- ssdp_response = (
10
- 'HTTP/1.1 200 OK\r\n'
11
- 'CACHE-CONTROL: max-age=1800\r\n'
12
- 'EXT:\r\n'
13
- f'LOCATION: {LOCATION}\r\n'
14
- 'HOSTNAME: 192.168.1.228\r\n'
15
- 'SERVER: Custom/1.0 UPnP/1.0 DLNADOC/1.50\r\n'
16
- f'ST: urn:schemas-upnp-org:service:AVTransport:1\r\n'
17
- f'USN: {USN}\r\n'
18
- '\r\n'
19
- )
12
+ def build_m_search_response():
13
+ now = datetime.datetime.utcnow()
14
+ date_str = now.strftime("%a, %d %b %Y %H:%M:%S GMT")
20
15
 
21
- logger = logging.getLogger('ssdp')
16
+ text = 'HTTP/1.1 200 OK\r\n'
17
+ text += f'USN: uuid:{UUID}::urn:schemas-upnp-org:service:AVTransport:1\r\n'
18
+ text += f'Location: {LOCATION}\r\n'
19
+ text += 'ST: urn:schemas-upnp-org:service:AVTransport:1\r\n'
20
+ text += 'EXT: \r\n'
21
+ text += 'Server: Werkzeug/3.0.3 Python/3.11.0\r\n'
22
+ text += 'Cache-Control: max-age=70\r\n'
23
+ text += f'Date: {date_str}\r\n\r\n'
24
+ return text.encode('utf-8')
22
25
 
23
26
  def ssdp_listener():
24
27
  sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
@@ -33,7 +36,7 @@ def ssdp_listener():
33
36
  data, addr = sock.recvfrom(1024)
34
37
  if b'M-SEARCH' in data and b'ssdp:discover' in data:
35
38
  logger.info(f'Received M-SEARCH from {addr}, sending response...')
36
- sock.sendto(ssdp_response.encode('utf-8'), addr)
39
+ sock.sendto(build_m_search_response(), addr)
37
40
 
38
41
  if __name__ == '__main__':
39
42
  ssdp_listener()
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: tiny-dlna
3
- Version: 0.3.0
3
+ Version: 0.4.0
4
4
  Summary: a tiny DLNA receiver
5
5
  Home-page: https://github.com/mitnk/tiny-dlna
6
6
  Author: mitnk
@@ -7,11 +7,38 @@ import time
7
7
  import xml.etree.ElementTree as ET
8
8
 
9
9
  from flask import Flask, request, Response
10
- from ssdp import ssdp_listener
10
+ from ssdp import ssdp_listener, RENDER_PORT, UUID
11
11
 
12
12
  app = Flask(__name__)
13
13
  logger = logging.getLogger('tiny_render')
14
14
 
15
+
16
+ XML_DESC_PTN = """<?xml version="1.0" encoding="UTF-8"?>
17
+ <root xmlns:dlna="urn:schemas-dlna-org:device-1-0" xmlns="urn:schemas-upnp-org:device-1-0">
18
+ <specVersion>
19
+ <major>1</major>
20
+ <minor>0</minor>
21
+ </specVersion>
22
+ <device>
23
+ <deviceType>urn:schemas-upnp-org:device:MediaRenderer:1</deviceType>
24
+ <friendlyName>{}</friendlyName>
25
+ <manufacturer>mitnk</manufacturer>
26
+ <modelName>Tiny-Render</modelName>
27
+ <modelDescription>AVTransport Media Renderer</modelDescription>
28
+ <UDN>uuid:{}</UDN>
29
+ <dlna:X_DLNADOC xmlns:dlna="urn:schemas-dlna-org:device-1-0">DMR-1.50</dlna:X_DLNADOC>
30
+ <serviceList>
31
+ <service>
32
+ <serviceType>urn:schemas-upnp-org:service:AVTransport:1</serviceType>
33
+ <serviceId>urn:upnp-org:serviceId:AVTransport</serviceId>
34
+ <SCPDURL>AVTransport/scpd.xml</SCPDURL>
35
+ <controlURL>AVTransport/control</controlURL>
36
+ <eventSubURL>AVTransport/event</eventSubURL>
37
+ </service>
38
+ </serviceList>
39
+ </device>
40
+ </root>"""
41
+
15
42
  XML_AVSET_DONE = """
16
43
  <s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/" s:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
17
44
  <s:Body>
@@ -95,47 +122,8 @@ _DATA = {
95
122
 
96
123
  @app.route('/description.xml')
97
124
  def description():
98
- desc_ptn = """<?xml version="1.0"?>
99
- <root xmlns="urn:schemas-upnp-org:device-1-0" xmlns:dlna="urn:schemas-dlna-org:device-1-0">
100
- <specVersion>
101
- <major>1</major>
102
- <minor>0</minor>
103
- </specVersion>
104
- <device>
105
- <deviceType>urn:schemas-upnp-org:device:MediaRenderer:1</deviceType>
106
- <friendlyName>{}</friendlyName>
107
- <manufacturer>mitnk</manufacturer>
108
- <modelName>T001</modelName>
109
- <UDN>uuid:dlna-tiny-render-t001</UDN>
110
- <dlna:X_DLNADOC xmlns:dlna="urn:schemas-dlna-org:device-1-0">DMR-1.50</dlna:X_DLNADOC>
111
- <serviceList>
112
- <service>
113
- <serviceType>urn:schemas-upnp-org:service:AVTransport:1</serviceType>
114
- <serviceId>urn:upnp-org:serviceId:AVTransport</serviceId>
115
- <SCPDURL>AVTransport/82d8-eb72-b097/scpd.xml</SCPDURL>
116
- <controlURL>AVTransport/82d8-eb72-b097/control</controlURL>
117
- <eventSubURL>AVTransport/82d8-eb72-b097/event</eventSubURL>
118
- </service>
119
- <service>
120
- <serviceType>urn:schemas-upnp-org:service:ConnectionManager:1</serviceType>
121
- <serviceId>urn:upnp-org:serviceId:ConnectionManager</serviceId>
122
- <SCPDURL>ConnectionManager/82d8-eb72-b097/scpd.xml</SCPDURL>
123
- <controlURL>ConnectionManager/82d8-eb72-b097/control</controlURL>
124
- <eventSubURL>ConnectionManager/82d8-eb72-b097/event</eventSubURL>
125
- </service>
126
- <service>
127
- <serviceType>urn:schemas-upnp-org:service:RenderingControl:1</serviceType>
128
- <serviceId>urn:upnp-org:serviceId:RenderingControl</serviceId>
129
- <SCPDURL>RenderingControl/82d8-eb72-b097/scpd.xml</SCPDURL>
130
- <controlURL>RenderingControl/82d8-eb72-b097/control</controlURL>
131
- <eventSubURL>RenderingControl/82d8-eb72-b097/event</eventSubURL>
132
- </service>
133
- </serviceList>
134
- </device>
135
- </root>"""
136
-
137
125
  friendly_name = app.config['FRIENDLY_NAME']
138
- xml = desc_ptn.format(friendly_name)
126
+ xml = XML_DESC_PTN.format(friendly_name, UUID)
139
127
  return Response(xml, mimetype="text/xml")
140
128
 
141
129
  def to_track_time(seconds):
@@ -202,7 +190,7 @@ def get_metadata(request):
202
190
  }
203
191
 
204
192
 
205
- @app.route('/AVTransport/82d8-eb72-b097/control', methods=['POST'])
193
+ @app.route('/AVTransport/control', methods=['POST'])
206
194
  def control():
207
195
  if is_setav(request):
208
196
  metadata = get_metadata(request)
@@ -288,7 +276,7 @@ def main():
288
276
  friendly_name = args.name
289
277
  app.config['FRIENDLY_NAME'] = friendly_name
290
278
  logging.info(f'Starting DLNA Receiver: {friendly_name}')
291
- app.run(host="0.0.0.0", port=5000, debug=False)
279
+ app.run(host="0.0.0.0", port=RENDER_PORT, debug=False)
292
280
 
293
281
 
294
282
  if __name__ == "__main__":
File without changes
File without changes