8#define MAX_HLS_LINE 512
9#define START_URLS_LIMIT 4
10#define HLS_BUFFER_COUNT 2
11#define HLS_MAX_NO_READ 2
12#define HLS_MAX_URL_LEN 256
13#define HLS_TIMEOUT 5000
14#define HLS_UNDER_OVERFLOW_WAIT_TIME 10
34template <
typename URLStream>
58 LOGI(
"Adding %s", url);
60 char *str =
new char[url_str.length() + 1];
61 memcpy(str, url_str.c_str(), url_str.length() + 1);
89 return url_stream.httpRequest().reply().get(CONTENT_TYPE);
152 while (to_write > 0) {
153 uint8_t tmp[to_write];
154 memset(tmp, 0, to_write);
155 int read =
url_stream.readBytes(tmp, to_write);
168 LOGI(
"Closing stream because all bytes were processed: available: %d",
173 LOGD(
"Refilled with %d now %d available to write", total,
185 bool add(
const char *url) {
186 if (url ==
nullptr)
return true;
188 StrView url_str(url);
190 if (url_str.equals(
history[j])) {
196 char *str =
new char[url_str.length() + 1];
197 memcpy(str, url, url_str.length() + 1);
220template <
typename URLStream>
318 const char *reqURL)) {
349 const char *(*resolve_url)(
const char *segment,
354 static const char *
resolveURL(
const char *segment,
const char *reqURL) {
358 StrView index_url(reqURL);
360 int end = index_url.lastIndexOf(
"?");
362 result_str.substring(reqURL, 0,
end);
364 end = index_url.lastIndexOf(
"/");
366 result_str.substring(reqURL, 0,
end);
370 if (result_str.isEmpty()) {
374 if (!result_str.endsWith(
"/")) {
378 result_str.add(segment);
379 LOGI(
">> relative addr: %s for %s", segment, reqURL);
380 LOGD(
">> -> %s", result);
418 if (len == 0 &&
url_stream.available() == 0)
break;
422 if (str.startsWith(
"#EXTM3U")) {
440 LOGI(
"> %s", str.c_str());
450 if (str.startsWith(
"#")) {
451 if (str.indexOf(
"EXT-X-STREAM-INF") >= 0) {
454 int pos = str.indexOf(
"BANDWIDTH=");
456 StrView num(str.c_str() + pos + 10);
457 tmp_bandwidth = num.toInt();
465 pos = str.indexOf(
"CODECS=");
468 int end = str.indexOf(
'"', pos + 10);
550 if (len == 0 &&
url_stream.available() == 0)
break;
554 if (str.startsWith(
"#EXTM3U")) {
571 LOGI(
"> %s", str.c_str());
578 if (str.startsWith(
"#")) {
579 if (str.startsWith(
"#EXT-X-MEDIA-SEQUENCE:")) {
580 int new_media_sequence = atoi(str.c_str() + 22);
581 LOGI(
"media_sequence: %d", new_media_sequence);
590 if (str.startsWith(
"#EXTINF")) {
592 StrView sec_str(str.c_str() + 8);
593 float sec = sec_str.toFloat();
594 LOGI(
"adding play time: %f sec", sec);
602 if (!str.startsWith(
"#")) {
609 if (str.startsWith(
"http")) {
620 if (str.startsWith(
"http")) {
628 LOGD(
"Duplicate ignored: %s", str.c_str());
652template <
typename URLStream>
702 return parser.available();
708 return parser.readBytes(data, len);
724 const char *result =
nullptr;
726 result =
parser.contentType();
728 if (result)
LOGI(
"-> Format: %s", result);
736 parser.setURLResolver(cb);
765 LOGW(
"login not supported");
#define LOGW(...)
Definition AudioLoggerIDF.h:29
#define TRACEI()
Definition AudioLoggerIDF.h:32
#define TRACED()
Definition AudioLoggerIDF.h:31
#define LOGI(...)
Definition AudioLoggerIDF.h:28
#define TRACEE()
Definition AudioLoggerIDF.h:34
#define LOGD(...)
Definition AudioLoggerIDF.h:27
#define START_URLS_LIMIT
Definition HLSStream.h:9
#define MAX_HLS_LINE
Definition HLSStream.h:8
#define HLS_MAX_URL_LEN
Definition HLSStream.h:12
#define HLS_UNDER_OVERFLOW_WAIT_TIME
Definition HLSStream.h:14
#define HLS_TIMEOUT
Definition HLSStream.h:13
#define HLS_BUFFER_COUNT
Definition HLSStream.h:10
MethodID
supported http methods
Definition HttpTypes.h:3
@ GET
Definition HttpTypes.h:5
void delay(uint32_t ms)
Definition NoArduino.h:232
uint32_t millis()
Definition NoArduino.h:233
#define DEFAULT_BUFFER_SIZE
Definition avr.h:20
#define assert(T)
Definition avr.h:10
Definition HLSStream.h:183
bool add(const char *url)
Definition HLSStream.h:185
Vector< const char * > history
Definition HLSStream.h:212
void clear()
Definition HLSStream.h:207
int size()
Definition HLSStream.h:209