Bei der Einbindung von mehreren Feeds der gleichen Ursprungsseite kann es vorkommen, dass Nachrichten doppelte aufgelistet werden.

Über die Nextcloud-App "News" lassen sich solche Duplikate (bisher zumindest) nicht löschen. (Möglicherweise ist das aber auch Absicht.)

Das folgende PHP-Skript markiert alle Duplikate automatisch als gelesen und reduziert damit die dargestellten Einträge in der News-App. Das Skript kann per Cronjob aufgerufen werden.

define("NEXTCLOUD_URL", "https://NEXTCLOUD/index.php/apps/news/api/v1-3/");
define("NEXTCLOUD_USER", "USER");
define("NEXTCLOUD_PASS", "PASS");

if($j = nextCloudApiNewsDuplicates("items?type=3&getRead=false&batchSize=-1&oldestFirst=true")) {
	$titles = $toDelete = array();
	foreach($j->items as $i) {
		if(isset($titles[$i->title])) {
			$toDelete[] = $i->id;
		}
		$titles[$i->title][] = $i->id;
	}
} else {
	die(0);
}

if(is_array($toDelete) && count($toDelete)>0) {
	$d = array("itemIds"=>$toDelete);
	$foo = nextCloudApiNewsDuplicates("/items/read/multiple", "POST", $d, FALSE);
}

function nextCloudApiNewsDuplicates($url, $method="GET", $data=FALSE, $return="json") {
	$username = NEXTCLOUD_USER;
	$password = NEXTCLOUD_PASS;
	$URL = NEXTCLOUD_URL;

	$ch = curl_init();
	curl_setopt($ch, CURLOPT_URL, $URL.$url);
	switch($method) {
		default:
		case "GET":
		break;
		case "POST":
			curl_setopt($ch, CURLOPT_POST, true);
			curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
			print_r($data);
		break;
		case "PUT":
			curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
		break;
	}
	curl_setopt($ch, CURLOPT_TIMEOUT, 30);
	curl_setopt($ch, CURLOPT_HTTPHEADER, ["Authorization: Basic ".base64_encode($username.":".$password), "OCS-APIRequest: true"]);
	curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	$result=curl_exec ($ch);
	$status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
	curl_close ($ch);
	if($return=="json") {
		if($result && !is_null($j=json_decode($result))) {
			return $j;
		} else {
			return FALSE;
		}
	} else {
		return $result;
	}
}