JustCute Posted August 5, 2005 Share Posted August 5, 2005 ...Sorry hab ich nicht. War noch mit Deinem ersten Wurf beschäftigt. Hast Du dies Fragment in Deine Sourcen integriert und läuftst? ... <{POST_SNAPBACK}> Nein hab gedacht ich post nur mal so... SICHER FUNZT DER CODE! und aus unseren object-Array stellen wir nun die Datentypen wieder her: for (int i = 0; i < count; i++) { int epgChanId = int.Parse(epgs[i,0].ToString()); int eventId = int.Parse(epgs[i,1].ToString()); DateTime start = DateTime.Parse(epgs[i,2].ToString()); TimeSpan duration = DateTime.Parse(epgs[i,3].ToString()).TimeOfDay; string category = epgs[i,4].ToString(); string title = epgs[i,5].ToString(); string description = epgs[i,6].ToString(); byte charSet = byte.Parse(epgs[i,7].ToString()); byte content = byte.Parse(epgs[i,8].ToString()); } Quote Link to comment
Guest Lars_MQ Posted August 5, 2005 Share Posted August 5, 2005 Nein hab gedacht ich post nur mal so... SICHER FUNZT DER CODE! Quote Link to comment
Skyscraper Posted August 5, 2005 Share Posted August 5, 2005 (edited) Ich hab einfach die Videos aufn RW gebrannt (Wollt weitermachen ehe man mein Prog ganz vergisst ) Naja also ich habs geschafft! Habe jetzt Version 0.1.1.3 (natürlich immernoch eine Beta) fertig!!! Noch kann man das nirgendwo runterladen... Ich werd morgen sehen, dass ich vllt. das in die MemberArea laden kann! Ansonsten gehts halt nur auf Anfrage! MfG Skyscraper PS: Neue Screens und ein Supportsystem unter DVBViewer-Plugins EDIT: Ein Changelog gibts da auch (Da die Version 0.1.1.2 eh nur Rayman hatte für euch nicht so interressant) Edited August 5, 2005 by Skyscraper Quote Link to comment
Benson Posted August 6, 2005 Share Posted August 6, 2005 (edited) @JustCute Das mit der Objekt / Array Interpretierung hätte ich wohl kaum hinbekommen. Hast du beruflich mit .NET Programmierung zu tun oder wieso kennst du dich mit der Materie so gut aus? Ich habe noch nie C# programmiert, aber dieses von dir geführte Praxistutorial war eine gute erste Erfahrung für mich. Die Abarbeitung der Suchanfrage geht nun wie erwartet wesentlich flotter mit der GetAsArray() Methode. Den Fortschrittsbalken brauche ich eigentlich gar nicht mehr. Die Suche dauert jetzt durchschnittlich 2-3 Sekunden (vorher schätzungsweise 10-15 Sekunden). Jetzt muß ich nur noch wieder an die Channeldaten kommen, um den Sendernamen und die ChannelID für TimerManager.AddItem() zu haben. Aber das bekomme wohl auch noch hin. Edited August 6, 2005 by Benson Quote Link to comment
yaRincewind Posted August 6, 2005 Share Posted August 6, 2005 @Skyscraper Herzlichen Glückwunsch Ich muss jetzt auf eine Hochzeit, dann habe ich etwas Zeit und werde mir dein PlugIn sehr gerne näher angucken Quote Link to comment
JustCute Posted August 6, 2005 Share Posted August 6, 2005 Jup hab beruflich mit .NET / C# zu tun. Ich habe noch nie C# programmiert, aber dieses von dir geführte Praxistutorial war eine gute erste Erfahrung für mich. <{POST_SNAPBACK}> Ausgezeichnet darum gings Jetzt muß ich nur noch wieder an die Channeldaten kommen, um den Sendernamen und die ChannelID für TimerManager.AddItem() zu haben. Aber das bekomme wohl auch noch hin.<{POST_SNAPBACK}> Das hast sicher schon in den Unterlagen zur COM gefundenepgChanId = ITuner.SID + ITuner.TransportStreamID * 65536 und das löst man entweder Binär mit & (binäres und) und >> (verschiebt um die angegebenen Bits nach rechts) oder mit % (Modulo) und Division (bei int verschwinden magisch die nachkommastellen ) sind je 2 zeilen. Dank SID kann man dann von der ChannelCollection mit GetChannelName(sid) den Namen des Chan rausbekommen. Viel Spaß Quote Link to comment
Griga Posted August 6, 2005 Share Posted August 6, 2005 Dank SID kann man dann von der ChannelCollection mit GetChannelName(sid) den Namen des Chan rausbekommen. Kann mehrdeutig sein. Insbesondere wenn es mehrere SAT-Positionen in der Liste gibt, können verschiedene Sender die gleiche ServiceID haben. Manchmal auch innerhalb einer SAT-Position, obwohl das eigentlich nicht erlaubt ist. Auf Astra kommt das nicht vor, da herrscht Ordnung, aber z.B. bei Exoten mit Feeds... Deshalb wurde die Transportstream-ID noch mit reingequetscht. Wenn möglich, sollte sie auch benutzt werden. Quote Link to comment
JustCute Posted August 6, 2005 Share Posted August 6, 2005 hmm ich kann keinen unterschied feststellen chans.GetChannelname(epgChanId) liefert die selben Results wie chans.GetChannelname(sId) Quote Link to comment
Griga Posted August 6, 2005 Share Posted August 6, 2005 Das hängt vom Inhalt der Kanalliste und der Reihenfolge der Sender ab (welcher wird zuerst gefunden). Die Anwender haben verschiedene . Außerdem ist die Frage, wie chans.GetChannelname(sId) implementiert ist - müsste Lars was zu sagen. Ich weiß nicht, ob die Transportstream-ID im HiWord des übergebenen Wertes berücksichtigt wird. Quote Link to comment
Skyscraper Posted August 6, 2005 Share Posted August 6, 2005 @yaRincewind Ich bin jetzt wieder Zuhause! War seit 10 bis ebn weg MfG Skyscraper Quote Link to comment
one Posted August 7, 2005 Share Posted August 7, 2005 Entschuldigt meine frage: Wird es das tool auch mit einer option zur automatischen programmierung der "aufnahmeliste" geben ? So daß der DVBViewer, wenn das epg was neues gefunden hat (zum beispiel nach dem "abgrasen" aller epg-sender) sich gleich selbst programmiert und aufnimmt ? Wird es dann auch prioritäten geben und automatisches überschreiben älterer und unwichtigerer aufnahmen (so wie es im VDR möglich ist) ? Oder ist das alles momentan noch nicht aktuell ? One Quote Link to comment
JustCute Posted August 7, 2005 Share Posted August 7, 2005 Wird es das tool auch mit einer optionzur automatischen programmierung der "aufnahmeliste" geben ? So daß der DVBViewer, wenn das epg was neues gefunden hat (zum beispiel nach dem "abgrasen" aller epg-sender) sich gleich selbst programmiert und aufnimmt ? Wird es dann auch prioritäten geben und automatisches überschreiben älterer und unwichtigerer aufnahmen (so wie es im VDR möglich ist) ? <{POST_SNAPBACK}> Macht das CommandLineTool schon, fragt nach ob das gefundene Element aufgenommen werden soll (im DVBViewer) oder wenn es sich mit einer Aufnahme überschneidet, wird in die Console geschrieben, wann die Aufnahme gewesen wäre. Das mit dem überschreiben ist eine eigene Geschichte, da es Timers gibt die mehrmals laufen (z.B. Mo-Fr) die müsste man nachher wieder zurücksetzten. Quote Link to comment
admi-ral Posted August 7, 2005 Share Posted August 7, 2005 @one: ich habe da mal ein script geschrieben, dass ein Löschen von alten Aufnahmen bei ungenügendem Speicherplatz auslöst. Da das ganze letztendlich nur von mir getestet wurde und doch etwas komplex ist, werde ich eine erste alpha demnächst hochladen. Die Möglichkeit zum Löschen nach Datum (heute+x) besteht auch, aber daran müsste noch gefeilt werden gruß, admi-ral Quote Link to comment
Benson Posted August 7, 2005 Share Posted August 7, 2005 Wird es das tool auch mit einer optionzur automatischen programmierung der "aufnahmeliste" geben ? Ich habe ein solches Script mit VBScript angefangen, es ist aber noch nicht ganz fertig. Das Ganze sollte dann folgendermaßen funktionieren: - das AutoTimer Script wird als täglicher Systemtask eingebunden - das EPGUpdate Script von mir läuft ebenfalls als täglicher Systemtask, idealerweise direkt vor dem AutoTimer Script - das AutoTimer Script untersucht dann immer nur die nächsten 24 Stunden - man kann eine Liste von Suchbegriffen vordefinieren - die Timer, die aus den Fundergebnissen resultieren, werden automatisch übernommen Es fehlt noch das Verhalten bei Überschneidungen. Richtig cool wäre es natürlich, wenn man hier die Suchbegriffe irgendwie gewichten könnte. So nach dem Motto: "Das ist mir wichtiger als das andere". Da Justcute ja auch ein Beispiel eines C# Kommandozeilen Programms gepostet hat, überlege ich gerade, ob ich die Idee nicht nach C# portiere. VBScript gefällt mir nicht so gut, ich mag die Sprache einfach nicht. Quote Link to comment
JustCute Posted August 7, 2005 Share Posted August 7, 2005 (edited) oh um alte RECORDS und nicht Recordeinträge gings Hab wieder n Stücken Code für euch, was die Files anfindet und aus dem Filenamen die Infos laut DVBViewer Settings ausließt. TODOs beachten public void FindFiles() { string fileFormat = DVBViewer.GetSetupValue("General", "NameScheme", "%date_%time_%station_%event"); string recordPath = DVBViewer.GetSetupValue("General", "CaptureDir", @"Capture\"); Regex fileRegEx = new Regex(fileFormat.Replace("%date", datePattern).Replace("%time", timePattern) .Replace("%station", stationPattern).Replace("%event", eventPattern) + @"\..+"); string[] files = Directory.GetFiles(recordPath); ArrayList recordedOn = new ArrayList(); ArrayList recordedFile = new ArrayList(); // Das Datum der Files auslesen for (int i = 0; i < files.Length; i++) { string file = files[i]; Match m = fileRegEx.Match(file); if (m.Success) { // TODO: Wenn der Tag in diesem Jahr der Zukunft liegt, gehört das Vorjahr genommen - nun wird buggy ab Neujahr :) recordedOn.Add(new DateTime(DateTime.Now.Year, int.Parse(m.Groups["month"].Captures[0].Value), int.Parse(m.Groups["day"].Captures[0].Value), int.Parse(m.Groups["hour"].Captures[0].Value), int.Parse(m.Groups["minute"].Captures[0].Value), int.Parse(m.Groups["second"].Captures[0].Value))); recordedFile.Add(file); } } // TODO: Ältestes Datum suchen und entfernen // File.Delete(files[indexOfOldestFile]); <-- mit try-catch-Block IRecordManager recMgr = DVBViewer.RecordManager; for (int i = recMgr.Count - 1; i >= 0; i--) { if (!File.Exists(recMgr[i].Filename)) { recMgr.DeleteEntry(recMgr[i].recID); } } } EDIT: Code Teil hinzugefügt was Lars angesprochen hat (im Post darunter). Alle nicht mehr vorhandenen Recordings werden nun aus der Datenbank geworfen. Edited August 7, 2005 by JustCute Quote Link to comment
Guest Lars_MQ Posted August 7, 2005 Share Posted August 7, 2005 Das ist keine so schlaue idee, da es die datenbank nicht berücksichtigt. Alle aufzeichnungen werden in die Datenbank eingetragen und können per IRecordManager und IRecording ausgelesen / gelöscht werden. Das zu umgehen führt zwar zu keinen problemen, macht aber die datenbanlk und damit die anzeige inkonsistent. Ich rate daher von sowas ab. Abgesehn davon wird sich in naher zukunft das Handling der Recordings wahrscheinlich ändern (multiple aufnahmeverzeichnisse etc) Quote Link to comment
one Posted August 7, 2005 Share Posted August 7, 2005 Wahnsinn, was da alles schon geht. danke für die ausführlichen Antworten! One Quote Link to comment
erwin Posted August 8, 2005 Share Posted August 8, 2005 ...Sorry hab ich nicht. War noch mit Deinem ersten Wurf beschäftigt. Hast Du dies Fragment in Deine Sourcen integriert und läuftst? ... <{POST_SNAPBACK}> Nein hab gedacht ich post nur mal so... SICHER FUNZT DER CODE! <{POST_SNAPBACK}> O.K., die Frage war blöd formuliert. Mir gings um Folgendes: Die besagte Funktion versuche ich schon eine geraume Zeit unter C++ zu verwenden. Ohne Erfolg. Wie es prinzipiell geht, weiß ich, Ich hatte nun die Vermutung das Du auch nur die prinzipielle Verwendung unter C# skizziert hast. Das es - wenn es richtig verwendet wird - FUNZT, bezweifel ich nicht. Super dass man bei Dir einen kleinen C# Exkurs bekommt. C# ist auch für mich nicht so geläufig. Wäre es Dir möglich zusätzlich zu Deiner inkrementellen Methode noch den jeweils zuammengefassten Komplettcode zu Posten (als zip). Wenn Du nicht alles public machen willst, mir wäre auch an einer abgespeckten Version in der aber die besagte GetAsArray-Funktion Anwendung findet gelegen. Ich hätte dann ein funktionierenden Referenz-Beispiel. mfG erwin Quote Link to comment
JustCute Posted August 8, 2005 Share Posted August 8, 2005 Sodala damit hoffentlich alle deine Fragen geklärt sind, hier n Stückerl Code das dir helfen sollte. Folgenden Code schmeißt einfach in die public static void Main Methode DVBViewer DVBViewer = (DVBViewer)Marshal.GetActiveObject("DVBViewerServer.DVBViewer"); IEPGManager epgMgr = DVBViewer.EPGManager; object temp; int count = epgMgr.GetAsArray(0, DateTime.Now, DateTime.Now.AddDays(5), out temp); object[,] epgs = temp as object[,]; for (int i = 0; i < count; i++) { int epgChanId = int.Parse(epgs[i,0].ToString()); int eventId = int.Parse(epgs[i,1].ToString()); DateTime start = DateTime.Parse(epgs[i,2].ToString()); TimeSpan duration = DateTime.Parse(epgs[i,3].ToString()).TimeOfDay; string category = epgs[i,4].ToString(); string title = epgs[i,5].ToString(); string description = epgs[i,6].ToString(); byte charSet = byte.Parse(epgs[i,7].ToString()); byte content = byte.Parse(epgs[i,8].ToString()); // TODO: Verarbeitung der Daten } Quote Link to comment
erwin Posted August 9, 2005 Share Posted August 9, 2005 @ JustCute Danke. Hat mir wirklich geholfen. Debugger an, Memory gecheckt und dann fiehls mir wieder ein. Da war doch was mit Pascal/Delphi? Richtig, das Memory-Layout von 2D Arrays ist genau anders herum wie bei C/C++! Bingo! Also an alle C++-Mitleser mit Problemen bei der Anwendung von GetAsArray()! Die normale C/C++-Indizierungsmethode könnt ihr hier NICHT verwenden. Selbstausrechnen der Offsets bei gegebenen Zeilen/Spalten ist angesagt (macht sonst der Compiler). Kaum machts man richtig , schon läufts. Und das schön schnell!. Übrigens JustCute hast Du mir richtig Geschmak auf C# gemacht. Sieht alles so elegant aus. Was Du mit einer Zeile umsetzt geriert, unter C++ zu 5 bis 10 Zeilen! Die ganze VARIANT und COM-Friemelei alles schön verpackt und transparent. @ Lars Den vermeintlichen von mir gemeldeten Bug weiter oben im Thread kannst Du vergessen. Sorry für die Fehlmeldung. Aber eine neue Frage habe ich. Aus Deinem Code-Schnipsel ist ersichlich wie das Array kreirt wird. Frage: Wer ist eigentlich für die Freigabe der belegten Ressourcen verantwortlich. Ich nehme stark an der Caller! Und wenn das stimmt wie? Unter C gibts 'SafeArrayDestroy( )'. Aber ist das wirklich die zuständige Funktion für unter Delphi-kreeirter SAFEARRAY'S? Wäre wahrscheinlich sicherer Du bietest dafür eine zusätzliche Methode an der COM-Schnittstelle an. mfG erwin Quote Link to comment
JustCute Posted August 9, 2005 Share Posted August 9, 2005 Übrigens JustCute hast Du mir richtig Geschmak auf C# gemacht. Sieht alles so elegant aus. Was Du mit einer Zeile umsetzt geriert, unter C++ zu 5 bis 10 Zeilen! Die ganze VARIANT und COM-Friemelei alles schön verpackt und transparent.<{POST_SNAPBACK}> jo imho beste spache ever und beim 2er Framework sind dann auch endlich die "Kinderkrankheiten" beseitig aber das dauert noch n bissi... Quote Link to comment
Benson Posted August 10, 2005 Share Posted August 10, 2005 Das Kommandozeilenprogramm von JustCute, dessen Code er in Post #25 gepostet hat, enthält einen kleinen, aber entscheidenden Fehler. Die Zeile Regex.Match(patterns[k], epg.Title, RegexOptions.IgnoreCase).Success) muss durch Regex.Match(epg.Title, patterns[k], RegexOptions.IgnoreCase).Success) ersetzt werden. Trotzdem insgesamt sehr brauchbare Vorarbeit von JustCute. Quote Link to comment
JustCute Posted August 10, 2005 Share Posted August 10, 2005 danke! den fehler hab ich ausgebessert Quote Link to comment
Skyscraper Posted November 6, 2005 Share Posted November 6, 2005 Also wenn ich den Thread nochmal wieder hervorkramen darf... Ich hab jetzt wieder mehr Zeit (weniger Schule ) und werde jetzt wieder mit meinem EPG-Search weiterprogrammieren... Ich weiß nicht ob Rayman es noch braucht (*hoff*) aber ich mach trozdem weiter.... Ich habe ja bereits Version 0.1.1.3 fertig... (Angefangen bei 0.1.1.1 ) Wer interesse an der 3. Version hat bitte per ICQ (220654215) oder PM melden... MfG Sky Quote Link to comment
Rayman Posted March 23, 2006 Author Share Posted March 23, 2006 Hallo COM'er :-) ich habe diesen Thread hier letztes Jahr aufgemacht und über die Zeit haben sich hier viele nützliche Informationen zusammengefunden. Allerdings fand sich für meine ursprüngliche Vorstellung keine konkrete Lösung. Da ich beruflich auch gerade mit COM zu tun hatte, musste der der DVBViewer als Trainingsobjekt herhalten ;-) Daraus entstanden ist mein EPGplus-Plugin: http://www.DVBViewer.com/forum/index.php?showtopic=11801 Geschrieben habe ich das Plugin komplett in C++ mit gcc (resp. mingw) und der Win32API. Als GUI-Framework habe ich wxWidgets benutzt, welches ich wärmstens empfehlen kann, da es recht mächtig und sehr komfortabel zu programmieren ist. Die ganze (Zitat erwin) VARIANT-Friemelei *gg* fand ich weniger problematisch als gedacht, da es sowohl in der Win32API und insbesondere in wxWidgets Helfer für das Handling gibt. Vielleicht fühlt sich ja der ein oder andere (C/C++ er) beflügelt den DVBViewer mit weiteren Plugins auszustatten, so schwer ist das nicht und macht eigentlich ziemlich viel Spaß ;-) Viele Grüße, Stefan. Quote Link to comment
birder Posted March 7, 2007 Share Posted March 7, 2007 (edited) Hallo, echt cooler Code der hier gepostet wurde. Ich schreibe gearde ein Programm, welches die EPG Daten aus DVBViewer ausliesst und mir als xmltv Datei speichert. Ich habe unter anderem folgenden Code von hier verwendet. Natürlich habe ich ihn abgeändert. Gibt es hier auch die Möglichkeit die category auszulesen? Die IEPGCollection epgs hat leider keine Methode dafür. Es gibt hier auch ein VBS update script für die EPG Daten. Hat jemand eine Ahnung wie man das in C# realisiert? try { StreamReader sr = new StreamReader(path); string[] patterns = sr.ReadToEnd().Split(new char[] { '\r', '\n' }); // Find Matches for (int i = 0; i < chans.Count; i++) { IChannelItem chan = chans; IEPGCollection epgs = epgMgr.Get(chan.Tuner.SID, chan.Tuner.TransportStreamID, from, to); for (int j = 0; j < epgs.Count; j++) { IEPGItem epg = epgs[j]; for (int k = 0; k < patterns.Length; k++) { if (patterns[k].Length > 1 && Regex.Match(epg.Title, patterns[k], RegexOptions.IgnoreCase).Success) { if (FindTimerBetween(epg.Time, epg.EndTime) == -1) { Record(epg, chan); } else { Console.WriteLine("couldn't add -> Chan: '{0}' - Title: '{1}' - Date: '{2}' - Time: '{3}'", chan.Name, epg.Title, epg.Time.ToString("dd.MM.yy"), epg.Time.ToString("T")); Console.WriteLine("\tAlready existing record entry"); } } } } } } catch (Exception ex) { Console.WriteLine(ex.StackTrace); } } Edited March 7, 2007 by birder Quote Link to comment
JustCute Posted March 13, 2007 Share Posted March 13, 2007 Aus der COM Interface Doku zu entnehmen: Interface IEPGItem ... property Content: Integer; The Content (Genre) of the EPG. See DVBViewer language files section [Genre] for a list. und Genre aus dem DVBViewer language files [Genre] 100=Jazz 101=Musical/Oper 102=Ballett 112=Kunst/Kultur 113=Darstellende Kunst 114=Bildende Kunst 115=Religion 116=Volkstümliche/traditionelle Kultur 117=Literatur 118=Film/Kino 119=Experimenteller Film 120=Radio/Fernsehen/Presse 121=Neue Medien 122=Kunst-/Kulturmagazin 123=Mode 128=Soziale/politische/wirtschaftliche Themen 129=Magazin/Reportage/Dokumentation 130=Wirtschaftliche/soziale Beratung 131=Herausragende Persönlichkeiten 144=Bildung/Wissenschaft/Sachthemen 145=Natur/Tiere/Umwelt 146=Technik/Naturwissenschaften 147=Medizin/Psychologie 148=Ferne Länder/Expeditionen 149=Sozial-/Geisteswissenschaften 150=Weiterbildung 151=Sprachen 16=Spielfilm 160=Freizeit/Hobbies 161=Reisen/Tourismus 162=Handarbeit/Kunsthandwerk 163=Auto/Verkehr 164=Gesundheit und Fitness 165=Kochen 166=Werbung/Shopping 167=Garten 17=Krimi/Thriller 176=Originalsprache 177=Schwarz-weiß 178=Erstausstrahlung 179=Liveübertragung 18=Abenteuer/Western/Krieg 19=Science Fiction/Fantasy/Horror 20=Komödie 21=Serie 22=Liebesfilm 23=Ernster/klassischer/religiöser/historischer Film 24=Film für Erwachsene 32=Nachrichten/Aktuelles 33=Nachrichten/Wetter 34=Nachrichten-Magazin 35=Filmbericht/Dokumentarfilm 36=Diskussion/Interview 48=Show/Spielshow 49=Spielshow/Quiz 50=Varieté 51=Talkshow 64=Sport 65=Außerplanmäßige Sportveranstaltung 66=Sport-Magazin 67=Fußball 68=Tennis 69=Mannschaftssport 70=Leichtathletik 71=Motorsport 72=Wassersport 73=Wintersport 74=Reitsport 75=Kampfsport 80=Kinder-/Jugendprogramm 81=Vorschulprogramm 82=Unterhaltung für 6- bis 14-jährige 83=Unterhaltung für 10- bis 16-jährige 84=Lern-/Schulprogramm 85=Zeichentrick/Puppenspiel 96=Musik/Ballet/Tanz 97=Rock/Pop 98=Klassische Musik 99=Volksmusik doku du lesen musst Quote Link to comment
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.