#ifndef ECLIPT_PLAYLIST_H #define ECLIPT_PLAYLIST_H #include #include #include #include #include namespace eclipt { enum class PlaylistType { M3U, M3U8, PLS, EXT }; struct StreamInfo { int index = -1; std::string name; std::string language; std::string codec; int bandwidth = 0; std::string url; std::string group; bool is_default = false; bool is_selected = false; }; struct PlaylistItem { std::string name; std::string url; std::string tvg_name; std::string tvg_id; std::string group; int tvg_logo = 0; int64_t duration = -1; bool is_live = false; std::vector streams; }; struct Playlist { std::string name; PlaylistType type = PlaylistType::M3U; std::vector items; std::string base_url; Playlist() = default; bool loadFromFile(const std::string& path); bool loadFromString(const std::string& content); bool loadFromUrl(const std::string& url); std::vector getLiveStreams() const; std::vector getByGroup(const std::string& group) const; PlaylistItem* findById(const std::string& id); }; class IPlaylistParser { public: virtual ~IPlaylistParser() = default; virtual bool parse(const std::string& content, Playlist& playlist) = 0; virtual std::string getLastError() const = 0; }; class M3UParser : public IPlaylistParser { public: bool parse(const std::string& content, Playlist& playlist) override; std::string getLastError() const override { return last_error_; } private: std::string last_error_; bool parseExtInf(const std::string& line, PlaylistItem& item); bool parseAttribute(const std::string& attr, std::string& key, std::string& value); }; } #endif