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.
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;
}
les sockets
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.
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;
}
Requête HTTP sous linux
J'ai exécuté la commande suivante
echo -en 'GET /\r\n\r\n' | nc 208.122.59.30 7024 | cat -v | head -n 11
et je reçois
ICY 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-name I 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
wget sous linux
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:

ICY Info: StreamTitle='Boards Of Canada - Happy Cycling';StreamUrl='';
La bibliothèque gstreamer
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+