TS info aus .xml-Datei auslesen und anzeigen

Günther
Developer
Beiträge: 587
Registriert: Freitag 9. September 2005, 21:48

TS info aus .xml-Datei auslesen und anzeigen

Beitrag von Günther »

Hallo,

ich verwende schon seit längerem die .ts-Aufnahme-Funtion. Was mir bisher immer gefehlt hat: im Filebrowser und auch beim Abspielen der TS-Datei sind keine EPG informationen abrufbar, obwohl diese als .xml-Datei auf der Festplatte vorhanden sind.(eventuell habe ich aber auch einfach nur übersehen wie es geht :gruebel: )

Die ganze Sache ist eigentlich nicht so schwierig zu realisieren. Im Filebrowser müßte einfach auf eine bestimmte Taste (ev. die rechts Taste) eine Info-Box für das ts-File aufgehen. Ähnliches könnte auch während der Wiedergabe im Movieplayer zur Verfügung stehen. Was meinen denn die 'alten Hasen' dazu? Wäre doch eine feine Sache, oder?

Habe mal sozusagen als Diskussionsgrundlage ein Beispielcode angehängt. Konnte diesen aber leider noch nicht testen, da ich noch mit dem 'make all' am kämpfen war (funktioniert immerhin schon :) , jetzt kommt die Lektion 'booten von Linux' dran, aber das ist ein anderer Thread...).

Komme erst wieder am 4.Okt aus dem Urlaub zurück. Vielleicht hat jemand auch Interesse an diesem Thema und und hat in der Zwischenzeit Zeit&Lust (nach allgemeiner Zustimmung natürlich), den Code mal zu test und einzupflegen :P ????

Ciao
Günther
----------------------------
// filebrowser.cpp, line 731
if (S_ISDIR(filelist[selected].Mode) && (filelist[selected].getFileName() != ".."))
ChangeDir(filelist[selected].Name);
else
show_ts_info(&filelist[selected].getFileName());

// in eine Header Datei
extern unsigned char show_ts_info(const std::string* file_name);
extern std::string get_text_between(const char* source, const char* search, std::string* dest);


/*******************************************************************
*
* Name: show_ts_info
*
* IN: file_name: ts file name (.ts)
*
* OUT: TRUE/FALSE
*
* Desc: prints the formated ts info in standard message box
*
********************************************************************/
unsigned char show_ts_info(const std::string* file_name)
{
int fd;
char stream_info[400];
std::string print_buffer;
std::string full_name;
std::string temp_buffer;
unsigned char result = TRUE;
unsigned int counter=0;
int bytes=0;

// change file name from .* to .xml
bytes = file_name->find_last_of(".ts");
if(bytes == -1) // not a TS file, return!!!!!
{
return(FALSE);
}
full_name = file_name->substr(0, bytes-2) + ".xml";

// open file
fd = open(full_name.c_str(), O_RDONLY);
if (fd == -1) // cannot open file, return!!!!!
{
return(FALSE);
}

// read file content to buffer
bytes = read(fd, stream_info, 399);
if(bytes <= 0) // cannot read file into buffer, return!!!!
{
return(FALSE);
}

// close file
close(fd);

// prepare print buffer and parse through file
print_buffer = "\n\nTitle:\t";
print_buffer += get_text_between(stream_info,"epgtitle",&temp_buffer);

print_buffer += "\n\nInfo:\t";
print_buffer += get_text_between(stream_info,"info1",&temp_buffer);
print_buffer += "\n";
print_buffer += get_text_between(stream_info,"info2",&temp_buffer);

print_buffer += "\n\nChannel:\t";
print_buffer += get_text_between(stream_info,"channelname",&temp_buffer);

print_buffer += "\n\nID:\t";
print_buffer += get_text_between(stream_info,"id",&temp_buffer);

print_buffer += "\n\nAudio:\t";

#if USE_SHOW_MESSAGE
// open message box and print ts info
ShowMsgUTF( LOCALE_MOVIEPLAYER_TSPLAYBACK,
print_buffer.c_str());/*,
CMessageBox::mbrBack,
CMessageBox::mbBack,
"info.raw"); // UTF-8*/

#else /* USE_SHOW_MESSAGE */
ShowHintUTF(LOCALE_MOVIEPLAYER_TSPLAYBACK,
print_buffer.c_str());/*,
g_Font[SNeutrinoSettings::FONT_TYPE_MENU]->getRenderWidth(text) + 10,
duration); // UTF-8*/

#endif /* USE_SHOW_MESSAGE */
return (TRUE);
}

/*******************************************************************
*
* Name: get_text_between
*
* IN: source: string to be searched
* search: search string
* dest: result string
*
* OUT: result string
*
* Desc: returns the string between "<"+search+">" and "</"+search+">"
*
********************************************************************/
std::string get_text_between(const char* source, const char* search, std::string* dest)
{
int search_start;
int search_end;

std::string src = source;
std::string srch;

// create beginning search pattern and search for it
srch = "<" ;
srch += search ;
srch += ">" ;
search_start = src.find(srch) + srch.length();

// create ending search pattern and search for it
srch = "</" ;
srch += search ;
srch += ">" ;
search_end = src.find(srch);

// did we found something, is start and end position valid?
if( search_start != -1 &&
search_end != -1 &&
search_start < search_end)
{
// yepp, copy text between both
*dest = src.substr(search_start, search_end - search_start);
}
else
{
*dest = "";
}

return *dest;
}
Torsten73
Erleuchteter
Erleuchteter
Beiträge: 547
Registriert: Mittwoch 30. Juni 2004, 16:06

Beitrag von Torsten73 »

Hi,
ich kann zwar nicht coden, aber wenn das funktionieren würde wäre ich ebenfalls sehr glücklich!

Ist auch schon öfters in den Feature Requests gekommen, aber es hatte bisher keiner sich daran gesetzt.

Cu
Torsten