#ifdef __linux__ #include #include #include #include #include #include #include "os.h" fn ParseLineAsNumber(const string& input) -> u64 { // Find the first number string::size_type start = 0; // Skip leading non-numbers while (!isdigit(input[++start])); // Start searching from the start of the number string::size_type end = start; // Increment to the end of the number while (isdigit(input[++end])); // Return the substring containing the number return std::stoul(input.substr(start, end - start)); } fn MeminfoParse(std::ifstream input) -> u64 { string line; // Skip every line before the one that starts with "MemTotal" while (std::getline(input, line) && !line.starts_with("MemTotal")); return ParseLineAsNumber(line); } fn GetMemInfo() -> u64 { return MeminfoParse(std::ifstream("/proc/meminfo")) * 1024; } fn GetOSVersion() -> string { std::ifstream file("/etc/os-release"); if (!file.is_open()) { std::cerr << "Failed to open /etc/os-release" << std::endl; return ""; // Return empty string indicating failure } string line; const string prefix = "PRETTY_NAME="; while (std::getline(file, line)) { if (line.find(prefix) == 0) { string prettyName = line.substr(prefix.size()); // Remove surrounding quotes if present if (!prettyName.empty() && prettyName.front() == '"' && prettyName.back() == '"') prettyName = prettyName.substr(1, prettyName.size() - 2); return prettyName; } } return ""; // Return empty string if PRETTY_NAME= line not found } fn GetMprisPlayers(sdbus::IConnection& connection) -> std::vector { const sdbus::ServiceName dbusInterface = sdbus::ServiceName("org.freedesktop.DBus"); const sdbus::ObjectPath dbusObjectPath = sdbus::ObjectPath("/org/freedesktop/DBus"); const char* dbusMethodListNames = "ListNames"; const std::unique_ptr dbusProxy = createProxy(connection, dbusInterface, dbusObjectPath); std::vector names; dbusProxy->callMethod(dbusMethodListNames).onInterface(dbusInterface).storeResultsTo(names); std::vector mprisPlayers; for (const std::basic_string& name : names) if (const char* mprisInterfaceName = "org.mpris.MediaPlayer2"; name.find(mprisInterfaceName) != std::string::npos) mprisPlayers.push_back(name); return mprisPlayers; } fn GetActivePlayer(const std::vector& mprisPlayers) -> string { if (!mprisPlayers.empty()) return mprisPlayers.front(); return ""; } fn GetNowPlaying() -> string { try { const char *playerObjectPath = "/org/mpris/MediaPlayer2", *playerInterfaceName = "org.mpris.MediaPlayer2.Player"; std::unique_ptr connection = sdbus::createSessionBusConnection(); std::vector mprisPlayers = GetMprisPlayers(*connection); if (mprisPlayers.empty()) return ""; string activePlayer = GetActivePlayer(mprisPlayers); if (activePlayer.empty()) return ""; auto playerProxy = sdbus::createProxy( *connection, sdbus::ServiceName(activePlayer), sdbus::ObjectPath(playerObjectPath) ); sdbus::Variant metadataVariant = playerProxy->getProperty("Metadata").onInterface(playerInterfaceName); if (metadataVariant.containsValueOfType>()) { const auto& metadata = metadataVariant.get>(); auto iter = metadata.find("xesam:title"); if (iter != metadata.end() && iter->second.containsValueOfType()) return iter->second.get(); } } catch (const sdbus::Error& e) { if (e.getName() != "com.github.altdesktop.playerctld.NoActivePlayer") return fmt::format("Error: {}", e.what()); return "No active player"; } return ""; } #endif