Neutrino mit Wavefrontier!!??

Das Original Benutzerinterface Neutrino-SD incl. zapit, sectionsd, yWeb etc...
martie
Interessierter
Interessierter
Beiträge: 55
Registriert: Samstag 14. September 2002, 20:07

Neutrino mit Wavefrontier!!??

Beitrag von martie »

hallo,
hab in letzter zeit oft mit Enigma gearbeitet aber irgendwie gefällt mir Neutrino besser...

hab auch schon Enigma mit dem Neutrino Skin benutzt aber Neutrino gefällt mir besser...

Zu meiner Frage:

Ist es mitlerweile möglich mit Neutrino mehr als 4 Sat es reinzubekommen!?

Das wäre echt Klasse....

mfg martie
Stephan_W
Neugieriger
Neugieriger
Beiträge: 6
Registriert: Samstag 16. Oktober 2004, 19:50

Beitrag von Stephan_W »

Hallo,

>Ist es mitlerweile möglich mit Neutrino mehr als 4 Sat es >reinzubekommen!?

Ich habe zwar nicht Deine Konfiguration mit der Wavefrontier und mehreren LNBs, aber da es die Optionen fuer Diseqc 1.0/1.0 in Neutrino gibt, sollte es auch gehen.
Ich selbst habe eine Drehanlage und bin noch an der Konfiguration, nutze Diseqc 1.2 in Neutrino und habe bis jetzt 11 Satelliten eingestellt.
Das Problem mit der DBOX2 ist natuerlich, dass es keine kompletten Kanallisten fuer Neutrino gibt (zumindest habe ich keine gefunden) und das macht die Einstellerei und Satsuche recht aufwendig

Gruss Stephan
martie
Interessierter
Interessierter
Beiträge: 55
Registriert: Samstag 14. September 2002, 20:07

Beitrag von martie »

hallo...
also die einstellung der LNB es ist mit ein wenig fingerspitzengefühl kein problem für mich...

nur bei einem Motor wird nur ein LNB angesprochen über eine Leitung...

meine verkabelung ist folgendermaßen:

16 LNB es(im moment nur 8 angeschlossen) jeweils 4 gehen an einen diseqc 4in1

die 4 leitungen der diseqc es gehen an eine Spaun sur 420f


bei enigma kann man den Lnb es a/a a/b b/a und b/b zuordnen (Lnb1-4 pro diseqc 4in1) dann pro 4in1 den Eingang 1-4 wählen und das funktioniert wunderbar

aber bei Neutrino leider nicht da mann anscheinen nur 4 LNB es verwalten kann.... oder hast du eine Idee???

greetz Martie
martie
Interessierter
Interessierter
Beiträge: 55
Registriert: Samstag 14. September 2002, 20:07

Beitrag von martie »

Weiss den keiner einen Rat hier in diesem Forum??????

greetz Martie
Npq
Senior Member
Beiträge: 1339
Registriert: Donnerstag 24. April 2003, 12:12

Beitrag von Npq »

Denke mal, das weiß einfach niemand so genau.

So ein Systeme hat ja kaum jemand und wenn zapit das nicht kann, dann muß es jemand nachrüsten, der es auch testen kann UND der auch noch Neutrino benutzt.

Der letzte der versuchen wollte, da etwas zu ändern hat irgendwann entnervt aufgegeben, soviel weiß ich.
rasc
Senior Member
Beiträge: 5071
Registriert: Dienstag 18. September 2001, 00:00

Beitrag von rasc »

Eigentlich sollten mit Diseqc 1.1 auch mehr als 4 gehen.
Nur wie Npq sagt, man muss es halt auch testen koennen.

Wenn sich da jemand mal test- und source-maessig reinstressen koennte, der auch so ein System hat, waere das nicht schlecht.
martie
Interessierter
Interessierter
Beiträge: 55
Registriert: Samstag 14. September 2002, 20:07

Beitrag von martie »

ja das fänd ich echt gut....

nur leider fehlen mir diese Kenntnisse und hab im moment zu viel um die Ohren mich erst einmal mit den kenntnissen des Image erstellen zu befassen...

also ich fänds Klasse wenn diese sache in Neutrino vorhanden wäre dann würde Neutrino der Enigma in nichts nachstehen....

Wenn nur mal ein paar Experten dies hier lesen würden fänd ich das schon Klasse....

greetz Martie

PS: Ich stell mich sehr sehr gerne als Tester zur verfügung!!!!!!
DieMade
Oberlamer, Administrator & Supernanny
Beiträge: 10532
Registriert: Samstag 13. Juli 2002, 10:49

Beitrag von DieMade »

Wie rasc schon sagte, ein "Experte" ohne die passende Ausrüstung hilft nicht viel.
There are 10 types of people in the world: those who know binary and those who don't
FreeBird
Neugieriger
Neugieriger
Beiträge: 3
Registriert: Donnerstag 3. Juli 2003, 00:00

Beitrag von FreeBird »

Ich opfere mich und teste demnächst...

Ich baue am Sonnabend eine Wavefrontier T90 zunächst mit 4 LNBs auf und werde dann mal versuchen, weitere 4 LNBs in Betrieb zu bekommen.
Falls es mir gelingt, werde ich berichten...

Für Tips und Hinweise vorab wäre ich allerdings trotzdem dankbar.

Image-Erstellung ist aber für mich (zumindest noch) ein Buch mit 6-7 Siegeln *g*
martie
Interessierter
Interessierter
Beiträge: 55
Registriert: Samstag 14. September 2002, 20:07

Beitrag von martie »

Hallo bin mal wieder da...

und hol mal den Thread wieder ans Tageslicht :)

So ich hab was neues wie ich vielleicht ein paar mehr LNB es unter Neutrino ans laufen bekomme :D

und zwar einen Diseqc 10/1
Bild
Multiprotocol Programmable DiSEqC Switsch SW101D
Signal loses 3dB
Frequency range 950-2300 MHz
Operating tempeature -36+65°C
max.Current 0,4A Overload protection current 0,6A Current consuption 25mA Voltage on output Receiver +12-20V

zum umschalten von 10 LNB`s für 1 Receiver

Modus 1: DiSEqC 1.0 / 2.0 (A-B-C-D), maximal 4 LNB
Modus 2: DiSEqC 1.1 / 2.1, maximal 10 LNB
Modus 3: DiSEqC 1.0 / 2.0 + Toneburst A/B, maximal 6 LNB
Modus 4: DiSEqC 1.1 / 2.1 maximal 10 LNB (umbedingt bei Dreambox diesen Modus wählen)
Modus 5: DiSEqC 1.2 / 2.2, maximal 10 LNB (wird meinstens benutzt, z.B.Humax,Samsung,PremiumX,Coship,Topfield....Receiver)
Modus 6 :Free (Benutzerdefiniertes DiSEqC, maximal 10 LNB)
Die Frage ist jetzt nur welcher Modus auch in der dbox2-Neutrino funktioniert... Bei Modus 4 steht zwar Dreambox aber die hat ja meist Enigma als Soft (A/A A/B A/C A/D B/A B/B usw...)

Da ich schon öftrer gelesen habe das Neurtrino und Motor unter Diseqc 1.2 ganz gut funktioniert dachte ich an den Modus 5

Wollte mir gerne den Programmer für dieses Diseqc sparen (18€), da der Shop es Programmiert wie man es haben möchte...

Hat vielleicht einer in diesem Forum solch ein Diseqc in seinem System und kann Berichten???

schon man vielen Dank für eventuelle Antworten

Greetz Martie
Nico 77
Semiprofi
Semiprofi
Beiträge: 1383
Registriert: Freitag 18. April 2003, 15:12

Beitrag von Nico 77 »

martie hat geschrieben: Da ich schon öftrer gelesen habe das Neurtrino und Motor unter Diseqc 1.2 ganz gut funktioniert dachte ich an den Modus 5
Das halte ich für ein Gerücht, Motor und Neutrino kannste vergessen.
Das kostet wenn Neutrino die Anlage drehen soll, immer wieder mehr Frust als Spass.
martie
Interessierter
Interessierter
Beiträge: 55
Registriert: Samstag 14. September 2002, 20:07

Beitrag von martie »

mmmhh.....

Danke für deine Antwort...

hört sich ja nicht so gut an aber die box muss ja keinen Motor drehen sondern nur ein Signal ausgeben... :gruebel:

ansonsten bliebe ja noch Diseqc 1.1 aber da weiß ich halt auch nicht ob es Funktioniert.... :-?

... muss ich wohl doch den Programmer mitbestellen..... :gruebel:

Greetz Martie
Stephan_W
Neugieriger
Neugieriger
Beiträge: 6
Registriert: Samstag 16. Oktober 2004, 19:50

Beitrag von Stephan_W »

Hallo,
Nico 77 hat geschrieben: Das halte ich für ein Gerücht, Motor und Neutrino kannste vergessen.
Das kostet wenn Neutrino die Anlage drehen soll, immer wieder mehr Frust als Spass.
Der Frust entsteht aus zweierlei Grund:
Ich hatte ziemliche Probleme mit einem zu schwachen Netzteil in meiner Nokia DBOX, was dazu fuehrte, dass der Ueberstromschutz regelmaessig
ausloeste. Wenn man anfangs die Macken seiner Box nicht kennt, vergeudet man sehr viel unnoetige Zeit damit. Das Problem ist allerdings loesbar, indem man ein zweites kleines Netzteil in die Box einbaut und zusaetzlich Energie fuer die LNB/Motor einspeist
Das weitaus groessere Problem ist, dass die Kanalsuche nicht in der Weise funktioniert, wie es mal vor einen knappen Jahr war. Das bedeutet, dass in der Praxis die Kanaele nach der Kanalsuche nicht mehr in die satellitenspezifische Bouquets gespeichert werden und die gesamten Satelliten nicht mehr verwaltet werden koennen.
Folglich ist Diseqc 1.2 unbrauchbar, was leider niemanden weiter zu stoeren scheint (ausser uns beide :-)

Gruss
Stephan
Ich habe
Stephan_W
Neugieriger
Neugieriger
Beiträge: 6
Registriert: Samstag 16. Oktober 2004, 19:50

Beitrag von Stephan_W »

Hallo,
Nico 77 hat geschrieben: Das halte ich für ein Gerücht, Motor und Neutrino kannste vergessen.
Das kostet wenn Neutrino die Anlage drehen soll, immer wieder mehr Frust als Spass.
Der Frust entsteht aus zweierlei Grund:
Ich hatte ziemliche Probleme mit einem zu schwachen Netzteil in meiner Nokia DBOX, was dazu fuehrte, dass der Ueberstromschutz regelmaessig
ausloeste. Wenn man anfangs die Macken seiner Box nicht kennt, vergeudet man sehr viel unnoetige Zeit damit. Das Problem ist allerdings loesbar, indem man ein zweites kleines Netzteil in die Box einbaut und zusaetzlich Energie fuer die LNB/Motor einspeist
Das weitaus groessere Problem ist, dass die Kanalsuche nicht in der Weise funktioniert, wie es mal vor einen knappen Jahr war. Das bedeutet, dass in der Praxis die Kanaele nach der Kanalsuche nicht mehr in die satellitenspezifische Bouquets gespeichert werden und die gesamten Satelliten nicht mehr verwaltet werden koennen.
Folglich ist Diseqc 1.2 unbrauchbar, was leider niemanden weiter zu stoeren scheint (ausser uns beide :-) )

Gruss
Stephan
Nico 77
Semiprofi
Semiprofi
Beiträge: 1383
Registriert: Freitag 18. April 2003, 15:12

Beitrag von Nico 77 »

Stephan_W hat geschrieben:Das weitaus groessere Problem ist, dass die Kanalsuche nicht in der Weise funktioniert, wie es mal vor einen knappen Jahr war. Das bedeutet, dass in der Praxis die Kanaele nach der Kanalsuche nicht mehr in die satellitenspezifische Bouquets gespeichert werden und die gesamten Satelliten nicht mehr verwaltet werden koennen.
Folglich ist Diseqc 1.2 unbrauchbar, was leider niemanden weiter zu stoeren scheint (ausser uns beide :-) )

Gruss
Stephan
Das habe ich repariert, der Source liegt noch hier:

http://forum.tuxbox-cvs.sourceforge.net ... hp?t=37384&

Den behobenen Fehler will nur keiner einchecken, weil dann wohl irgendwas im Kabel spinnt was vollkommen falsch ist, habe hier schliesslich Kabel. :evil:
Im CVS wird immer Kabelcom Rheinhessen statt der eigene Kabelprovider geschrieben.
Im CVS wird bei Rotoranlagen auch immer der letzte Eintrag aus der satellites.xml übernommen.
Es juckt halt keinen sonst........

Hier zumindest nochmal der Fix womit im Kabel wieder der richtige Kabelprovider und beim Rotorsatscan wieder der richtige Satprovider eingetragen wird:

Code: Alles auswählen

/*
 * $Id: scan.cpp,v 1.152 2005/07/31 22:38:00 n772yk Exp $
 *
 * (C) 2002-2003 Andreas Oberritter <obi@tuxbox.org>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */

#include <fcntl.h>
#include <unistd.h>

/* libevent */
#include <eventserver.h>

#include <zapit/bouquets.h>
#include <zapit/client/zapitclient.h>
#include <zapit/debug.h>
#include <zapit/frontend.h>
#include <zapit/getservices.h>
#include <zapit/nit.h>
#include <zapit/scan.h>
#include <zapit/sdt.h>
#include <zapit/settings.h>
#include <zapit/xmlinterface.h>

short scan_runs;
short curr_sat;
static int status = 0;
uint processed_transponders;
uint32_t actual_freq;
uint actual_polarisation;
bool scan_mode = false;
bool one_flag;
int one_tpid, one_onid;
static bool scan_should_be_aborted;

CBouquetManager* scanBouquetManager;

extern transponder_list_t transponders; //  defined in zapit.cpp
extern tallchans allchans;              //  defined in zapit.cpp
extern int found_transponders;
extern int found_channels;
extern std::map <t_channel_id, uint8_t> service_types;
extern uint32_t found_tv_chans;
extern uint32_t found_radio_chans;
extern uint32_t found_data_chans;

/* zapit.cpp */
extern CFrontend *frontend;
extern xmlDocPtr scanInputParser;

extern std::map <uint8_t, std::string> scanProviders;
std::map <uint8_t, std::string>::iterator spI;

extern std::map<t_satellite_position, uint8_t> motorPositions;
extern std::map<t_satellite_position, uint8_t>::iterator mpos_it;

extern std::map<string, t_satellite_position> satellitePositions;

extern CZapitClient::bouquetMode bouquetMode;
extern CZapitClient::scanType scanType;
static bool service_wr = false;
extern CEventServer *eventServer;
extern diseqc_t diseqcType;

extern int motorRotationSpeed;
TP_map_t TP_scanmap;

void write_xml_header(FILE * fd);
void write_xml_footer(FILE * fd);

t_satellite_position getSatellitePosition(const char * const providerName)
{
	t_satellite_position satellite_position;

	if (frontend->getInfo()->type == FE_QPSK) /* sat */
	{
		satellite_position = satellitePositions[providerName];
	}
	else
		satellite_position = SATELLITE_POSITION_OF_NON_SATELLITE_SOURCE;

	return satellite_position;
}

t_satellite_position driveMotorToSatellitePosition(const char * const providerName)
{
	t_satellite_position currentSatellitePosition;
	int                  waitForMotor;

	t_satellite_position satellite_position = getSatellitePosition(providerName);

	if (frontend->getInfo()->type == FE_QPSK) /* sat */
	{
		if (frontend->getDiseqcType() == DISEQC_1_2)
		{
			waitForMotor = 0;
			/* position satellite dish if provider is on a different satellite */
			currentSatellitePosition = frontend->getCurrentSatellitePosition();
			printf("[scan] scanning now: %s\n", providerName);
			printf("[scan] currentSatellitePosition = %d, scanSatellitePosition = %d\n", currentSatellitePosition, satellite_position);
			printf("[scan] motorPosition = %d\n", motorPositions[satellite_position]);
			if ((currentSatellitePosition != satellite_position) && (motorPositions[satellite_position] != 0))
			{
				printf("[scan] start_scanthread: moving satellite dish from satellite position %d to %d\n", currentSatellitePosition, satellite_position);
				printf("[scan] motorPosition = %d\n", motorPositions[satellite_position]);
				frontend->positionMotor(motorPositions[satellite_position]);
				waitForMotor = abs(satellite_position - currentSatellitePosition) / motorRotationSpeed;
				printf("[zapit] waiting %d seconds for motor to turn satellite dish.\n", waitForMotor);
				eventServer->sendEvent(CZapitClient::EVT_ZAP_MOTOR, CEventServer::INITID_ZAPIT, &waitForMotor, sizeof(waitForMotor));
				sleep(waitForMotor);
				frontend->setCurrentSatellitePosition(satellite_position);
			}
		}
	}

	return satellite_position;
}

void cp(char * from, char * to)
{
	char cmd[256] = "cp -f ";
	strcat(cmd, from);
	strcat(cmd, " ");
	strcat(cmd, to);
	system(cmd);
}

void copy_to_end(FILE * fd, FILE * fd1)
{
	//copies the services from previous services.xml file from the end of sat being scanned to the end of the file...
	char buffer[256] ="";

	fgets(buffer, 255, fd1);
	while(!feof(fd1) && !strstr(buffer, "</zapit>"))
	{
		fputs(buffer, fd);
		fgets(buffer, 255, fd1);
	}
	fclose(fd1);
	unlink(SERVICES_TMP);
}

const char * getFrontendName(void)
{
	if (!frontend)
		return NULL;

	switch (frontend->getInfo()->type) {
	case FE_QPSK:   /* satellite frontend */
		return "sat";
	case FE_QAM:    /* cable frontend */
		return "cable";
	case FE_OFDM:   /* terrestrial frontend */
		return "terrestrial";
	default:        /* unsupported frontend */
		return NULL;
	}
}

void stop_scan(const bool success)
{
	/* notify client about end of scan */
	scan_runs = 0;
	eventServer->sendEvent(success ? CZapitClient::EVT_SCAN_COMPLETE : CZapitClient::EVT_SCAN_FAILED, CEventServer::INITID_ZAPIT);
	if (scanBouquetManager)
	{
		for (vector<CBouquet*>::iterator it = scanBouquetManager->Bouquets.begin(); it != scanBouquetManager->Bouquets.end(); it++)
		{
			for (vector<CZapitChannel*>::iterator jt = (*it)->tvChannels.begin(); jt != (*it)->tvChannels.end(); jt++)
				delete (*jt);
			for (vector<CZapitChannel*>::iterator jt = (*it)->radioChannels.begin(); jt != (*it)->radioChannels.end(); jt++)
				delete (*jt);
		}
		scanBouquetManager->clearAll();
		delete scanBouquetManager;
	}
}


void get_transponder (TP_params *TP)
{
	memcpy(TP,frontend->getParameters(),sizeof(TP_params));
	return;
}

int bla_hiess_mal_fake_pat_hat_aber_nix_mit_pat_zu_tun(transponder_id_t transponder_id, struct dvb_frontend_parameters *feparams, uint8_t polarity, uint8_t DiSEqC)
{
	if (transponder_id == TRANSPONDER_ID_NOT_TUNED)
		return 1;

	if (transponders.find(transponder_id) == transponders.end())
	{
		found_transponders++;

		eventServer->sendEvent
		(
			CZapitClient::EVT_SCAN_NUM_TRANSPONDERS,
			CEventServer::INITID_ZAPIT,
			&found_transponders,
			sizeof(found_transponders)
		);

		transponders.insert
		(
			std::pair<transponder_id_t, transponder>
			(
				transponder_id,
				transponder
				(
					GET_TRANSPORT_STREAM_ID_FROM_TRANSPONDER_ID(transponder_id),
					GET_ORIGINAL_NETWORK_ID_FROM_TRANSPONDER_ID(transponder_id),
					*feparams,
					polarity,
					DiSEqC
				)
			)
		);

		return 0;
	}

	return 1;
}
uint32_t fake_tid, fake_nid;

int get_nits(struct dvb_frontend_parameters *feparams, uint8_t polarization, const t_satellite_position satellite_position, uint8_t DiSEqC)
{
	frequency_kHz_t zfrequency;
	
	zfrequency = FREQUENCY_IN_KHZ(feparams->frequency);
	if(scan_mode)
	{
		fake_tid++; fake_nid++;
		status = bla_hiess_mal_fake_pat_hat_aber_nix_mit_pat_zu_tun(CREATE_TRANSPONDER_ID_FROM_FREQUENCY_SATELLITEPOSITION_ORIGINALNETWORK_TRANSPORTSTREAM_ID(zfrequency, satellite_position,fake_nid,fake_tid), feparams, polarization, DiSEqC);
		return status;
	}
 	eventServer->sendEvent(CZapitClient::EVT_SCAN_REPORT_FREQUENCY,CEventServer::INITID_ZAPIT, &(feparams->frequency),sizeof(feparams->frequency));

	if (frontend->setParameters(feparams, polarization, DiSEqC) < 0)
		return -1;

	if ((status = parse_nit(satellite_position, DiSEqC)) <= -2) /* nit unavailable */
	{
		uint32_t tsid_onid = get_sdt_TsidOnid();
	
		status = bla_hiess_mal_fake_pat_hat_aber_nix_mit_pat_zu_tun(CREATE_TRANSPONDER_ID_FROM_FREQUENCY_SATELLITEPOSITION_ORIGINALNETWORK_TRANSPORTSTREAM_ID(zfrequency, satellite_position,(t_original_network_id)tsid_onid, (t_transport_stream_id)(tsid_onid >> 16)), feparams, polarization, DiSEqC);
	}

	return status;
}

int get_sdts(const t_satellite_position satellite_position, const char * const frontendType)
{
	uint32_t TsidOnid;

	for (stiterator tI = transponders.begin(); tI != transponders.end(); tI++)
		if (GET_SATELLITEPOSITION_FROM_TRANSPONDER_ID(tI->first) == satellite_position)
		{
			if (scan_should_be_aborted)
				return 0;

			/* msg to neutrino */
			processed_transponders++;
			eventServer->sendEvent(CZapitClient::EVT_SCAN_REPORT_NUM_SCANNED_TRANSPONDERS, CEventServer::INITID_ZAPIT, &processed_transponders, sizeof(processed_transponders));

			actual_freq = tI->second.feparams.frequency;
			eventServer->sendEvent(CZapitClient::EVT_SCAN_REPORT_FREQUENCY,CEventServer::INITID_ZAPIT, &actual_freq,sizeof(actual_freq));

			if (!strcmp(frontendType, "sat"))
			{
				actual_polarisation = (uint)tI->second.polarization;
				eventServer->sendEvent(CZapitClient::EVT_SCAN_REPORT_FREQUENCYP,CEventServer::INITID_ZAPIT,&actual_polarisation,sizeof(actual_polarisation));
			}

			if (frontend->setParameters(&tI->second.feparams, tI->second.polarization, tI->second.DiSEqC) < 0)
				continue;

			if(scan_mode)
			{
				TsidOnid = get_sdt_TsidOnid();
				tI->second.transport_stream_id = (TsidOnid >> 16)&0xFFFF;
				tI->second.original_network_id = TsidOnid &0xFFFF;

				INFO("parsing SDT (tsid:onid %04x:%04x)", tI->second.transport_stream_id, tI->second.original_network_id);
				parse_sdt(satellite_position, tI->second.transport_stream_id, tI->second.original_network_id, tI->second.DiSEqC, actual_freq);
			}
			else
			{
				INFO("parsing SDT (tsid:onid %04x:%04x)", tI->second.transport_stream_id, tI->second.original_network_id);
				status = parse_sdt(satellite_position, tI->second.transport_stream_id, tI->second.original_network_id, tI->second.DiSEqC, actual_freq);
		
				if (status == -1)
				{
					TsidOnid = get_sdt_TsidOnid();

					if ((TsidOnid != 0) &&
					    ((tI->second.transport_stream_id != (TsidOnid >> 16)&0xFFFF) || (tI->second.original_network_id != TsidOnid &0xFFFF)))
					{
						tI->second.transport_stream_id = (TsidOnid >> 16)&0xFFFF;
						tI->second.original_network_id = TsidOnid &0xFFFF;

						INFO("parsing SDT (tsid:onid %04x:%04x)", tI->second.transport_stream_id, tI->second.original_network_id);
						parse_sdt(satellite_position, tI->second.transport_stream_id, tI->second.original_network_id, tI->second.DiSEqC, actual_freq);
					}
				}
			}
		}

	return 0;
}

void write_xml_header(FILE * fd)
{
	fprintf(fd, 
		"<?xml version="1.0" encoding="UTF-8"?>\n"
		"<!--\n"
		"  This file was automatically generated by a channel scan.\n"
		"  It will be overwritten by future scans. Therefore, it is advisable, NOT to\n"
		"  make manual changes to this file. For entries to be added, use the file\n"
		"  myservices.xml. Entries to be removed can be put in the file antiservices.xml.\n"
		"  Both reside in the same directory, and has the same syntax as this file.\n"
		"-->\n"
	       "<zapit>\n");
}

void write_xml_footer(FILE *fd)
{
	fprintf(fd, "</zapit>\n");
	fclose(fd);
}

void write_bouquets(const char * const providerName)
{
	if (bouquetMode == CZapitClient::BM_DELETEBOUQUETS)
	{
		INFO("removing existing bouquets");
		unlink(BOUQUETS_XML);
	}

	else if ((bouquetMode == CZapitClient::BM_DONTTOUCHBOUQUETS))
		INFO("leaving bouquets untouched");

	else
		scanBouquetManager->saveBouquets(bouquetMode, providerName);
}

void write_transponder(FILE *fd, const transponder_id_t transponder_id, const transponder & transponder)
{
	bool emptyTransponder = true;

	for (tallchans::const_iterator cI = allchans.begin(); cI != allchans.end(); cI++)
	{
		if (cI->second.getTransponderId() == transponder_id)
		{
			if (emptyTransponder)
			{
				switch (frontend->getInfo()->type)
				{
				case FE_QAM: /* cable */
					fprintf(fd,
						"\t\t<transponder id="%04x" onid="%04x" frequency="%u" inversion="%hu" symbol_rate="%u" fec_inner="%hu" modulation="%hu">\n",
						transponder.transport_stream_id,
						transponder.original_network_id,
						transponder.feparams.frequency,
						transponder.feparams.inversion,
						transponder.feparams.u.qam.symbol_rate,
						transponder.feparams.u.qam.fec_inner,
						transponder.feparams.u.qam.modulation);
					break;

				case FE_QPSK: /* satellite */
					fprintf(fd,
						"\t\t<transponder id="%04x" onid="%04x" frequency="%u" inversion="%hu" symbol_rate="%u" fec_inner="%hu" polarization="%hu">\n",
						one_flag ? one_tpid : transponder.transport_stream_id,
						one_flag ? one_onid : transponder.original_network_id,
						transponder.feparams.frequency,
						transponder.feparams.inversion,
						transponder.feparams.u.qpsk.symbol_rate,
						transponder.feparams.u.qpsk.fec_inner,
						transponder.polarization);
					break;

				case FE_OFDM: /* terrestrial */
					fprintf(fd,
						"\t\t<transponder id="%04x" onid="%04x" frequency="%u" inversion="%hu" bandwidth="%hu" code_rate_HP="%hu" code_rate_LP="%hu" constellation="%hu" transmission_mode="%hu" guard_interval="%hu" hierarchy_information="%hu">\n",
						transponder.transport_stream_id,
						transponder.original_network_id,
						transponder.feparams.frequency,
						transponder.feparams.inversion,
						transponder.feparams.u.ofdm.bandwidth,
						transponder.feparams.u.ofdm.code_rate_HP,
						transponder.feparams.u.ofdm.code_rate_LP,
						transponder.feparams.u.ofdm.constellation,
						transponder.feparams.u.ofdm.transmission_mode,
						transponder.feparams.u.ofdm.guard_interval,
						transponder.feparams.u.ofdm.hierarchy_information);
					break;

				default:
					return;
				}
				emptyTransponder = false;
			}

			// write channels in services.xml by scanType  

			service_wr = false;

			switch ( scanType ) {

				case CZapitClient::ST_TVRADIO:
					if ( (cI->second.getServiceType() == 1 ) || (cI->second.getServiceType() == 2) )
						service_wr=true;
					break;
				case CZapitClient::ST_TV:
					if ( cI->second.getServiceType() == 1 )
						service_wr=true;
					break;
				case CZapitClient::ST_RADIO:
					if ( cI->second.getServiceType() == 2 )
						service_wr=true;
					break;
				case CZapitClient::ST_ALL:
						service_wr=true;
					break;
			}

			if ( service_wr )
			
				if (cI->second.getName().empty())
					fprintf(fd,
						"\t\t\t<channel service_id="%04x" name="%04x" service_type="%02x"/>\n",
						cI->second.getServiceId(),
						cI->second.getServiceId(),
						cI->second.getServiceType());
				else
					fprintf(fd,
						"\t\t\t<channel service_id="%04x" name="%s" service_type="%02x"/>\n",
						cI->second.getServiceId(),
						convert_UTF8_To_UTF8_XML(cI->second.getName().c_str()).c_str(),
						cI->second.getServiceType());
		}
	}

	if (!emptyTransponder)
		fprintf(fd, "\t\t</transponder>\n");
}

bool write_provider(FILE *fd, const char * const frontendType, const char * const provider_name)
{
	bool transponders_found = false;
	transponder_id_t old_tansponderid = 0;

	t_satellite_position satellite_position = getSatellitePosition(provider_name);

	/* channels */
	for (stiterator tI = transponders.begin(); tI != transponders.end(); tI++)
	{
		if (GET_SATELLITEPOSITION_FROM_TRANSPONDER_ID(tI->first) == satellite_position)
		{
			if (!transponders_found)
			{
				transponders_found = true;
				/* cable tag */
				if (!strcmp(frontendType, "cable"))
				{
					fprintf(fd, "\t<%s name="%s">\n", frontendType, provider_name);
				}
				/* satellite tag */
				else
				{
					// DiSEqC of first transponder of this provider
					fprintf(fd, "\t<%s name="%s" diseqc="%hd">\n", frontendType, provider_name, tI->second.DiSEqC);
				}
			}
			if (old_tansponderid != CREATE_TRANSPONDER_ID_FROM_FREQUENCY_SATELLITEPOSITION_ORIGINALNETWORK_TRANSPORTSTREAM_ID(GET_FREQUENCY_FROM_TRANSPONDER_ID(tI->first), GET_SATELLITEPOSITION_FROM_TRANSPONDER_ID(tI->first), tI->second.original_network_id, tI->second.transport_stream_id)) {
				old_tansponderid = CREATE_TRANSPONDER_ID_FROM_FREQUENCY_SATELLITEPOSITION_ORIGINALNETWORK_TRANSPORTSTREAM_ID(GET_FREQUENCY_FROM_TRANSPONDER_ID(tI->first), GET_SATELLITEPOSITION_FROM_TRANSPONDER_ID(tI->first), tI->second.original_network_id, tI->second.transport_stream_id);
				write_transponder(fd, old_tansponderid, tI->second);
			}
			else printf("tansponder " PRINTF_TRANSPONDER_ID_TYPE " not written\n", old_tansponderid );
		}
	}
	
	if (transponders_found)  // this indicates that services have been found and that bouquets should be written...
	{
		/* end tag */
		fprintf(fd, "\t</%s>\n", frontendType);
	}

	return transponders_found;
}

int scan_transponder(xmlNodePtr transponder, const t_satellite_position satellite_position, uint8_t diseqc_pos)
{
	uint8_t polarization = 0;
	struct dvb_frontend_parameters feparams;
	memset(&feparams, 0x00, sizeof(struct dvb_frontend_parameters));

	feparams.frequency = xmlGetNumericAttribute(transponder, "frequency", 0);
	feparams.inversion = INVERSION_AUTO;

	/* cable */
	if (frontend->getInfo()->type == FE_QAM)
	{
		feparams.u.qam.symbol_rate = xmlGetNumericAttribute(transponder, "symbol_rate", 0);
		feparams.u.qam.fec_inner = (fe_code_rate_t) xmlGetNumericAttribute(transponder, "fec_inner", 0);
		feparams.u.qam.modulation = (fe_modulation_t) xmlGetNumericAttribute(transponder, "modulation", 0);
		diseqc_pos = 0;
	}

	/* satellite */
	else if (frontend->getInfo()->type == FE_QPSK)
	{
		feparams.u.qpsk.symbol_rate = xmlGetNumericAttribute(transponder, "symbol_rate", 0);
		feparams.u.qpsk.fec_inner = (fe_code_rate_t) xmlGetNumericAttribute(transponder, "fec_inner", 0);
		polarization = xmlGetNumericAttribute(transponder, "polarization", 0);
	}

	/* terrestrial */
	else if (frontend->getInfo()->type == FE_OFDM)
	{
		feparams.u.ofdm.bandwidth = (fe_bandwidth_t) xmlGetNumericAttribute(transponder, "bandwidth", 0);
		feparams.u.ofdm.code_rate_HP = FEC_AUTO;
		feparams.u.ofdm.code_rate_LP = FEC_AUTO;
		feparams.u.ofdm.constellation = QAM_AUTO;
		feparams.u.ofdm.transmission_mode = TRANSMISSION_MODE_AUTO;
		feparams.u.ofdm.guard_interval = GUARD_INTERVAL_AUTO;
		feparams.u.ofdm.hierarchy_information = HIERARCHY_AUTO;
	}

		/* read network information table */
	status = get_nits(&feparams, polarization, satellite_position, diseqc_pos);

	return 0;
}

void scan_provider(xmlNodePtr search, const char * const providerName, uint8_t diseqc_pos, const char * const frontendType)
{
	t_satellite_position satellite_position = driveMotorToSatellitePosition(providerName);

	/* remove all (previous) transponders from current satellite position */
	for (stiterator tI = transponders.begin(); tI != transponders.end();)
	{
		if (GET_SATELLITEPOSITION_FROM_TRANSPONDER_ID(tI->first) == satellite_position)
		{
			for (tallchans::iterator cI = allchans.begin(); cI != allchans.end(); )
			{
				if (cI->second.getTransponderId() == tI->first)
				{
					tallchans::iterator remove_this = cI;
					cI++;
					allchans.erase(remove_this);
				}
				else
					cI++;
			}
			stiterator tmp = tI;
			tI++;
			transponders.erase(tmp);
		}
		else
			tI++;
	}

	xmlNodePtr transponder = NULL;

	/* send sat name to client */
	eventServer->sendEvent(CZapitClient::EVT_SCAN_SATELLITE, CEventServer::INITID_ZAPIT, providerName, strlen(providerName) + 1);
	transponder = search->xmlChildrenNode;

	/* read all transponders */
	while ((transponder = xmlGetNextOccurence(transponder, "transponder")) != NULL)
	{
		if (scan_should_be_aborted)
			return;

		scan_transponder(transponder, satellite_position, diseqc_pos);

		/* next transponder */
		transponder = transponder->xmlNextNode;
	}

	/*
	 * parse:
	 * service description table,
	 * program association table,
	 * bouquet association table,
	 * network information table
	 */
	status = get_sdts(satellite_position, frontendType);

	/*
	 * channels from PAT do not have service_type set.
	 * some channels set the service_type in the BAT or the NIT.
	 * should the NIT be parsed on every transponder?
	 */
	std::map <t_channel_id, uint8_t>::iterator stI;
	for (stI = service_types.begin(); stI != service_types.end(); stI++)
	{
		tallchans_iterator scI = allchans.find(stI->first);

		if (scI != allchans.end())
		{
			if (scI->second.getServiceType() != stI->second)
			{
				switch (scI->second.getServiceType()) {
				case ST_DIGITAL_TELEVISION_SERVICE:
				case ST_DIGITAL_RADIO_SOUND_SERVICE:
				case ST_NVOD_REFERENCE_SERVICE:
				case ST_NVOD_TIME_SHIFTED_SERVICE:
					break;
				default:
					INFO("setting service_type of channel_id " PRINTF_CHANNEL_ID_TYPE " from %02x to %02x",
						stI->first,
						scI->second.getServiceType(),
						stI->second);
					scI->second.setServiceType(stI->second);
					break;
				}
			}
		}
	}
}

void *start_scanthread(void *scanmode)
{
	FILE * fd;
	char providerName[32] = "";
	char providerName2[32] = "";
	const char * frontendType;
	uint8_t diseqc_pos = 0;
	bool scan_success = false;
	scanBouquetManager = new CBouquetManager();
	processed_transponders = 0;
 	found_tv_chans = 0;
 	found_radio_chans = 0;
 	found_data_chans = 0;

	curr_sat = 0;
	one_flag = false;

	scan_should_be_aborted = false;

        if ((frontendType = getFrontendName()) == NULL)
	{
		WARN("unable to scan without a supported frontend");
		stop_scan(false);
		pthread_exit(0);
	}
	if(scanmode)
		scan_mode = true;
	else
		scan_mode = false;
	printf("[zapit] scan mode %s\n", scan_mode ? "fast" : "full");
	fake_tid = fake_nid = 0;

	/* get first child */
	xmlNodePtr search = xmlDocGetRootElement(scanInputParser)->xmlChildrenNode;

	while ((search = xmlGetNextOccurence(search, frontendType)) != NULL)
	{
		/* get name of current satellite oder cable provider */
		strcpy(providerName, xmlGetAttribute(search, "name"));

		for (spI = scanProviders.begin(); spI != scanProviders.end(); spI++)
			if (!strcmp(spI->second.c_str(), providerName))
			{
				strncpy(providerName2, providerName, 30);
				/* increase sat counter */
				curr_sat++;

				/* satellite receivers might need diseqc */
				if (frontend->getInfo()->type == FE_QPSK)
					diseqc_pos = spI->first;
				if (diseqc_pos == 255 /* = -1 */)
					diseqc_pos = 0;

				scan_provider(search, providerName, diseqc_pos, frontendType);

				break;
			}

		/* go to next satellite */
		search = search->xmlNextNode;
	}

	if (!scan_should_be_aborted)
	{
		/*
		 * now write all the stuff
		 */
		if (!(fd = fopen(SERVICES_XML, "w")))
		{
			WARN("unable to open %s for writing", SERVICES_XML);
			goto abort_scan;
		}
		write_xml_header(fd);

		if (frontend->getInfo()->type == FE_QPSK)
		{
			search = xmlDocGetRootElement(scanInputParser)->xmlChildrenNode;

			while ((search = xmlGetNextOccurence(search, frontendType)) != NULL)
			{
				/* write services */
				if (write_provider(fd, frontendType, xmlGetAttribute(search, "name")))
					scan_success = true;
			
				/* go to next satellite */
				search = search->xmlNextNode;
			}
		}
		else
			scan_success = write_provider(fd, frontendType, providerName2);
	
		write_xml_footer(fd);
		chmod(SERVICES_XML, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH);

		/* write bouquets if transponders were found */
		if (scan_success)
			write_bouquets(providerName2);
	}

 abort_scan:
	/* report status */
	INFO("found %d transponders and %d channels", found_transponders, found_channels);

	/* load new services */
	CZapitClient myZapitClient;
	myZapitClient.reinitChannels();

	stop_scan(true);
	pthread_exit(0);
}
void scan_clean(void)
{
	scan_should_be_aborted = true;
}
int copy_to_satellite_inc(TP_params * TP, FILE * fd, FILE * fd1, char * providerName)
{
	//copies services from previous services.xml file from start up to the sat that is being scanned...
	char buffer[256] = "";
	int found = 0;
	char * ptr;

	char freq[50], pol[50], rate[50], fec[50];
	//look for sat to be scanned... or end of file

	sprintf(freq, "frequency="%d"", TP->feparams.frequency);
	sprintf(rate, "symbol_rate="%d"", TP->feparams.u.qpsk.symbol_rate);
	sprintf(fec, "fec_inner="%d"", TP->feparams.u.qpsk.fec_inner);
	sprintf(pol, "polarization="%d"", TP->polarization);

	DBG("%s %s %s %s", freq, rate, fec, pol);

	fgets(buffer, 255, fd1);
	//while(!feof(fd1) && !((strstr(buffer, "sat name") && strstr(buffer, providerName)) || strstr(buffer, "</zapit>")))
	while(!feof(fd1) && !strstr(buffer, "</zapit>"))
	{
		if( strstr(buffer, "sat name") && strstr(buffer, providerName) )
		{
			found = 1;
		}
		else if (strstr(buffer, "</sat>") && found)
			break;
		if(!one_flag && found && strstr(buffer, "<transponder id") && strstr(buffer, freq) && strstr(buffer, rate) && strstr(buffer, fec) && strstr(buffer, pol))
		{
			if( (ptr = strstr(buffer, " id=")))
				sscanf(ptr+5, "%4x", &one_tpid);
			if( (ptr = strstr(buffer, " onid=")))
				sscanf(ptr+7, "%4x", &one_onid);
			one_flag = true;

			DBG("found id %x/%x %s %s %s %s", one_tpid, one_onid, freq, rate, fec, pol);
			while(!feof(fd1) && !strstr(buffer, "</transponder>"))
				fgets(buffer, 255, fd1);
		}
		else
			fputs(buffer, fd);
		fgets(buffer, 255, fd1);
	}

	return found;
}
int scan_transponder(TP_params *TP)
{
/* only for testing, please remove <- wtf? */

	FILE* fd;
	FILE* fd1;
	struct stat buffer; 
	const char * frontendType = getFrontendName();
	char providerName[32] = "";
	t_satellite_position satellite_position;
	uint8_t diseqc_pos = 0;
	int prov_found = 0;

	one_flag = false;
        found_transponders = 0;
        found_channels = 0;
        processed_transponders = 0;
        found_tv_chans = 0;
        found_radio_chans = 0;
        found_data_chans = 0;
	fake_tid = fake_nid = 0;

	transponders.clear();

	scanBouquetManager = new CBouquetManager();

	printf("[scan_transponder] freq %d rate %d fec %d pol %d\n", TP->feparams.frequency, TP->feparams.u.qpsk.symbol_rate, TP->feparams.u.qpsk.fec_inner, TP->polarization);

	//scanProviders[TP->diseqc] = "Test";

	strcpy(providerName, scanProviders.begin()->second.c_str());
	//strcpy(providerName, "Test");
	diseqc_pos = scanProviders.begin()->first;

	printf("[scan_transponder] scanning sat %s diseqc %d\n", providerName, diseqc_pos);
	eventServer->sendEvent(CZapitClient::EVT_SCAN_SATELLITE, CEventServer::INITID_ZAPIT, providerName, strlen(providerName) + 1);

	scan_mode = true;
	TP->feparams.inversion = INVERSION_AUTO;

	satellite_position = driveMotorToSatellitePosition(providerName);

	get_nits(&(TP->feparams), TP->polarization, satellite_position, diseqc_pos);
	status = get_sdts(satellite_position, frontendType);

	if(allchans.empty())
	{
		printf("[scan_transponder] nothing found!\n");
		allchans.clear();
		transponders.clear();
		status = 0;
		goto abort_scan;
	}

	/* copy services.xml to /tmp directory */
	if(stat(SERVICES_XML, &buffer) == 0)
	{
  		if (buffer.st_size > 0)
		{
			cp(SERVICES_XML, SERVICES_TMP);
		}
	}
	fd = fopen(SERVICES_XML, "w");

	if ((fd1 = fopen(SERVICES_TMP, "r")))
		prov_found = copy_to_satellite_inc(TP, fd, fd1, providerName);
	else
		write_xml_header(fd);

//printf("found : %d\n", prov_found); fflush(stdout);
	/* write services */
	if(!prov_found)
		write_provider(fd, frontendType, providerName);
	else
	{
		/* channels */
		for (stiterator tI = transponders.begin(); tI != transponders.end(); tI++)
			write_transponder(fd, CREATE_TRANSPONDER_ID_FROM_FREQUENCY_SATELLITEPOSITION_ORIGINALNETWORK_TRANSPORTSTREAM_ID(GET_FREQUENCY_FROM_TRANSPONDER_ID(tI->first), GET_SATELLITEPOSITION_FROM_TRANSPONDER_ID(tI->first), tI->second.original_network_id, tI->second.transport_stream_id), tI->second);
		fprintf(fd, "\t</%s>\n", frontendType);
		allchans.clear();
		transponders.clear();
	}

	if (fd1)
		copy_to_end(fd, fd1);

	write_xml_footer(fd);

	write_bouquets(providerName);
	status = 1;

abort_scan:
	stop_scan(status);
	DBG("[scan_transponder] done scan freq %d rate %d fec %d pol %d\n", TP->feparams.frequency, TP->feparams.u.qpsk.symbol_rate, TP->feparams.u.qpsk.fec_inner, TP->polarization);
	return status;
}

Stephan_W
Neugieriger
Neugieriger
Beiträge: 6
Registriert: Samstag 16. Oktober 2004, 19:50

Beitrag von Stephan_W »

Hallo,
Nico 77 hat geschrieben: Das habe ich repariert, der Source liegt noch hier:
http://forum.tuxbox-cvs.sourceforge.net ... hp?t=37384&
Den behobenen Fehler will nur keiner einchecken, weil dann wohl irgendwas im Kabel spinnt was vollkommen falsch ist, habe hier schliesslich Kabel. :evil:
Im CVS wird immer Kabelcom Rheinhessen statt der eigene Kabelprovider geschrieben.
Im CVS wird bei Rotoranlagen auch immer der letzte Eintrag aus der satellites.xml übernommen.
Es juckt halt keinen sonst........
Danke fuer den Quelltext. Mein Problem ist nur, dass ich inzwischen zwar endlich SUSE installiert habe, aber noch keine Zeit hatte, das ganze Projekt zu holen und zu kompilieren. Du hast nicht zufaellig ein Deine Aenderung in ein Image eingefuegt, das Du mir zukommen lassen koenntest.
Fuer mir ist der Fehler im Sendersuchlauf eigentlich so der letzte Punkt, der mich noch ganz gravierend stoert, denn umsteigen auf Enigma kommt fuer mich nicht in Frage.

Gruss
Stephan
mb405
Tuxboxer
Tuxboxer
Beiträge: 2331
Registriert: Donnerstag 24. März 2005, 21:52

Beitrag von mb405 »

@Nico 77
also wenn ich die scan.cpp so ändere bekomme ich den fehler beim compilieren.
neutrino.o(.text+0xabdc): In function `CNeutrinoApp::InitScanSettings(CMenuWidget&)':
: undefined reference to `CScanTs::CScanTs[in-charge]()'
collect2: ld returned 1 exit status
make[4]: *** [neutrino] Fehler 1
wenn ich da richtig sehe, muss wohl die neutrino.cpp mit geändert werden ?
mb405
Tuxboxer
Tuxboxer
Beiträge: 2331
Registriert: Donnerstag 24. März 2005, 21:52

Beitrag von mb405 »

oh ich depp
es gibt 2 scan.cpp in neutrino, und in zapit :o
martie
Interessierter
Interessierter
Beiträge: 55
Registriert: Samstag 14. September 2002, 20:07

Beitrag von martie »

Ich habs grad durch Zufall gelesen..... Ich freu mich, das es hier vorran geht!!!!

Dickes großes Lob!!!
Greetz Martie
Nico 77
Semiprofi
Semiprofi
Beiträge: 1383
Registriert: Freitag 18. April 2003, 15:12

Beitrag von Nico 77 »

Es gibt auch einen Wavefrontier Patch, kriege den leider nicht im aktuellen CVS ans laufen.

http://forum.tuxbox-cvs.sourceforge.net ... hp?t=39081

Nur die verbugte Zapit hat wohl keiner Bock zu fixen, die seit den guten aber schlecht umgesetzten thegoodguy Patches im Januar/Februar 2005 nach jeder zweiten Kanalsuche abschmiert. :oops:

Also voran geht es in Richtung Bugfixes nicht wirklich.
Houdini
Developer
Beiträge: 2183
Registriert: Mittwoch 10. Dezember 2003, 07:59

Beitrag von Houdini »

@Nico
Einen Bug bei der manuellen Kanalsuche (Absturz bei der zweiten Suche) hab ich gefixt, liegt im Bugtracker.
Ob du den meinst weiss ich aber nicht.

Houdini
Nico 77
Semiprofi
Semiprofi
Beiträge: 1383
Registriert: Freitag 18. April 2003, 15:12

Beitrag von Nico 77 »

Probiere ich aus danke. :)

Seit dem damals die Bouquet und Diseqc Verhalten geändert wurden stürtzt die zapit nach einer Kanalsuche manchmal ab.
Services usw werden korrekt geschrieben, nur die Zapit geht wenn sie einen Sender anzappen soll einfach aus oder sie verliert den socket.
Nico 77
Semiprofi
Semiprofi
Beiträge: 1383
Registriert: Freitag 18. April 2003, 15:12

Beitrag von Nico 77 »

Houdini hat geschrieben:@Nico
Einen Bug bei der manuellen Kanalsuche (Absturz bei der zweiten Suche) hab ich gefixt, liegt im Bugtracker.
Ob du den meinst weiss ich aber nicht.

Houdini
Scheint tatsächlich zu funken, bisher keinen Absturz der zapit mehr gehabt.

Ein Traum, das macht die Kanalsuche endlich wieder richtig benutzbar, danke. :D