From 7b64bf5062f3eb6ddff5d7606e44367bd5077e4c Mon Sep 17 00:00:00 2001 From: chriszero Date: Tue, 15 Dec 2015 22:15:35 +0100 Subject: Added SSL support, started support for remote resources (servers). Browsing remote servers is working. plex.tv login is mandatory. --- hlsPlayer.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) (limited to 'hlsPlayer.cpp') diff --git a/hlsPlayer.cpp b/hlsPlayer.cpp index 5b650e3..70ce3fa 100644 --- a/hlsPlayer.cpp +++ b/hlsPlayer.cpp @@ -581,7 +581,6 @@ bool cHlsPlayer::GetIndex(int& Current, int& Total, bool SnapToIFrame __attribut Total = m_pSegmentLoader->GetStreamLenght() * FramesPerSecond(); } Current = GetPlayedSeconds() * FramesPerSecond(); - std::cout << "FPS: " << FramesPerSecond() << "STC: " << this->DeviceGetSTC() << std::endl; return true; } @@ -667,7 +666,7 @@ void cHlsPlayer::SetAudioTrack(eTrackType Type __attribute__((unused)), const tT } // Then do the request if(streamId > 0) { - Poco::Net::HTTPClientSession session(m_Video.m_pServer->GetIpAdress(), m_Video.m_pServer->GetPort()); + Poco::Net::HTTPClientSession session(m_Video.m_pServer->GetHost(), m_Video.m_pServer->GetPort()); std::string uri = "/library/parts/" + std::string(itoa(m_Video.m_Media.m_iPartId)) + "?audioStreamID=" + std::string(itoa(streamId)); Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_PUT, uri); @@ -719,7 +718,7 @@ void cHlsPlayer::ReportProgress(bool stopped) } try { - Poco::Net::HTTPClientSession session(m_Video.m_pServer->GetIpAdress(), m_Video.m_pServer->GetPort()); + Poco::Net::HTTPClientSession session(m_Video.m_pServer->GetHost(), m_Video.m_pServer->GetPort()); std::string uri = "/:/progress?key=" + std::string(itoa(m_Video.m_iRatingKey)) + "&identifier=com.plexapp.plugins.library&time=" + std::string(itoa(GetPlayedSeconds()*1000)) + "&state=" + state; Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_GET, uri); session.sendRequest(req); @@ -736,7 +735,7 @@ void cHlsPlayer::ReportProgress(bool stopped) void cHlsPlayer::SetWatched(void) { - Poco::Net::HTTPClientSession session(m_Video.m_pServer->GetIpAdress(), m_Video.m_pServer->GetPort()); + Poco::Net::HTTPClientSession session(m_Video.m_pServer->GetHost(), m_Video.m_pServer->GetPort()); std::string uri = "/:/scrobble?key=" + std::string(itoa(m_Video.m_iRatingKey)) + "&identifier=com.plexapp.plugins.library"; Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_GET, uri); session.sendRequest(req); -- cgit v1.2.3 From 1d624e296ee8b6a13abf0a4012a5e07b2354970e Mon Sep 17 00:00:00 2001 From: chriszero Date: Wed, 16 Dec 2015 21:02:47 +0100 Subject: Early remote server playback. Please test. --- hlsPlayer.cpp | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) (limited to 'hlsPlayer.cpp') diff --git a/hlsPlayer.cpp b/hlsPlayer.cpp index 70ce3fa..1baa75a 100644 --- a/hlsPlayer.cpp +++ b/hlsPlayer.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -10,6 +11,7 @@ #include #include "Plexservice.h" +#include "plexgdm.h" #include "XmlObject.h" #include "Media.h" #include "Stream.h" @@ -137,6 +139,7 @@ bool cHlsSegmentLoader::LoadIndexList(void) if(responseStart.getStatus() != 200) { esyslog("[plex]%s Response Not Valid", __FUNCTION__); + Poco::StreamCopier::copyStream(indexFile, std::cout); return res; } m_indexParser = cM3u8Parser(); @@ -175,6 +178,7 @@ bool cHlsSegmentLoader::LoadStartList(void) bool res = false; ConnectToServer(); try { + dsyslog("[plex]%s %s", __FUNCTION__, m_startUri.toString().c_str()); Poco::Net::HTTPRequest request(Poco::Net::HTTPRequest::HTTP_GET, m_startUri.getPathAndQuery()); AddHeader(request); m_pClientSession->sendRequest(request); @@ -184,6 +188,7 @@ bool cHlsSegmentLoader::LoadStartList(void) if(responseStart.getStatus() != 200) { esyslog("[plex]%s Response Not Valid", __FUNCTION__); + Poco::StreamCopier::copyStream(startFile, std::cout); return res; } @@ -295,8 +300,14 @@ void cHlsSegmentLoader::CloseConnection(void) bool cHlsSegmentLoader::ConnectToServer(void) { dsyslog("[plex]%s", __FUNCTION__); - if(!m_pClientSession) - m_pClientSession = new Poco::Net::HTTPClientSession(m_startUri.getHost(), m_startUri.getPort()); + if(!m_pClientSession) { + if(m_startUri.getScheme().find("https") != std::string::npos) { + m_pClientSession = new Poco::Net::HTTPSClientSession(m_startUri.getHost(), m_startUri.getPort()); + } + else { + m_pClientSession = new Poco::Net::HTTPClientSession(m_startUri.getHost(), m_startUri.getPort()); + } + } return m_pClientSession->connected(); } -- cgit v1.2.3 From 516d7da6bf79c8e48d5348706faeba8ea5061984 Mon Sep 17 00:00:00 2001 From: chriszero Date: Sat, 19 Dec 2015 21:55:26 +0100 Subject: Starting to redesign server communication. --- hlsPlayer.cpp | 26 ++++++++------------------ 1 file changed, 8 insertions(+), 18 deletions(-) (limited to 'hlsPlayer.cpp') diff --git a/hlsPlayer.cpp b/hlsPlayer.cpp index 1baa75a..f23db0c 100644 --- a/hlsPlayer.cpp +++ b/hlsPlayer.cpp @@ -20,8 +20,9 @@ static cMutex hlsMutex; //--- cHlsSegmentLoader -cHlsSegmentLoader::cHlsSegmentLoader(std::string startm3u8) +cHlsSegmentLoader::cHlsSegmentLoader(std::string startm3u8, plexclient::Video* pVideo) { + m_pVideo = pVideo; m_newList = false; m_bufferFilled = false; m_lastLoadedSegment = 0; @@ -449,7 +450,6 @@ int cHlsSegmentLoader::GetStreamLenght() cHlsPlayer::cHlsPlayer(std::string startm3u8, plexclient::Video Video, int offset) { dsyslog("[plex]: '%s'", __FUNCTION__); - m_pSegmentLoader = new cHlsSegmentLoader(startm3u8); m_Video = Video; m_timeOffset = offset; m_jumpOffset = 0; @@ -458,8 +458,9 @@ cHlsPlayer::cHlsPlayer(std::string startm3u8, plexclient::Video Video, int offse m_isBuffering = false; AudioIndexOffset = 1000; // Just a magic number m_tTimer.Set(1); + m_pSegmentLoader = new cHlsSegmentLoader(startm3u8, &m_Video); + m_pDebugFile = NULL; - //m_pDebugFile = new std::ofstream(); //m_pDebugFile->open("debug.ts", std::ios::out); } @@ -677,15 +678,10 @@ void cHlsPlayer::SetAudioTrack(eTrackType Type __attribute__((unused)), const tT } // Then do the request if(streamId > 0) { - Poco::Net::HTTPClientSession session(m_Video.m_pServer->GetHost(), m_Video.m_pServer->GetPort()); - std::string uri = "/library/parts/" + std::string(itoa(m_Video.m_Media.m_iPartId)) + "?audioStreamID=" + std::string(itoa(streamId)); - Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_PUT, uri); - session.sendRequest(req); Poco::Net::HTTPResponse resp; - session.receiveResponse(resp); - + m_Video.m_pServer->MakeRequest(resp, uri); if(resp.getStatus() == 200) { DeviceSetCurrentAudioTrack(eTrackType(ttDolby + 0)); // hacky DeviceSetAvailableTrack(ttDolby, 0, 0, TrackId->language); @@ -729,13 +725,10 @@ void cHlsPlayer::ReportProgress(bool stopped) } try { - Poco::Net::HTTPClientSession session(m_Video.m_pServer->GetHost(), m_Video.m_pServer->GetPort()); std::string uri = "/:/progress?key=" + std::string(itoa(m_Video.m_iRatingKey)) + "&identifier=com.plexapp.plugins.library&time=" + std::string(itoa(GetPlayedSeconds()*1000)) + "&state=" + state; - Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_GET, uri); - session.sendRequest(req); Poco::Net::HTTPResponse resp; - session.receiveResponse(resp); + m_Video.m_pServer->MakeRequest(resp, uri); if(resp.getStatus() == 200) { dsyslog("[plex] %s", __FUNCTION__); @@ -746,14 +739,11 @@ void cHlsPlayer::ReportProgress(bool stopped) void cHlsPlayer::SetWatched(void) { - Poco::Net::HTTPClientSession session(m_Video.m_pServer->GetHost(), m_Video.m_pServer->GetPort()); std::string uri = "/:/scrobble?key=" + std::string(itoa(m_Video.m_iRatingKey)) + "&identifier=com.plexapp.plugins.library"; - Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_GET, uri); - session.sendRequest(req); Poco::Net::HTTPResponse resp; - session.receiveResponse(resp); - + m_Video.m_pServer->MakeRequest(resp, uri); + if(resp.getStatus() == 200) { dsyslog("[plex] %s", __FUNCTION__); } -- cgit v1.2.3 From 4775c62bf44ba6d757722611313f53d6dd2a0b56 Mon Sep 17 00:00:00 2001 From: chriszero Date: Sun, 20 Dec 2015 18:43:35 +0100 Subject: completed "secure connections" and "remote server" support. --- hlsPlayer.cpp | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) (limited to 'hlsPlayer.cpp') diff --git a/hlsPlayer.cpp b/hlsPlayer.cpp index f23db0c..60bc7aa 100644 --- a/hlsPlayer.cpp +++ b/hlsPlayer.cpp @@ -77,7 +77,7 @@ void cHlsSegmentLoader::Action(void) m_ringBufferSize = MEGABYTE(estSize*m_segmentsToBuffer); isyslog("[plex]%s Create Ringbuffer %d MB", __FUNCTION__, estSize*m_segmentsToBuffer); - + m_pRingbuffer = new cRingBufferLinear(m_ringBufferSize, 2*TS_SIZE); while(Running()) { @@ -238,7 +238,7 @@ bool cHlsSegmentLoader::LoadSegment(std::string segmentUri) } Poco::Net::HTTPResponse segmentResponse; std::istream& segmentFile = m_pClientSession->receiveResponse(segmentResponse); - + if(segmentResponse.getStatus() != 200) { // error esyslog("[plex] %s; %s failed.", __FUNCTION__, segmentUri.c_str()); @@ -246,8 +246,7 @@ bool cHlsSegmentLoader::LoadSegment(std::string segmentUri) } dsyslog("[plex] %s: %s successfully.", __FUNCTION__, segmentUri.c_str()); - // copy response - + // copy response int m = 0; segmentFile.read(reinterpret_cast(m_pBuffer), sizeof(m_pBuffer)); std::streamsize n = segmentFile.gcount(); @@ -336,10 +335,8 @@ bool cHlsSegmentLoader::DoLoad(void) recover = true; std::string stopUri = "/video/:/transcode/universal/stop?session=" + m_sessionCookie; try { - Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_GET, stopUri); - m_pClientSession->sendRequest(req); Poco::Net::HTTPResponse reqResponse; - m_pClientSession->receiveResponse(reqResponse); + m_pVideo->m_pServer->MakeRequest(reqResponse, stopUri); int tmp = m_lastLoadedSegment; int tmp2 = m_lastSegmentSize; CloseConnection(); @@ -373,10 +370,9 @@ bool cHlsSegmentLoader::StopLoader(void) dsyslog("[plex]%s", __FUNCTION__); try { std::string stopUri = "/video/:/transcode/universal/stop?session=" + m_sessionCookie; - Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_GET, stopUri); - m_pClientSession->sendRequest(req); + Poco::Net::HTTPResponse reqResponse; - m_pClientSession->receiveResponse(reqResponse); + m_pVideo->m_pServer->MakeRequest(reqResponse, stopUri); Cancel(); @@ -398,6 +394,11 @@ void cHlsSegmentLoader::AddHeader(Poco::Net::HTTPRequest& req) req.add("X-Plex-Product", "Plex Home Theater"); req.add("X-Plex-Platform", "Plex Home Theater"); } + + if(Config::GetInstance().UsePlexAccount && !m_pVideo->m_pServer->GetAuthToken().empty()) { + // Add PlexToken to Header + req.add("X-Plex-Token", m_pVideo->m_pServer->GetAuthToken()); + } } bool cHlsSegmentLoader::Active(void) @@ -410,11 +411,9 @@ void cHlsSegmentLoader::Ping(void) dsyslog("[plex]%s", __FUNCTION__); try { std::string uri = "/video/:/transcode/universal/ping?session=" + Config::GetInstance().GetUUID(); - Poco::Net::HTTPRequest req(Poco::Net::HTTPRequest::HTTP_GET, uri); - AddHeader(req); - m_pClientSession->sendRequest(req); + Poco::Net::HTTPResponse reqResponse; - m_pClientSession->receiveResponse(reqResponse); + m_pVideo->m_pServer->MakeRequest(reqResponse, uri); } catch(Poco::Exception& exc) { esyslog("[plex]%s %s ", __FUNCTION__, exc.displayText().c_str()); -- cgit v1.2.3