From b80b587305674f7b8fe64b735030b63690e82f0a Mon Sep 17 00:00:00 2001 From: sifacaii Date: Wed, 17 May 2023 16:19:15 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=8A=95=E5=B1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sifacai/vlcjellyfin/Dlna/Controller.java | 27 +++ .../vlcjellyfin/Dlna/DlnaActivity.java | 54 +++-- .../sifacai/vlcjellyfin/Dlna/DlnaDevice.java | 13 ++ .../sifacai/vlcjellyfin/Dlna/XmlParser.java | 187 +++++++----------- 4 files changed, 138 insertions(+), 143 deletions(-) diff --git a/app/src/main/java/org/sifacai/vlcjellyfin/Dlna/Controller.java b/app/src/main/java/org/sifacai/vlcjellyfin/Dlna/Controller.java index f8d90b5..f1f0eca 100644 --- a/app/src/main/java/org/sifacai/vlcjellyfin/Dlna/Controller.java +++ b/app/src/main/java/org/sifacai/vlcjellyfin/Dlna/Controller.java @@ -31,6 +31,33 @@ public class Controller { PostXML(controlUrl, xml, headers, cb); } + public static void GetMediaInfo(String controlUrl, JfClient.JJCallBack cb) { + String xml = "" + + "" + + "" + + "" + + "0" + + "" + + ""; + HttpHeaders headers = new HttpHeaders(); + headers.put("SOAPACTION", "\"urn:schemas-upnp-org:service:AVTransport:1#GetMediaInfo\""); + PostXML(controlUrl, xml, headers, cb); + } + + public static void Play(String controlUrl, JfClient.JJCallBack cb) { + String xml = "" + + "" + + "" + + "" + + "0" + + "1" + + "" + + ""; + HttpHeaders headers = new HttpHeaders(); + headers.put("SOAPACTION", "\"urn:schemas-upnp-org:service:AVTransport:1#Play\""); + PostXML(controlUrl, xml, headers, cb); + } + public static void PostXML(String url, String xml, HttpHeaders headers, JfClient.JJCallBack callBack) { OkGo.post(url) .upString(xml) diff --git a/app/src/main/java/org/sifacai/vlcjellyfin/Dlna/DlnaActivity.java b/app/src/main/java/org/sifacai/vlcjellyfin/Dlna/DlnaActivity.java index ff78c5a..9c22fa0 100644 --- a/app/src/main/java/org/sifacai/vlcjellyfin/Dlna/DlnaActivity.java +++ b/app/src/main/java/org/sifacai/vlcjellyfin/Dlna/DlnaActivity.java @@ -1,14 +1,9 @@ package org.sifacai.vlcjellyfin.Dlna; -import androidx.appcompat.app.AppCompatActivity; - -import android.content.Intent; import android.os.Bundle; import android.os.Handler; import android.os.Message; -import android.os.Parcelable; import android.util.Log; -import android.util.Xml; import android.view.View; import com.owen.tvrecyclerview.widget.V7LinearLayoutManager; @@ -17,16 +12,16 @@ import org.sifacai.vlcjellyfin.Component.JRecyclerView; import org.sifacai.vlcjellyfin.R; import org.sifacai.vlcjellyfin.Ui.BaseActivity; import org.sifacai.vlcjellyfin.Utils.JfClient; -import org.xmlpull.v1.XmlPullParser; +import org.xml.sax.SAXException; import org.xmlpull.v1.XmlPullParserException; import java.io.IOException; -import java.io.StringReader; import java.net.DatagramPacket; import java.net.InetAddress; import java.net.MulticastSocket; import java.util.HashMap; -import java.util.List; + +import javax.xml.parsers.ParserConfigurationException; public class DlnaActivity extends BaseActivity { private String TAG = "Dlna播放器"; @@ -108,13 +103,23 @@ public class DlnaActivity extends BaseActivity { Controller.SetAVTransportURI(avTransport.controlURL, vurl, new JfClient.JJCallBack() { @Override public void onSuccess(String str) { - Log.d(TAG, "onSuccess: " + str); - ShowToask(str); + Controller.GetMediaInfo(avTransport.controlURL,new JfClient.JJCallBack(){ + @Override + public void onSuccess(String str) { + Controller.Play(avTransport.controlURL,null); + } + + @Override + public void onError(String str) { + Log.d(TAG, "onError: GetMediaInfo:" + str); + } + }); + //ShowToask(str); } @Override public void onError(String str) { - Log.d(TAG, "onError: " + str); + Log.d(TAG, "onError: SetAVTransportURI" + str); ShowToask(str); } }); @@ -187,20 +192,11 @@ public class DlnaActivity extends BaseActivity { }; public void ProgressNOTIFY(String data) throws IOException, XmlPullParserException { - String[] notify = data.split("\n"); - boolean isav = false; - String location = ""; - for (String n : notify) { - String[] ns = n.split(":", 2); - if (ns.length < 2) continue; - else if (ns[0].equals("Location")) location = ns[1]; - else if (ns[0].equals("NT")) { - String nsnt = ns[1].trim(); - if (DlnaDevice.isMediaRenderer(nsnt)) { - isav = true; - } - } - } + if(data.startsWith("M-SEARCH")) return; + HashMap dh = DlnaDevice.parseNOTIFY(data); + boolean isav = DlnaDevice.isMediaRenderer(dh.get("NT")); + String location = dh.get("Location"); + if(location == null) location = ""; if (isav && !location.equals("")) { String finalLocation = location; JfClient.SendGet(location, new JfClient.JJCallBack() { @@ -220,7 +216,7 @@ public class DlnaActivity extends BaseActivity { public void findDevice(String location, String xml) { DlnaDevice device; try { - device = XmlParser.ParseXML2(xml); + device = XmlParser.parseX(xml); for (int i = 0; i < device.DlnaServices.size(); i++) { DlnaService ds = device.DlnaServices.get(i); if (ds.serviceType.indexOf("service:AVTransport") > -1) { @@ -240,10 +236,12 @@ public class DlnaActivity extends BaseActivity { handler.sendMessage(msg); } } - } catch (XmlPullParserException e) { - throw new RuntimeException(e); } catch (IOException e) { throw new RuntimeException(e); + } catch (ParserConfigurationException e) { + throw new RuntimeException(e); + } catch (SAXException e) { + throw new RuntimeException(e); } } } \ No newline at end of file diff --git a/app/src/main/java/org/sifacai/vlcjellyfin/Dlna/DlnaDevice.java b/app/src/main/java/org/sifacai/vlcjellyfin/Dlna/DlnaDevice.java index 95f62d6..2479355 100644 --- a/app/src/main/java/org/sifacai/vlcjellyfin/Dlna/DlnaDevice.java +++ b/app/src/main/java/org/sifacai/vlcjellyfin/Dlna/DlnaDevice.java @@ -1,6 +1,7 @@ package org.sifacai.vlcjellyfin.Dlna; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; public class DlnaDevice { @@ -14,8 +15,20 @@ public class DlnaDevice { public String[] MediaRendererDesc = {"upnp:rootdevice","device:MediaRenderer"}; public static boolean isMediaRenderer(String nt){ + if(nt == null) return false; if(nt.equals("upnp:rootdevice")) return true; if(nt.indexOf("device:MediaRenderer") >= 0) return true; return false; } + + public static HashMap parseNOTIFY(String data){ + HashMap hm = new HashMap<>(); + String[] notify = data.split("\n"); + for (String n:notify) { + String[] ns = n.split(":", 2); + if (ns.length < 2) continue; + hm.put(ns[0],ns[1].trim()); + } + return hm; + } } diff --git a/app/src/main/java/org/sifacai/vlcjellyfin/Dlna/XmlParser.java b/app/src/main/java/org/sifacai/vlcjellyfin/Dlna/XmlParser.java index 2c0b8ac..c2ad542 100644 --- a/app/src/main/java/org/sifacai/vlcjellyfin/Dlna/XmlParser.java +++ b/app/src/main/java/org/sifacai/vlcjellyfin/Dlna/XmlParser.java @@ -1,132 +1,25 @@ package org.sifacai.vlcjellyfin.Dlna; import android.util.Log; -import android.util.Xml; +import org.w3c.dom.Document; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; +import java.io.ByteArrayInputStream; import java.io.IOException; -import java.io.StringReader; import java.util.HashMap; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; public class XmlParser { private static String TAG = "XML解析器"; - public static void readServiceValue(XmlPullParser parser, DlnaService service, String tagName) throws XmlPullParserException, IOException { - String value = parser.nextText(); - if (tagName.equals("servicetype")) service.serviceType = value; - if (tagName.equals("serviceid")) service.serviceId = value; - if (tagName.equals("controlurl")) service.controlURL = value; - if (tagName.equals("scpdurl")) service.SCPDURL = value; - if (tagName.equals("eventsuburl")) service.eventSubURL = value; - } - - public static DlnaService readService(XmlPullParser parser) throws XmlPullParserException, IOException { - DlnaService ds = new DlnaService(); - String tagName = ""; - int eventType = parser.next(); - while (!tagName.equals("service") && eventType != XmlPullParser.END_DOCUMENT) { - tagName = parser.getName(); - if (tagName == null) tagName = ""; - if (eventType == XmlPullParser.START_TAG) { - tagName = tagName.toLowerCase(); - readServiceValue(parser, ds, tagName); - } - eventType = parser.next(); - } - return ds; - } - - public static void readDevice(XmlPullParser parser, DlnaDevice de, String tagName) throws XmlPullParserException, IOException { - int et = parser.next(); - if(et == XmlPullParser.END_TAG) return; - String value = parser.getText(); - value = value == null ? "" : value.trim(); - if (tagName.equals("friendlyname")) de.friendlyName = value; - if (tagName.equals("devicetype")) de.deviceType = value; - if (tagName.equals("modelname")) de.modelName = value; - if (tagName.equals("udn")) de.UDN = value; - } - - public static DlnaDevice ParseXML2(String xml) throws XmlPullParserException, IOException { - XmlPullParser xmlPullParser = Xml.newPullParser(); - xmlPullParser.setInput(new StringReader(xml)); - - DlnaDevice device = new DlnaDevice(); - - int eventType = xmlPullParser.getEventType(); - String tagName = ""; - while (eventType != XmlPullParser.END_DOCUMENT) { - if (eventType == XmlPullParser.START_TAG) { - tagName = xmlPullParser.getName().toLowerCase(); - if (tagName.equals("service")) { - DlnaService service = readService(xmlPullParser); - device.DlnaServices.add(service); - } else { - readDevice(xmlPullParser, device, tagName); - } - } - eventType = xmlPullParser.next(); - } - return device; - } - - public static DlnaDevice ParseXML(String xml) throws XmlPullParserException, IOException { - XmlPullParser xmlPullParser = Xml.newPullParser(); - xmlPullParser.setInput(new StringReader(xml)); - - DlnaDevice device = new DlnaDevice(); - - int eventType = xmlPullParser.getEventType(); - String tagName = ""; - DlnaService service = null; - String icon = ""; - while (eventType != XmlPullParser.END_DOCUMENT) { - String value = ""; - switch (eventType) { - case XmlPullParser.START_TAG: - tagName = xmlPullParser.getName().toLowerCase(); - Log.d(TAG, "ParseXML: tagName:" + tagName); - if (tagName.equals("service")) service = new DlnaService(); - if (tagName.equals("icon")) icon = ""; - break; - case XmlPullParser.TEXT: - - break; - case XmlPullParser.END_TAG: - value = xmlPullParser.getText(); - value = value == null ? "" : value.trim(); - Log.d(TAG, "ParseXML: tagName:" + tagName + " value:" + value); - if (tagName.equals("friendlyname")) { - device.friendlyName = value; - //Log.d(TAG, "ParseXML: friendlyname" + value); - } - if (tagName.equals("devicetype")) device.deviceType = value; - if (tagName.equals("modelname")) device.modelName = value; - if (tagName.equals("udn")) device.UDN = value; - - if (tagName.equals("url")) icon = value; - - if (tagName.equals("servicetype")) service.serviceType = value; - if (tagName.equals("serviceid")) service.serviceId = value; - if (tagName.equals("controlurl")) service.controlURL = value; - if (tagName.equals("scpdurl")) service.SCPDURL = value; - if (tagName.equals("eventsuburl")) service.eventSubURL = value; - - String endTag = xmlPullParser.getName().toLowerCase(); - Log.d(TAG, "ParseXML: endTag:" + endTag); - if (endTag.equals("service")) - device.DlnaServices.add(service); - if (endTag.equals("icon")) device.icon.add(icon); - break; - } - eventType = xmlPullParser.next(); - } - return device; - } - private String getRspXML(String action, HashMap map) { String rsp = "" + " 0 ? nl.item(0).getTextContent() : ""; + nl = doc.getElementsByTagName("modelName"); + dd.modelName = nl.getLength() > 0 ? nl.item(0).getTextContent() : ""; + nl = doc.getElementsByTagName("UDN"); + dd.UDN = nl.getLength() > 0 ? nl.item(0).getTextContent() : ""; + nl = doc.getElementsByTagName("deviceType"); + dd.deviceType = nl.getLength() > 0 ? nl.item(0).getTextContent() : ""; + + + nl = doc.getElementsByTagName("service"); + for (int i = 0; i < nl.getLength(); i++) { + NodeList ns = nl.item(i).getChildNodes(); + DlnaService ds = new DlnaService(); + dd.DlnaServices.add(ds); + for (int j = 0; j < ns.getLength(); j++) { + Node nd = ns.item(j); + switch (nd.getNodeName()){ + case "serviceType": + ds.serviceType = nd.getTextContent(); + break; + case "serviceId": + ds.serviceId = nd.getTextContent(); + break; + case "controlURL": + ds.controlURL = nd.getTextContent(); + break; + case "eventSubURL": + ds.eventSubURL = nd.getTextContent(); + break; + case "SCPDURL": + ds.SCPDURL = nd.getTextContent(); + break; + } + } + } + return dd; + } }