#include "RSS.hpp" #include #include #include #include #include #include RSS::RSS(std::string url) { URL = url; channelInfo = ChannelInfo(url); parse(request()); } size_t WriteCallback(void* contents, size_t size, size_t nmemb, std::string* userp) { size_t totalSize = size * nmemb; userp->append((char*)contents, totalSize); return totalSize; } std::string RSS::request() { std::unique_ptr curl ( curl_easy_init(), &curl_easy_cleanup); if (!curl) { throw std::runtime_error("Failed to initialize CURL"); } std::string data; curl_easy_setopt(curl.get(), CURLOPT_URL, URL.c_str()); curl_easy_setopt(curl.get(), CURLOPT_WRITEFUNCTION, WriteCallback); curl_easy_setopt(curl.get(), CURLOPT_WRITEDATA, &data); curl_easy_setopt(curl.get(), CURLOPT_FOLLOWLOCATION, 1L); auto res = curl_easy_perform(curl.get()); if (res != CURLE_OK) { throw std::runtime_error(std::string("CURL request failed: ") + curl_easy_strerror(res)); } curl_easy_cleanup(curl.get()); return data; } void RSS::parse(std::string contents) { // std::cout << "starting tokenization..." << std::endl; try { auto leaf = XML_leaf(contents).GetChild("channel"); if (leaf.Raw == "<>") throw new std::runtime_error("The feed does not contain element"); this->channelInfo.Title = leaf.GetChild("title").Value; auto items = leaf.GetChildren("item"); for (auto item : items) Entries.push_back(RSS_Entry(item)); } catch (const char *err) { std::cout << "Failed to parse feed '" << URL << "' :" << err << std::endl; return; } } RSS_Entry::RSS_Entry(XML_leaf node) { Title = node.GetChild("title").GetValue(); URL = node.GetChild("link").GetValue(); Contents = node.GetChild("description").GetValue(); // auto pubDateField = node.GetChild("pubDate"); // if (pubDateField.Value.length() == 0) return; // std::cout << "pub date" << pubDateField.Value << std::endl; // strptime(pubDateField.Value.c_str(), "%Y-%m-%dT%H:%M:%SZ", &pubDate); } void RSS_Entry::print() { std::cout << "==============================\n" << Title << '\n' // << std::put_time(&pubDate, "%Y-%m-%d %H:%M:%S") << '\n' << Contents << '\n' << URL<< '\n'; }