vdr-streamdev-client/player.cpp

142 lines
4.3 KiB
C++
Raw Normal View History

2025-02-15 07:32:07 +01:00
#include <iostream>
#include <fstream>
#include <string>
#include <curl/curl.h>
#include <vlc/vlc.h>
#include <stdio.h>
#include <stdlib.h>
#include <QFile>
2025-02-15 07:38:45 +01:00
#include <QFrame>
2025-02-15 07:32:07 +01:00
#include "player.h"
2025-02-15 07:38:45 +01:00
Player::Player(QFrame *video){
this->videoWidget = video;
2025-02-15 07:32:07 +01:00
std::cout << "starte..." << std::endl;
this->sender_holen();
this->sender_laden();
2025-02-15 07:33:46 +01:00
//this->sender_ausgeben();
2025-02-15 07:32:07 +01:00
2025-02-15 07:34:15 +01:00
// Play init
/* Load the VLC engine */
inst = libvlc_new (0, NULL);
2025-02-15 07:32:07 +01:00
}
Player::~Player(){
2025-02-15 07:38:45 +01:00
if(mp){
/* Stop playing */
libvlc_media_player_stop (mp);
/* Free the media_player */
libvlc_media_player_release (mp);
libvlc_release (inst);
}
2025-02-15 07:32:07 +01:00
std::cout << "beende..." << std::endl;
}
2025-02-15 07:39:35 +01:00
size_t Player::write_data(void *ptr, size_t size, size_t nmemb, void *stream){
2025-02-15 07:32:07 +01:00
size_t written = fwrite(ptr, size, nmemb, (FILE *)stream);
return written;
}
int Player::sender_holen(void){
CURL *curl;
FILE *file;
CURLcode res;
curl_global_init(CURL_GLOBAL_ALL);
curl = curl_easy_init();
if(curl){
curl_easy_setopt(curl, CURLOPT_URL, "http://192.168.101.9:3000/channels.m3u");
file = fopen("channels.m3u", "wb");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, this->write_data);
curl_easy_setopt(curl, CURLOPT_WRITEDATA, file);
res = curl_easy_perform(curl);
if(res != CURLE_OK)
fprintf(stderr, "curl_easy_perform() failed: %s\n", curl_easy_strerror(res));
else
2025-02-15 07:38:45 +01:00
std::cout << "Sender holen und in channels.m3u speichern..." << std::endl;
2025-02-15 07:32:07 +01:00
curl_easy_cleanup(curl);
}
fclose(file);
return 0;
}
int Player::sender_laden(void){
int x=0;
2025-02-15 07:33:46 +01:00
this->Sender=1;
2025-02-15 07:32:07 +01:00
QFile file("channels.m3u");
if(file.open(QIODevice::ReadOnly | QIODevice::Text)){
while (!file.atEnd()){
QByteArray line = file.readLine();
if(line.toStdString()=="#EXTM3U\n") // erste Zeile überspringen
continue;
if(line.toStdString()=="\n") // lezte Zeile überspringen
break;
QString string = line;
string.replace(QString("#EXTINF:-1,"), QString(""));
string.replace(QString("\n"), QString("")); // Zeilenede entfernen
if(++x%2){
std::cout << this->Sender << " Name: " << string.toStdString() << std::endl;
this->Name[this->Sender]=string;
} else {
std::cout << this->Sender <<" Url: " << string.toStdString() << std::endl;
this->URL[this->Sender++]=string;
}
}
2025-02-15 07:33:46 +01:00
Sender--; //Senderkorrektur
2025-02-15 07:32:07 +01:00
} else {
std::cout << "Fehler channels.m3u" << std::endl;
return 1;
}
return 0;
}
int Player::sender_ausgeben(void){
2025-02-15 07:33:46 +01:00
for(int x=1;x<=this->Sender;x++){
2025-02-15 07:32:07 +01:00
std::cout << x << ". " << this->Name[x].toStdString() << "," << this->URL[x].toStdString() << std::endl;
}
return 0;
}
2025-02-15 07:34:15 +01:00
int Player::play(QListWidgetItem *item){
if (!item)
return 1;
2025-02-15 07:38:45 +01:00
std::cout << "Sender: " << item->text().toStdString() << std::endl;
2025-02-15 07:34:15 +01:00
int x=1;
for(;x<=this->Sender;x++){
if(item->text()==Name[x]){
2025-02-15 07:38:45 +01:00
std::cout << "Name: " << Name[x].toStdString() << " URL: " << URL[x].toStdString() << std::endl;
2025-02-15 07:34:15 +01:00
break;
}
}
2025-02-15 07:38:45 +01:00
/* Stop playing */
2025-02-15 07:34:15 +01:00
if(mp)
libvlc_media_player_stop (mp);
2025-02-15 07:32:07 +01:00
2025-02-15 07:34:15 +01:00
QByteArray bla = URL[x].toLatin1();
const char *url = bla.data();
2025-02-15 07:32:07 +01:00
/* Create a new item */
2025-02-15 07:34:15 +01:00
m = libvlc_media_new_location (inst, url);
2025-02-15 07:32:07 +01:00
/* Create a media player playing environement */
mp = libvlc_media_player_new_from_media (m);
/* No need to keep the media now */
libvlc_media_release (m);
2025-02-15 07:38:45 +01:00
#if defined(Q_OS_WIN) // Windows
libvlc_media_player_set_hwnd(mp, (void *)videoWidget->winId()); // hwnd
#elif defined(Q_OS_MAC) // Mac
libvlc_media_player_set_nsobject(mp, (void *)videoWidget->winId()); // view
#else //Linux
2025-02-15 07:40:16 +01:00
int windid = videoWidget->winId();
libvlc_media_player_set_xwindow (mp, windid); // xid
2025-02-15 07:32:07 +01:00
#endif
2025-02-15 07:38:45 +01:00
std::cout << "play..." << std::endl;
2025-02-15 07:32:07 +01:00
/* play the media_player */
libvlc_media_player_play (mp);
return 0;
}