Това съобщение е редактирано за удобство на новите потребители.
Последната стабилна версия на TVHelper може винаги да бъде свалена от OpenFmi.
Ако имате някакви проблеми или идеи е най-добре да ги споделите в тази тема.
==========
Оригинал:
Понеже съм малко объркан къде му е мястото на това, реших, че тук е подходящо.
Neterra предлага онлайн телевизия на живо, но трябва да ходя на сайта им, за да мога да си пусна някоя телевизия, което хич не е удобно. Така, че реших да си направя една проста програмка, която да взима информация за дадената телевизия от сайта и да я пуска директно през mplayer.
Но стига разяснения - ето го резултата
MTH.c:
#include <gtk/gtk.h>
#include <curl/curl.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#define _GNU_SOURCE
#include <stdio.h>
GtkWidget* main_window;
/* Открива url-то, чрез което mplayer ще включи телевизионния канал */
void get_mms_url(char* mms_url, FILE* html_file)
{
int i;
fseek(html_file, 0, SEEK_SET);
size_t spartan_size = 300;
char* buf = (char*)malloc(301);
while(getline(&buf, &spartan_size, html_file) != -1)
{
i = 0;
while(buf[i] != '\n')
{
if(buf[i] == 'm')
{
++i;
if(buf[i] == 'm')
{
--i;
int j = 0;
while(buf[i] != '"')
{
mms_url[j] = buf[i];
++i;
++j;
}
mms_url[j]='\0';
free(buf);
return;
}
}
++i;
}
}
free(buf);
GtkWidget* error_dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(main_window), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Cannot find the mms address");
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
exit(EXIT_FAILURE);
}
/* Включва mplayer в нов процес и създава диалог, с който той може да бъде изключен */
static void watch_tv(GtkWidget *widget, gpointer data)
{
pid_t p = fork();
if(p < 0)
{
GtkWidget* error_dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(main_window), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, (gchar*)strerror(p));
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
return;
}
if(p > 0)
{
gtk_widget_hide(main_window);
GtkWidget* waiting_dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(main_window), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "You are now watching TV");
gtk_dialog_run(GTK_DIALOG(waiting_dialog));
gtk_widget_destroy(waiting_dialog);
kill(p, SIGTERM);
waitpid(p, 0, 0);
gtk_widget_show(main_window);
return;
}
/* Изтегляне на страницата от neterra - тази стъпка е много важна, защото чрез нея се взима линкът с информацията за сесията */
FILE* html_file = fopen("/tmp/neterra-streamer","w+");
CURL* curl_handle = curl_easy_init();
curl_easy_setopt(curl_handle, CURLOPT_URL, (const char*)data);
curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1);
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, html_file);
int error = curl_easy_perform(curl_handle);
if(error)
{
GtkWidget* error_dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(main_window), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, (const gchar*)curl_easy_strerror(error));
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
exit(EXIT_FAILURE);
}
curl_easy_cleanup(curl_handle);
char mms_url[128];
get_mms_url(mms_url, html_file);
fclose(html_file);
execl("/usr/bin/mplayer", "mplayer", mms_url, NULL);
}
static void destroy( GtkWidget *widget, gpointer data )
{
gtk_main_quit ();
}
int main(int argc, char *argv[])
{
GtkWidget* stationwg;
gtk_init(&argc, &argv);
main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_resizable(GTK_WINDOW(main_window), FALSE);
g_signal_connect (G_OBJECT(main_window), "destroy", G_CALLBACK(destroy), NULL);
GtkWidget* btnbox = gtk_vbutton_box_new();
gtk_container_add (GTK_CONTAINER(main_window), btnbox);
/* Това макро прави живота ви по-лесен - дава възможност да се дефинира нов телевизионен канал като се окаже само името и url-то му.
*/
#define TV(station, url) \
stationwg = gtk_button_new_with_label(station); \
g_signal_connect(G_OBJECT(stationwg), "clicked", G_CALLBACK(watch_tv), url); \
gtk_box_pack_start(GTK_BOX(btnbox), stationwg, TRUE, TRUE, 0);
/* Листата с телевизионните канали */
TV("bTV", "http://www.neterra.tv/bg/playlivestream.php?epid=9320&q=2&plid=3")
TV("Nova TV", "http://www.neterra.tv/bg/playlivestream.php?epid=22159&q=2&plid=3")
TV("TV7", "http://www.neterra.tv/bg/playlivestream.php?epid=9581&q=2&plid=3")
TV("Планета Чалга", "http://www.neterra.tv/bg/playlivestream.php?epid=8711&q=2&plid=3")
TV("Планета Фолк", "http://www.neterra.tv/bg/playlivestream.php?epid=25825&q=2&plid=3")
TV("EK", "http://www.neterra.tv/bg/playlivestream.php?epid=22527&q=2&plid=3")
TV("Европа TV", "http://www.neterra.tv/bg/playlivestream.php?epid=25285&q=2&plid=3")
TV("City TV", "http://www.neterra.tv/bg/playlivestream.php?epid=12098&q=2&plid=3")
TV("MM", "http://www.neterra.tv/bg/playlivestream.php?epid=16451&q=2&plid=3")
TV("MM2", "http://www.neterra.tv/bg/playlivestream.php?epid=16527&q=2&plid=3")
TV("Чалга Fen TV", "http://www.neterra.tv/bg/playlivestream.php?epid=24527&q=2&plid=3")
TV("Балканска чалга", "http://www.neterra.tv/bg/playlivestream.php?epid=24586&q=2&plid=3")
TV("7 дни", "http://www.neterra.tv/bg/playlivestream.php?epid=24030&q=2&plid=3")
TV("BG TV", "http://www.neterra.tv/bg/playlivestream.php?epid=16487&q=2&plid=3")
TV("ВТК", "http://www.neterra.tv/bg/playlivestream.php?epid=12111&q=2&plid=3")
TV("Канал 88", "http://www.neterra.tv/bg/playlivestream.php?epid=16528&q=2&plid=3")
gtk_widget_show_all(main_window);
gtk_main();
return 0;
}
За да компилирате тази програма ви трябва GTK+ и libcurl, а ето и как да си я компилирате:
П.П. Между другото, това е преправена версия на една друга моя програмка за пускане на онлайн радио станции от меню. Ако има заинтересувани пишете...
Редактирано от Zero_effect на Септември 12 2007, 12:00
Последната стабилна версия на TVHelper може винаги да бъде свалена от OpenFmi.
Ако имате някакви проблеми или идеи е най-добре да ги споделите в тази тема.
==========
Оригинал:
Понеже съм малко объркан къде му е мястото на това, реших, че тук е подходящо.
Neterra предлага онлайн телевизия на живо, но трябва да ходя на сайта им, за да мога да си пусна някоя телевизия, което хич не е удобно. Така, че реших да си направя една проста програмка, която да взима информация за дадената телевизия от сайта и да я пуска директно през mplayer.
Но стига разяснения - ето го резултата
MTH.c:
Код:
#include <gtk/gtk.h>
#include <curl/curl.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/wait.h>
#define _GNU_SOURCE
#include <stdio.h>
GtkWidget* main_window;
/* Открива url-то, чрез което mplayer ще включи телевизионния канал */
void get_mms_url(char* mms_url, FILE* html_file)
{
int i;
fseek(html_file, 0, SEEK_SET);
size_t spartan_size = 300;
char* buf = (char*)malloc(301);
while(getline(&buf, &spartan_size, html_file) != -1)
{
i = 0;
while(buf[i] != '\n')
{
if(buf[i] == 'm')
{
++i;
if(buf[i] == 'm')
{
--i;
int j = 0;
while(buf[i] != '"')
{
mms_url[j] = buf[i];
++i;
++j;
}
mms_url[j]='\0';
free(buf);
return;
}
}
++i;
}
}
free(buf);
GtkWidget* error_dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(main_window), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, "Cannot find the mms address");
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
exit(EXIT_FAILURE);
}
/* Включва mplayer в нов процес и създава диалог, с който той може да бъде изключен */
static void watch_tv(GtkWidget *widget, gpointer data)
{
pid_t p = fork();
if(p < 0)
{
GtkWidget* error_dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(main_window), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, (gchar*)strerror(p));
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
return;
}
if(p > 0)
{
gtk_widget_hide(main_window);
GtkWidget* waiting_dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(main_window), GTK_DIALOG_MODAL, GTK_MESSAGE_INFO, GTK_BUTTONS_CLOSE, "You are now watching TV");
gtk_dialog_run(GTK_DIALOG(waiting_dialog));
gtk_widget_destroy(waiting_dialog);
kill(p, SIGTERM);
waitpid(p, 0, 0);
gtk_widget_show(main_window);
return;
}
/* Изтегляне на страницата от neterra - тази стъпка е много важна, защото чрез нея се взима линкът с информацията за сесията */
FILE* html_file = fopen("/tmp/neterra-streamer","w+");
CURL* curl_handle = curl_easy_init();
curl_easy_setopt(curl_handle, CURLOPT_URL, (const char*)data);
curl_easy_setopt(curl_handle, CURLOPT_VERBOSE, 1);
curl_easy_setopt(curl_handle, CURLOPT_WRITEDATA, html_file);
int error = curl_easy_perform(curl_handle);
if(error)
{
GtkWidget* error_dialog = gtk_message_dialog_new_with_markup(GTK_WINDOW(main_window), GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, (const gchar*)curl_easy_strerror(error));
gtk_dialog_run(GTK_DIALOG(error_dialog));
gtk_widget_destroy(error_dialog);
exit(EXIT_FAILURE);
}
curl_easy_cleanup(curl_handle);
char mms_url[128];
get_mms_url(mms_url, html_file);
fclose(html_file);
execl("/usr/bin/mplayer", "mplayer", mms_url, NULL);
}
static void destroy( GtkWidget *widget, gpointer data )
{
gtk_main_quit ();
}
int main(int argc, char *argv[])
{
GtkWidget* stationwg;
gtk_init(&argc, &argv);
main_window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
gtk_window_set_resizable(GTK_WINDOW(main_window), FALSE);
g_signal_connect (G_OBJECT(main_window), "destroy", G_CALLBACK(destroy), NULL);
GtkWidget* btnbox = gtk_vbutton_box_new();
gtk_container_add (GTK_CONTAINER(main_window), btnbox);
/* Това макро прави живота ви по-лесен - дава възможност да се дефинира нов телевизионен канал като се окаже само името и url-то му.
*/
#define TV(station, url) \
stationwg = gtk_button_new_with_label(station); \
g_signal_connect(G_OBJECT(stationwg), "clicked", G_CALLBACK(watch_tv), url); \
gtk_box_pack_start(GTK_BOX(btnbox), stationwg, TRUE, TRUE, 0);
/* Листата с телевизионните канали */
TV("bTV", "http://www.neterra.tv/bg/playlivestream.php?epid=9320&q=2&plid=3")
TV("Nova TV", "http://www.neterra.tv/bg/playlivestream.php?epid=22159&q=2&plid=3")
TV("TV7", "http://www.neterra.tv/bg/playlivestream.php?epid=9581&q=2&plid=3")
TV("Планета Чалга", "http://www.neterra.tv/bg/playlivestream.php?epid=8711&q=2&plid=3")
TV("Планета Фолк", "http://www.neterra.tv/bg/playlivestream.php?epid=25825&q=2&plid=3")
TV("EK", "http://www.neterra.tv/bg/playlivestream.php?epid=22527&q=2&plid=3")
TV("Европа TV", "http://www.neterra.tv/bg/playlivestream.php?epid=25285&q=2&plid=3")
TV("City TV", "http://www.neterra.tv/bg/playlivestream.php?epid=12098&q=2&plid=3")
TV("MM", "http://www.neterra.tv/bg/playlivestream.php?epid=16451&q=2&plid=3")
TV("MM2", "http://www.neterra.tv/bg/playlivestream.php?epid=16527&q=2&plid=3")
TV("Чалга Fen TV", "http://www.neterra.tv/bg/playlivestream.php?epid=24527&q=2&plid=3")
TV("Балканска чалга", "http://www.neterra.tv/bg/playlivestream.php?epid=24586&q=2&plid=3")
TV("7 дни", "http://www.neterra.tv/bg/playlivestream.php?epid=24030&q=2&plid=3")
TV("BG TV", "http://www.neterra.tv/bg/playlivestream.php?epid=16487&q=2&plid=3")
TV("ВТК", "http://www.neterra.tv/bg/playlivestream.php?epid=12111&q=2&plid=3")
TV("Канал 88", "http://www.neterra.tv/bg/playlivestream.php?epid=16528&q=2&plid=3")
gtk_widget_show_all(main_window);
gtk_main();
return 0;
}
За да компилирате тази програма ви трябва GTK+ и libcurl, а ето и как да си я компилирате:
Код:
gcc -O3 MTH.c -o MTH `pkg-config gtk+-2.0 libcurl --cflags --libs`
П.П. Между другото, това е преправена версия на една друга моя програмка за пускане на онлайн радио станции от меню. Ако има заинтересувани пишете...
Редактирано от Zero_effect на Септември 12 2007, 12:00