@edenware/dlnacasts 1.0.1 → 1.0.2
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.
- package/dist/index.cjs +222 -198
- package/dist/index.cjs.map +1 -0
- package/dist/index.mjs +216 -191
- package/dist/index.mjs.map +1 -0
- package/package.json +9 -4
- package/dist/index.js +0 -393
- package/dist/src/index.cjs +0 -373
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../src/index.js"],"sourcesContent":["import MediaRenderer from 'upnp-mediarenderer-client'\r\nimport events from 'events'\r\nimport parallel from 'run-parallel'\r\nimport { parseString } from 'xml2js'\r\nimport { Client as SSDP } from '@edenware/ssdp'\r\nimport { isIP } from 'node:net'\r\nimport http from 'node:http'\r\nimport os from 'os'\r\nimport thunky from 'thunky'\r\n\r\nconst noop = () => {}\r\n\r\nexport default (options = {}) => {\r\n const SERVICE_TYPE = 'urn:schemas-upnp-org:device:MediaRenderer:1';\r\n const agent = new http.Agent({ keepAlive: true, maxSockets: 5 });\r\n const log = options.log ? console.debug : () => {}\r\n\r\n // Find local IP - prefer Wi-Fi/Ethernet\r\n const interfaces = os.networkInterfaces()\r\n log('[DLNACASTS] Network interfaces:', interfaces)\r\n let localIP = null // fallback\r\n let localInterface = null\r\n // First pass: prefer Wi-Fi or Ethernet\r\n for (const name of Object.keys(interfaces)) {\r\n if (name.includes('Wi-Fi') || name.includes('Ethernet') || name.includes('eth') || name.includes('en') || name.includes('wlan')) {\r\n for (const iface of interfaces[name]) {\r\n if (iface.family === 'IPv4' && !iface.internal) {\r\n localIP = iface.address\r\n localInterface = name\r\n log('[DLNACASTS] Using preferred interface:', name, localIP)\r\n break\r\n }\r\n }\r\n if (localIP) break\r\n }\r\n }\r\n // Second pass: any IPv4 if no preferred found\r\n if (!localIP) {\r\n for (const name of Object.keys(interfaces)) {\r\n for (const iface of interfaces[name]) {\r\n if (iface.family === 'IPv4' && !iface.internal) {\r\n localIP = iface.address\r\n localInterface = name\r\n log('[DLNACASTS] Using fallback interface:', name, localIP)\r\n break\r\n }\r\n }\r\n if (localIP) break\r\n }\r\n }\r\n if (!localIP) localIP = '127.0.0.1' // ultimate fallback\r\n log('Local IP:', localIP)\r\n\r\n const that = new events.EventEmitter()\r\n const casts = {}\r\n const ssdp = SSDP ? new SSDP({\r\n log: true,\r\n interfaces: [localInterface],\r\n explicitSocketBind: true\r\n }) : null\r\n\r\n log('[DLNACASTS] SSDP client created:', !!ssdp)\r\n\r\n that.players = []\r\n\r\n const emit = (cst) => {\r\n if (!cst || !cst.host || cst.emitted) return\r\n cst.emitted = true\r\n\r\n const player = new events.EventEmitter()\r\n let getStatus = undefined\r\n let stopped = false // Flag para rastrear se stop foi chamado\r\n let playFailed = false // Flag para rastrear se play falhou\r\n\r\n const connect = thunky(function reconnect (cb) {\r\n const client = new MediaRenderer(player.xml)\r\n\r\n client.on('error', (err) => {\r\n log('[DLNACASTS] Client error, clearing player.client:', err)\r\n try { clearInterval(getStatus) } catch(e) {}\r\n player.client = undefined\r\n player.emit('error', err)\r\n })\r\n\r\n client.on('loading', (err) => {\r\n player.emit('loading', err)\r\n })\r\n\r\n client.on('close', () => {\r\n log('[DLNACASTS] Client closed, clearing player.client')\r\n try { clearInterval(getStatus) } catch(e) {}\r\n player.client = undefined\r\n connect = thunky(reconnect) // Reset thunky para permitir nova reconexão\r\n })\r\n\r\n player.client = client\r\n cb(null, player.client)\r\n })\r\n\r\n const parseTime = (time) => {\r\n if (!time || time.indexOf(':') === -1) return 0\r\n const parts = time.split(':').map(Number)\r\n return parts[0] * 3600 + parts[1] * 60 + parts[2]\r\n }\r\n\r\n player.name = cst.name\r\n player.host = cst.host\r\n player.xml = cst.xml\r\n player._status = {}\r\n player.MAX_VOLUME = 100\r\n\r\n player.connect = connect\r\n\r\n player.close = (cb = noop) => {\r\n log('[DLNACASTS] Closing player, clearing player.client')\r\n try { clearInterval(getStatus) } catch(e) {}\r\n if (player.client) {\r\n for (let e of [\"error\", \"status\", \"loading\", \"close\"]) {\r\n player.client.removeAllListeners(e)\r\n }\r\n player.client = undefined\r\n }\r\n stopped = true // Marcar que stop foi chamado\r\n cb()\r\n }\r\n\r\n player.play = (url, opts, cb = noop) => {\r\n if (typeof opts === 'function') return player.play(url, null, opts)\r\n if (!opts) opts = {}\r\n if (!url) return player.resume(cb)\r\n \r\n stopped = false // Resetar stopped ao chamar play\r\n playFailed = false // Resetar playFailed ao chamar play\r\n player.subtitles = opts.subtitles\r\n\r\n connect((err, p) => {\r\n if (err) {\r\n log('[DLNACASTS] Connect failed in play:', err)\r\n playFailed = true // Marcar que play falhou\r\n return cb(err)\r\n }\r\n\r\n try { clearInterval(getStatus) } catch(e) {}\r\n\r\n const media = {\r\n autoplay: opts.autoPlay !== false,\r\n contentType: opts.type || 'video/mp4',\r\n metadata: opts.metadata || {\r\n title: opts.title || '',\r\n type: 'video', // can be 'video', 'audio' or 'image'\r\n subtitlesUrl: player.subtitles && player.subtitles.length ? player.subtitles[0] : null\r\n }\r\n }\r\n if (opts.dlnaFeatures) {\r\n media.dlnaFeatures = opts.dlnaFeatures || 'DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01500000000000000000000000000000'\r\n //media.dlnaFeatures = opts.dlnaFeatures; // for LG WebOS 'DLNA.ORG_OP=01;DLNA.ORG_FLAGS=01100000000000000000000000000000' allows seeking\r\n }\r\n\r\n let callback = cb\r\n if (opts.seek) {\r\n callback = (err) => {\r\n if (err) {\r\n playFailed = true // Marcar que play falhou\r\n return cb(err)\r\n }\r\n player.seek(opts.seek, cb)\r\n }\r\n }\r\n\r\n getStatus = setInterval(() => {\r\n if (stopped || playFailed) {\r\n log('[DLNACASTS] Skipping getStatus: stopped=%s, playFailed=%s', stopped, playFailed)\r\n return\r\n }\r\n if (!player.client) {\r\n log('[DLNACASTS] player.client is undefined in getStatus, attempting to reconnect')\r\n connect((err) => {\r\n if (err) {\r\n log('[DLNACASTS] Reconnect failed in getStatus:', err)\r\n playFailed = true // Marcar falha se reconexão falhar\r\n return\r\n }\r\n log('[DLNACASTS] Reconnected successfully in getStatus')\r\n player.client.callAction('AVTransport', 'GetTransportInfo', {\r\n InstanceID: player.client.instanceId\r\n }, (err, res) => {\r\n if (err) return\r\n const newStatus = res.CurrentTransportState\r\n if (newStatus !== player._status.playerState) {\r\n player._status.playerState = newStatus\r\n player.status((err, status) => {\r\n if (err) return\r\n player.emit('status', status)\r\n })\r\n }\r\n })\r\n })\r\n return\r\n }\r\n player.client.callAction('AVTransport', 'GetTransportInfo', {\r\n InstanceID: player.client.instanceId\r\n }, (err, res) => {\r\n if (err) return\r\n const newStatus = res.CurrentTransportState\r\n if (newStatus !== player._status.playerState) {\r\n player._status.playerState = newStatus\r\n player.status((err, status) => {\r\n if (err) return\r\n player.emit('status', status)\r\n })\r\n }\r\n })\r\n }, 1000)\r\n\r\n p.load(url, media, callback)\r\n })\r\n }\r\n\r\n player.resume = (cb = noop) => {\r\n player.client.play(cb)\r\n }\r\n\r\n player.pause = (cb = noop) => {\r\n player.client.pause(cb)\r\n }\r\n\r\n player.stop = (cb = noop) => {\r\n try { clearInterval(getStatus) } catch(e) {}\r\n stopped = true // Marcar que stop foi chamado\r\n player.client.stop(cb)\r\n }\r\n\r\n player.status = (cb = noop) => {\r\n if (stopped || playFailed) {\r\n log('[DLNACASTS] Skipping status: stopped=%s, playFailed=%s', stopped, playFailed)\r\n return cb(null, player._status)\r\n }\r\n if (!player.client) {\r\n log('[DLNACASTS] player.client is undefined in status, attempting to reconnect')\r\n connect((err) => {\r\n if (err) {\r\n log('[DLNACASTS] Reconnect failed in status:', err)\r\n playFailed = true // Marcar falha se reconexão falhar\r\n return cb(err)\r\n }\r\n log('[DLNACASTS] Reconnected successfully in status')\r\n parallel({\r\n currentTime: (acb) => {\r\n player.client.callAction('AVTransport', 'GetPositionInfo', {\r\n InstanceID: player.client.instanceId\r\n }, (err, res) => {\r\n if (err) return acb()\r\n acb(null, parseTime(res.AbsTime) | parseTime(res.RelTime))\r\n })\r\n },\r\n volume: (acb) => {\r\n player.getVolume(acb)\r\n }\r\n }, (err, results) => {\r\n log('dlnacasts player.status results: %o', results)\r\n player._status.currentTime = results.currentTime\r\n player._status.volume = { level: results.volume / player.MAX_VOLUME }\r\n return cb(err, player._status)\r\n })\r\n })\r\n return\r\n }\r\n\r\n parallel({\r\n currentTime: (acb) => {\r\n player.client.callAction('AVTransport', 'GetPositionInfo', {\r\n InstanceID: player.client.instanceId\r\n }, (err, res) => {\r\n if (err) return acb()\r\n acb(null, parseTime(res.AbsTime) | parseTime(res.RelTime))\r\n })\r\n },\r\n volume: (acb) => {\r\n player.getVolume(acb)\r\n }\r\n }, (err, results) => {\r\n log('dlnacasts player.status results: %o', results)\r\n player._status.currentTime = results.currentTime\r\n player._status.volume = { level: results.volume / player.MAX_VOLUME }\r\n return cb(err, player._status)\r\n })\r\n }\r\n\r\n player.getVolume = (cb) => {\r\n player.client.callAction('RenderingControl', 'GetVolume', {\r\n InstanceID: player.client.instanceId,\r\n Channel: 'Master'\r\n }, (err, res) => {\r\n if (err) return cb()\r\n cb(null, res.CurrentVolume ? parseInt(res.CurrentVolume) : 0)\r\n })\r\n }\r\n\r\n player.setVolume = (vol, cb = noop) => {\r\n player.client.callAction('RenderingControl', 'SetVolume', {\r\n InstanceID: player.client.instanceId,\r\n Channel: 'Master',\r\n DesiredVolume: vol\r\n }, cb)\r\n }\r\n\r\n player.request = (target, action, data, cb = noop) => {\r\n if (data.InstanceID === null) {\r\n data.InstanceID = player.client.instanceId\r\n }\r\n player.client.callAction(target, action, data, cb)\r\n }\r\n\r\n player.seek = (time, cb = noop) => {\r\n player.client.seek(time, cb)\r\n }\r\n\r\n that.players.push(player)\r\n that.emit('update', player)\r\n }\r\n\r\n if (ssdp) {\r\n // Response handler moved to update()\r\n }\r\n\r\n that.validate = (name, host, xml) => {\r\n if (!casts[name]) {\r\n http.get(xml, { agent }, res => {\r\n const {statusCode} = res\r\n if (statusCode == 200) {\r\n if (!casts[name]) {\r\n casts[name] = {name, host, xml}\r\n emit(casts[name])\r\n } else if (isIP(casts[name].host) != 4 && isIP(host) == 4) {\r\n casts[name].host = host\r\n casts[name].xml = xml\r\n emit(casts[name])\r\n }\r\n }\r\n res.resume()\r\n }).on('error', e => {})\r\n }\r\n }\r\n\r\n that.update = () => {\r\n log('[DLNACASTS] querying ssdp')\r\n if (ssdp) {\r\n const tasks = []\r\n const responseHandler = (headers, statusCode, info) => {\r\n log('[DLNACASTS] SSDP response received:', headers.ST || 'no ST', 'from', info.address, 'LOCATION:', headers.LOCATION || 'no LOCATION')\r\n if (!headers.LOCATION) return\r\n if (headers.ST !== SERVICE_TYPE) return\r\n\r\n tasks.push((cb) => {\r\n http.get(headers.LOCATION, { agent }, (res) => {\r\n if (res.statusCode !== 200) return cb()\r\n let body = ''\r\n res.on('data', (chunk) => { body += chunk })\r\n res.on('end', () => {\r\n parseString(body, {explicitArray: false, explicitRoot: false},\r\n (err, service) => {\r\n if (err) return cb()\r\n if (!service.device) return cb()\r\n\r\n log('[DLNACASTS] ssdp device:', service.device)\r\n\r\n const name = service.device.friendlyName\r\n\r\n if (!name) return cb()\r\n\r\n const host = info.address\r\n const xml = headers.LOCATION\r\n\r\n if (!casts[name]) {\r\n casts[name] = {name: name, host: host, xml: xml}\r\n emit(casts[name])\r\n } else if (casts[name] && !casts[name].host) {\r\n casts[name].host = host\r\n casts[name].xml = xml\r\n emit(casts[name])\r\n }\r\n cb()\r\n })\r\n })\r\n }).on('error', () => cb())\r\n })\r\n }\r\n ssdp.on('response', responseHandler)\r\n ssdp.search(SERVICE_TYPE)\r\n log('[DLNACASTS] SSDP search started for:', SERVICE_TYPE)\r\n setTimeout(() => {\r\n ssdp.removeListener('response', responseHandler)\r\n parallel(tasks, () => {})\r\n }, 10000)\r\n }\r\n }\r\n\r\n that.on('removeListener', () => {\r\n if (ssdp && that.listenerCount('update') === 0) {\r\n ssdp.stop()\r\n }\r\n })\r\n\r\n that.destroy = () => {\r\n log('[DLNACASTS] destroying ssdp...')\r\n if (ssdp) {\r\n ssdp.stop()\r\n }\r\n }\r\n\r\n that.close = () => {\r\n that.removeAllListeners('update')\r\n }\r\n\r\n return that\r\n}\r\n"],"names":["ssdp","SSDP","isIP","parseString"],"mappings":"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"}
|