There are several classes defined: Segment, Playlist, and HLSManifest. The Segment class has two properties: resolution and url. The Playlist class has a vector of Segment objects and a method addSegment to add segments to the vector. The HLSManifest class has a map of Playlist objects, where the key is the resolution and the value is the Playlist object. It also has a method addPlaylist to add playlists to the map and a method `
#include <iostream> #include <vector> #include <map> #include <fstream> #include <sstream> struct Segment { int resolution; std::string url; }; class Playlist { public: std::vector<Segment> segments; void addSegment(Segment segment) { segments.push_back(segment); } }; class HLSManifest { private: std::map<int, Playlist> playlists; public: void addPlaylist(int resolution, Playlist playlist) { playlists[resolution] = playlist; } std::string generateManifest() { std::string manifest = "#EXTM3U\n"; for (const auto& playlist : playlists) { manifest += "#EXT-X-STREAM-INF:BANDWIDTH=" + std::to_string(playlist.first) + "\n"; manifest += playlist.second.segments[0].url + "\n"; } return manifest; } }; std::vector<Segment> parseManifestFile(const std::string& filename) { std::vector<Segment> segments; std::ifstream file(filename); std::string line; while (std::getline(file, line)) { if (line.find("#EXT-X-STREAM-INF") != std::string::npos) { int bandwidth; std::stringstream ss(line.substr(line.find(":") + 1)); ss >> bandwidth; std::getline(file, line); segments.push_back({ bandwidth, line }); } } return segments; } int main() { HLSManifest hlsManifest; std::vector<std::string> filenames = { "manifest1.m3u8", "manifest2.m3u8" }; for (const auto& filename : filenames) { std::vector<Segment> segments = parseManifestFile(filename); for (const auto& segment : segments) { Playlist playlist; playlist.addSegment(segment); hlsManifest.addPlaylist(segment.resolution, playlist); } } std::cout << hlsManifest.generateManifest() << std::endl; return 0; }