Bonsoir,
Je cherche depuis quelques temps un moyen de lire et enregistrer une webradio. Je souhaite donc me réaliser un petit programme qui puisse se connecter à la webradio et d'enregistrer les mp3 au fur et à mesure. Je tiens à dire que je fais ça juste pour apprendre. Ce n'est donc pas la finalité du téléchargement qui m'intéresse, mais la manière de faire. Je précise que je suis sous linux, mais que j'aimerais bien que mon programme soit portable sous windows.
Tout d'abord, il s'agit de la radio suivante : http://208.122.59.30:7024 qui émet via le protocole HTTP un flux mp3 encodé en aac. Ou via un fichier .pls http://www.di.fm/mp3/chillout.pls
J'ai éssayé un certain nombre de pistes sans vraiment trouver ce que je voulais jusque là:
licurl
J'ai essayé de me connecter au serveur en HTTP avec la libcurl avec un petit programme en C, et je reçois bien les informations. Mais c'est encodé et donc illisible et ça défile à l'infini. Je n'ai pas trouvé de moyen de décoder les données.
les sockets
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 #include <stdlib.h> #include <stdio.h> #include <curl/curl.h> int main(int argc, char** argv) { CURL *curl; CURLcode res; curl = curl_easy_init(); if(curl) { curl_easy_setopt(curl, CURLOPT_URL, "http://208.122.59.30:7024"); res = curl_easy_perform(curl); curl_easy_cleanup(curl); } return 0; }
J'ai essayé de bosser ça avec les sockets mais je n'arrive pas à récupérer de données. Ca plante au niveau du recv et m'affiche "Reçu :" sans information.
Requête HTTP sous linux
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74 #if defined (WIN32) #include <winsock2.h> #elif defined (linux) #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h> #include <unistd.h> #define INVALID_SOCKET -1 #define SOCKET_ERROR -1 #define closesocket(s) close(s) typedef int SOCKET; typedef struct sockaddr_in SOCKADDR_IN; typedef struct sockaddr SOCKADDR; #endif #include <stdio.h> #include <stdlib.h> #include <errno.h> #define PORT 7024 int main(void) { #if defined (WIN32) WSADATA WSAData; int erreur = WSAStartup(MAKEWORD(2,0), &WSAData); #else int erreur = 0; #endif SOCKET sock; SOCKADDR_IN sin; char buffer[3200] = ""; /* Si les sockets Windows fonctionnent */ if(!erreur) { /* Création de la socket */ sock = socket(AF_INET, SOCK_STREAM, 0); /* Configuration de la connexion */ sin.sin_addr.s_addr = inet_addr("208.122.59.30"); sin.sin_family = AF_INET; sin.sin_port = htons(PORT); /* Si l'on a réussi à se connecter */ if(connect(sock, (SOCKADDR *)&sin, sizeof(sin)) != SOCKET_ERROR) { printf("Ca marche"); if(recv(sock, buffer, 3200, MSG_TRUNC) != SOCKET_ERROR) { printf("Recu : %s\n", buffer); } else { printf("erreur"); } } else { printf("erreur"); } /* On ferme la socket */ closesocket(sock); #if defined (WIN32) WSACleanup(); #endif } /* On attend que l'utilisateur tape sur une touche, puis on ferme */ getchar(); return EXIT_SUCCESS; }
J'ai exécuté la commande suivante
et je reçoisecho -en 'GET /\r\n\r\n' | nc 208.122.59.30 7024 | cat -v | head -n 11
wget sous linuxICY 200 OK^M
icy-notice1:<BR>This stream requires <a href="http://www.winamp.com/">Winamp</a><BR>^M
icy-notice2:SHOUTcast Distributed Network Audio Server/Linux v1.9.8<BR>^M
icy-nameI G I T A L L Y - I M P O R T E D - Chillout - ambient psy chillout, check out our trippy flavors!^M
icy-genre:Chillout Ambient Psy^M
icy-url:http://www.di.fm^M
content-type:audio/aacp^M
icy-pub:1^M
icy-br:24^M
^M
M-)M-&^AM-^MM-OM ......... à l'infini si je ne précise pas le nombre de lignes
Avec la commande wget j'ai essayé de me connecter à la webradio qui émet en HTTP. J'ai reçu un fichier html qui grossit à l'infini et qui contient les infos suivantes. Je reçois la même chose que envoyant la requête HTTP sauf que ça s'enregistre dans un fichier index.html qui grossit à l'infini. Donc ici encore je reçois les données, mais je ne sais pas comment les décoder et les enregistrer.
mplayer sous linux
Avec mplayer je peux lire mon flux mp3. Ce dernier me lit la webradio et je remarque que je reçois à chaque changement de musique des informations de ce type:
La bibliothèque gstreamerICY Info: StreamTitle='Boards Of Canada - Happy Cycling';StreamUrl='';
J'ai découvert la bibliothèque gstreamer qui est pas mal utilisée sous linux (http://gstreamer.freedesktop.org/) Mais j'ai un mal fou à l'utiliser et surtout à savoir comment me connecter à un flux distant. J'arrive à lire un fichier ogg sur mon PC avec quelques lignes de code en C, mais le streaming je n'y arrive pas ...
Donc voilà, je débute encore beaucoup en programmation en C, mais j'aimerais vraiment me faire la main sur un petit programme sympa histoire de vraiment saisir le fonctionnement du streaming. Donc si jamais vous aviez la moindre idée pour réaliser ce que je cherche à faire ça m'intéresserait énormément
En vous remerciant d'avance !
A+
Partager