#include "data_sources.h" ////////////// SDDataSource ////////////// SDDataSource::SDDataSource(String file) { _file = SD.open(file, "r"); } SDDataSource::~SDDataSource() { if (_file) _file.close(); } size_t SDDataSource::read(uint8_t* buf, size_t len) { return _file.read(buf, len); } int SDDataSource::read() { return _file.read(); } size_t SDDataSource::position() { return _file.position(); } void SDDataSource::seek(size_t position) { _file.seek(position); } size_t SDDataSource::size() { return _file.size(); } void SDDataSource::close() { _file.close(); } bool SDDataSource::usable() { return _file; } void SDDataSource::skip_id3_tag() { uint32_t original_position = _file.position(); uint32_t offset = 0; if (_file.read()=='I' && _file.read()=='D' && _file.read()=='3') { DEBUG("ID3 tag found\n"); // Skip ID3 tag version _file.read(); _file.read(); byte tags = _file.read(); bool footer_present = tags & 0x10; DEBUG("ID3 footer found: %d\n", footer_present); for (byte i=0; i<4; i++) { offset <<= 7; offset |= (0x7F & _file.read()); } offset += 10; if (footer_present) offset += 10; DEBUG("ID3 tag length is %d bytes.\n", offset); _file.seek(offset); } else { DEBUG("No ID3 tag found\n"); _file.seek(original_position); } } ////////////// HTTPSDataSource ////////////// HTTPSDataSource::HTTPSDataSource(String url, uint32_t offset) { _url = url; _init(url, offset); } void HTTPSDataSource::_init(String url, uint32_t offset) { _url = url; _http = new HTTPClientWrapper(); if (!_http->get(url, offset)) return; _position = 0; } HTTPSDataSource::~HTTPSDataSource() { _http->close(); delete _http; } bool HTTPSDataSource::usable() { return _http; } size_t HTTPSDataSource::read(uint8_t* buf, size_t len) { size_t result = _http->read(buf, len); _position += result; return result; } int HTTPSDataSource::read() { int b = _http->read(); if (b>=0) _position++; return b; } size_t HTTPSDataSource::position() { return _position; } void HTTPSDataSource::seek(size_t position) { _http->close(); delete _http; _init(_url, position); } size_t HTTPSDataSource::size() { return _http->getSize(); } void HTTPSDataSource::close() { _http->close(); } int HTTPSDataSource::peek(int offset) { return _http->peek(offset); } void HTTPSDataSource::skip_id3_tag() { uint32_t offset = 0; if (_http->peek(0)=='I' && _http->peek(1)=='D' && _http->peek(2)=='3') { DEBUG("ID3 tag found\n"); // Skip ID3 tag marker _http->read(); _http->read(); _http->read(); // Skip ID3 tag version _http->read(); _http->read(); byte tags = _http->read(); bool footer_present = tags & 0x10; DEBUG("ID3 footer found: %d\n", footer_present); for (byte i=0; i<4; i++) { offset <<= 7; offset |= (0x7F & _http->read()); } offset += 10; if (footer_present) offset += 10; DEBUG("ID3 tag length is %d bytes.\n", offset); seek(offset); } else { DEBUG("No ID3 tag found\n"); } }