Multi-File Upload (1): Bereitstellen der neuen Seitentypen

Nach der Installation findet sich im Installationsverzeichnis die Assembly (DLL) JMS.SharePoint.Upload.dll, die zwei neue ASP.NET Seitentypen enthält.

Der eine Typ von Seite arbeitet völlig unsichtbar im Hintergrund und nimmt eine Anzahl von Dateien zum Einspielen in eine Document Library entgegen. Dabei wird erst einmal grundsätzlich sichergestellt, dass alle Einspielvorgänge mit einer eingescheckten Datei enden (Bug oder Feature – das lassen wir hier mal offen). Also selbst wenn nicht gesetzte Pflichteigenschaften vorhanden sind, erscheint die Datei als eingestellt in der Library. Beim Pflegen der Eigenschaften müssten die Werte dann allerdings wie gewohnt nachgepflegt werden, damit ein Speichern des Pflegeformulars möglich ist.

Anders als beim konventionellen WSS 3.0 Einspielvorgang können aber beliebig Werte zu Eigenschaften angegeben werden, die dann für alle eingespielten Dateien übernommen werden. Diese zusätzlichen Werte werden über die URL übertragen und unterliegen somit einigen Einschränkungen – bezüglich der Datentypen oder der Größe der Werte etwa: URLs können maximal 1000 Zeichen lang werden. Für den normalen Einsatz sollte dies aber kein wirkliches Problem sein. Zum Testen habe ich mit den Datentypen Text (einzeilig), ganze Zahl, Ja/Nein Wahrheitswert und 1-aus-N Auswahl gearbeitet. Es ist übrigens nicht zwingend erforderlich, dass die in der URL übertragenen Werte zu Pflichteigenschaften gehören.

Ein bißchen kritisch ist an dieser Stelle, dass die ’nicht Überschreiben‘ Einstellung des Dateiauswahlformulars nur oberflächlich ausgewertet wird. Ist das Überschreiben verboten und wird versucht, eine existierende Datei erneut einzuspielen, so wird diese ohne Warnung vom Einspielvorgang ausgenommen. Alle möglichen Einspielvorgänge werden abgeschlossen.

Der zweite Seitentyp erweitert die Standardeinspielseite UPLOAD.ASPX von WSS 3.0. Neu ist die Möglichkeit, auf der Seite Eingabefelder einzublenden, deren Werte dann mit der beschriebenen Architektur über die URL an die Einspielkomponente übetragen werden. Zur Einspielseite gibt es einen eigenen Artikel.

Die Aktivierung der neuen Seitentypen ist denkbar einfach. Erst einmal wird die erwähnte Assembly aus dem Installationsverzeichnis in alle _app_bin Unterverzeichnisse der WSS Sites kopiert, in denen eine Nutzung erwünscht ist. Ist nur eine Site installiert, so wird diese üblicherweise an den HTTP Defaultport 80 gebunden und das Verzeichnis dieser WSS Site findet sich normalerweise in c:\Inetpub\wwwroot\wss\VirtualDirectories\80 – die 80 ist der zugeordnete Port. Im Installationsverzeichnis findet sich neben der Assembly auch ein Source Unterverzeichnis mit den Quelltexten für die neuen Seitentypen. Zusätzlich sind dort im Fragments Unterverzeichnis einige Dateischnipsel angelegt, mit denen die manuelle Einrichtung vorgenommen werden kann. Die Datei MUpload.ASPX wird so wie sie ist ins Seitenverzeichnis von WSS 3.0 kopiert – üblicherweise c:\Program Files\Common Files\Microsoft Shared\web server extensions\12\TEMPLATE\LAYOUTS.

Damit ist die erste Phase er Einrichtung abgeschlossen. An WSS selbst wurde noch nichts verändert, lediglich zusätzliche Funktionalität bereitgestellt. Diese wird aber noch nicht genutzt.

So long

Jochen

Windows SharePoint Services 3.0: Multi-File Upload

Ich habe mich kürzlich ein wenig mit den (nur leicht veralteten) Windows SharePoint Services 3.0 unter Windows 2003 auseinandergesetzt. Für eine sehr spezielle Anforderungen habe ich ein kleines Proof-Of-Concept gemacht, das alles andere als rund oder unmittelbar produktiv nutzbar ist, aber vielleicht dem einen oder anderen wenn nicht hilft so doch auf Ideen bringt, wie man mit diesem Szenario umgeht.

Konkret geht es um die Möglichkeit, in einer Document Library mehrere Dateien auf einmal einzuspielen.

Menu       Standardupload

Sind in der Document Library Pflichtspalten definiert, so werden zwar alle Dateien eingespielt, sind aber ausgecheckt und müssen zur endgültigen Freigabe einzeln bearbeitet werden. Das kann gerade beim Einspielen sehr vieler Dateien lästig sein, vor allem, wenn die zu vergebenden Pflichteigenschaften identische Werte besitzen.

Mein kleines Projekt greift in den Einspielvorgang für mehrere Dateien ein. Durch Konfiguration ist es möglich, auf dem Auswahlformular Felder der Library direkt einzugeben, die dann bei allen Dateien gesetzt werden. Im aktuellen Zustand hat das Ganze noch eine Reihe von Ecken und Kanten, aber es ist eine extrem kleine Lösung mit wenigen Codezeilen und ein bißchen HTML. Eleganz braucht vielleicht nur noch etwas Zeit.

Ein aktueller Download (die Nutzung erfolgt wie üblich bei Software von dieser Site völlig ohne Gewähr und auf eigene Gefahr) mit sämtlichen Quelltexten (viel ist es wie gesagt nicht) findet sich hier. Die Installation kopiert ausschließlich Dateien und verändert nichts an dem System. Sie kann auf daher jedem Rechner erfolgen, es muss keine WSS 3.0 Installation vorliegen (lediglich das Microsoft .NET 3.0 Framework wird vorausgesetzt – das machte es mir etwas einfacher, aber ich denke, dass ist schon fast Standard). Das Einrichten im WSS erfolgt manuell. Ich habe versucht, das Vorgehen in einzelnen Artikeln zu beschreiben, wobei auch auf einige der Ecken, Kanten und Fallstricke eingegangen wird.

Schritt 1: Bereitstellen des neuen Seitentyps.
Schritt 2: Vorbereiten der Auswahlseite.
Schritt 3: Konfiguration der zusätzlichen Felder pro Library.

Viel Spaß

Jochen

.NET 3.5 SP1 und ASP.NET Run-Time Hosting

VCR.NET ist ein Windows Dienst, der sich als ASP.NET Web Server präsentiert. Kern dazu ist eine Implementierung der HttpWorkerRequest Basisklasse. Die ursprüngliche Realisierung beschränkte sich auf das Notwendigste, i.e. die Methoden, die im Betrieb auch tatsächlich aufgerufen wurden. Seit SP1 von .NET 3.5 wird nun leider auch die Methode void SendResponseFromFile( string filename, long offset, long length ) für statische Inhalte verwendet (Bilder, HTML, CSS, …), was im konkreten Fall von VCR.NET dazu führte, dass die Anwendung zwar noch lief, aber sehr komisch aussah.

Glücklicherweise ist zumindest eine dumme Implementierung der Methode recht trivial, aber man muss es halt erst einmal tun. Wer also auch ASP.NET Run-Time Hosting betreibt und sich auf eine Minimalimplementierung stützt: lieber mal reinschauen, bevor es eine optisch unschöne Überraschung gibt.

Viel Spaß

Jochen

DVB.NET 3.5 und DVB-S2

Ich habe mir gerade eine Hauppauge Nova-HD-S2 eingebaut und festgestellt, dass die Senderliste von DVB.NET 3.5 für eine Unterstützung von DVB-S2 unzureichend ist. DVB.NET 3.5 weiß von einem Transponder zwar, dass es sich um einen DVB-S2 Transponder handelt, kennt aber weder Modulationsverfahren noch RollOff oder Pilot Parameter. Im Gegensatz zur TechnoTrend S2-3200 benötigt die Nova-HD-S2 diese Informationen aber zum Teil. Da gibt es auch keinen Work-Around, sondern nur ein weiteres Tüpfelchen für die Senderverwaltung von DVB.NET 4.0 (tatsächlich hatte ich das schon berücksichtigt, ohne die Details zu kennen).

Ausserdem ist die Nova pingeliger, was die Angabe der Fehlerkorrektur angeht. In DVB.NET 3.5 hat sich bezüglich des neuen Arte HD Transponders ein Fehler eingeschlichen: die FEC ist mit 3/4 vermerkt, korrekt ist aber 2/3. Glücklicherweise läßt sich das manuell für DVB.NET und VCR.NET korrigieren.

Immerhin: mit etwas Tricks erscheint nun Arte HD auch mit der Nova.

So long

Jochen

Was ist ein Sender?

Ok, erst mal eine selten dämliche Frage. Etwas präziser gefragt: was bedeutet es denn, eine Ausstrahlung eines Sender aufzuzeichnen? Am Anfang meiner Beschäftigung mit dem digitalen Empfang schien mir die Antwort trivial: Bild und Ton, what else? Tatsächlich ist es aber etwas komplizierter, da eine Ausstrahlung halt nicht nur aus einem Bild und einem Tonsignal besteht. Da sind erst mal alternative Tonspuren in anderen Sprachen (englisch, französisch, …) und / oder anderen Formaten (Dolby Digital, Zweikanal, …). Zumindest jetzt schon sind auch Videotext (und sei es nur zur Extraktion von Untertiteln) und DVB Untertitel ein Thema – letztere unter Umständen wieder mit verschiedenen Varianten verfügbar. Dazu kommen auch noch Informationen, die im Sinne der Spezifikation zwar nicht zur Ausstrahlung gehören, diese aber sinnvoll ergänzen können, wie etwa die elekronische Programmzeitschrift (EPG) und da vor allem die Daten zur Ausstrahlung selbst.

Also ist ein Sender die Summe aller dieser Teile und eine Aufzeichnung sollte all dies enthalten? Theroetisch ja, aber praktisch kann es gute Gründe geben, auf die Aufzeichnung aller Teile zu verzichten. In seltenen Fällen beschränkt die Hardware die Aufzeichnung aller Teile, wie etwa bei der TechnoTrend Premium Line (Hauppauge Nexus, … ): diese Karten können maximal 8 Teile gleichzeitig aufzeichnen, so dass etwa heute eine Aufzeichnung der Euronews mit acht Tonspuren zum Bild unmöglich ist. Aber auch rein pragmatische Gründe können einen dazu bewegen, auf Teile bewußt zu verzichten. Ich bin etwa zu faul, für jede Aufzeichnung ProjectX individuell zu konfigurieren. Wenn ich etwa eine Aufzeichnung mit VideoText habe, so versucht die gemeinsame Einstellung Untertitel auf den wichtigsten Seiten (149, 150, 777, 888) zu finden – und das dauert. Weiß ich, dass ich eine Aufzeichnung von einerm Sender mache, der eh keine Untertitel anbietet (Sat1, die RTL Gruppe, …), so verzichte ich einfach bewußt darauf, diesen Teil in die Aufzeichnung zu integrieren. Bei alternativen Tonspuren ist es ähnlich – wann hat das ZDF mal wirklich Dolby Surround oder einen Begleittext auf den zusätzlichen Tonspuren?

In DVB.NET und VCR.NET werden aus historischen Gründen Senderlisten gepflegt, in dem zu jedem Sender mitgeführt wird, welche Teile wie (über welche Datenstromkennung) aus dem digitalen Sendestrom extrahiert werden können. Dieser Ansatz ist schon länger nicht mehr zeitgemäß: einige Sender ändern diese Konfiguration voll dynamisch (PREMIERE grundsätzlich für Tonspuren, einige dritte Programme der ARD etwa bezüglich der Dolby Digital Spur), in festen Zeitfenstern (für die Regionalprogramm der ARD, so hat etwa WDR Bonn Abends eine halbe Stunde individuelles Programm) oder nach Lust und Laune (ITV häufig, BBC ab und zu, ARD und die ProSieben Gruppe im großen Stil Anfang 2008). Kurz gesagt: eigentlich ist ein Großteil der Senderliste unnötig und bei einer Aufzeichnung sollte dynamisch entschieden werden, welche Teile aufgenommen werden soll.

Auch dieser Ansatz hat durchaus einige Nachteile. Für meine Software konnte man bisher sagen, welche Teile integriert werden sollten und welche nicht. Da man nicht mehr weiß, was denn nun wirklich drin sein wird, beschränkt sich das auf Aussagen wie ‚aber auf keinen Fall mit VideoText für Sat.1‘ – nicht wirklich eine schmerzhafte Änderung. Kritisch sind aber nun Aufzeichnungen über Karten mit technischen Beschränkungen wie der PremiumLine, da das Erreichen des Grenzwertes erst mit Beginn der Laufzeit kritisch wird – das Planen von Aufzeichnungen wird schwieriger (insbesondere, wenn man mehrere Sender gleichzeitig aufzeichnen möchte) und es kann zu unerwünschten Ergebnissen kommen (warum fehlt denn nun gerade die deutsche Tonspur und ähnliches).

Dazu kommt, dass sich die Konfiguration der Teile ja auch dynamische verändern kann. Nimmt man etwa das regionale Zeitfenster von WDR Bonn mit etwas Vorlauf auf, so ist die Konfigurationsveränderung in der Aufzeichnung. Bei Weiterführung in eine Aufzeichnungsdatei würde es nun dazu kommen, dass die Zeitbasis von Bild und Ton einen Sprung machen. Das alleine wäre noch unkritisch, da Nachbearbeitungsprogramme wie ProjectX damit im Allgemeinen klarkommen – vielleicht fehlen einige Bilder an der Sprungstelle selbst. Weniger großzügig wird allerdings damit umgegangen, wenn Teile nachträglich hinzukommen: oft wird nur die ursprüngliche Konfiguration berücksichtigt. Also bei PREMIERE könnte dann schon mal die englische Tonspur nur mit Mühe nutzbar sein, man müßte manuell die Stelle finden, an der die gewünschte Konfiguration vorliegt und erst dahinter mit dem Schnitt / der Analyse beginnen. Ähnliches für eine Aufzeichnung von KiKa mit VideoText, wenn man die erste Ausstrahlung des Tages nach der Sendepause haben möchte.

Eine Alternative, die VCR.NET geht, ist es, bei jedem Konfigurationswechsel eine neue Datei zu beginnen. Nun wird aus der einfachen Aufzeichnung eines Senders aber eine ganze Reihe von Einzeldateien: auch nicht sehr schön und von der Verwendung her oft eher lästig – aber hey, bei WDR Bonn hat mein Regionalfenster einer eigene Datei, cool, aber eher Bug als Feature. Und wehe, wenn die Sendeanstalt die Konfiguration fehlerhaft wechselt, etwa zu spät: eigentlich ist die englische Tonspur da, sie wird aber nicht aufgezeichnet, weil keine Zuordnung besteht (das gilt natürlich allgemein, nicht nur bei der Dateitrennung durch VCR.NET) – da ist dann auch nichts mehr zu retten.

Die Aufzeichnung ganzer Transponder (Sendergruppen) scheint eine Alternative zu sein, erzeugt aber riesige Dateien (grob 14 GB pro Stunde) und macht die Nachbearbeitung eher mühsam.

Was ist also ein Sender? Erst einmal nur eine eindeutige Bezeichnung, die dessen Quelle beschreibt. Dazu gibt es in DVB das Tripel (Netzwerkkennung, Datenstromkennung, Dienstekennung), das etwa für das ZDF identisch ist, egal ob der Empfang direkt über Satellit oder einen Kabelanschluss erfolgt. Wenn ich also einen Sender aufzeichnen möchte, verwende ich einfach die eindeutige Bezeichnung und die dynamische Konfiguration (in der Hoffnung, dass die Sendeanstalt nicht mogelt).

Was gehört also in die Senderliste? Nun, das ist etwas schwieriger, denn der Anwender möchte sicher nicht die eindeutige Bezeichnung auswählen. Also ein eindeutiger Sendername muss schon her. Trivial, oder? Nicht wirklich, Sender wie ARTE gibt es etwa zweimal, wobei hier die Unterscheidung über die Schreibweise (einmal groß, einmal klein) oder den Dienstanbieter (einmal CANALSATELLITE, einmal ARD) möglich ist. Aber kurzzeitig während der Umstellung gab es unter anderem WDR5 des Anbieters ARD zweimal, da hilft nun gar nichts mehr. Ähnlich bei Astra 2, wo es fast nur den Anbieter BSkyB gibt und viele Namen doppelt vorkommen.

Und noch einen darauf gesetzt: hat man eine Software wie VCR.NET, mit der man Aufzeichnungen plant, und setzt mehr als eine DVB Hardware ein, so kann man eigentlich erwarten, dass eine automatische Verteilung der Aufzeichnungsaufräge an die Hardware stattfindet (VCR.NET macht das nicht!). Neben manuellen Wünschen (für wichtige Aufzeichnungen lieber mal DVB-S statt DVB-T nehmen, da die Qualität deutlich besser ist) gibt es auch harte Bedingungen, die bereits in der Senderliste verankert werden sollten. Hat etwa nur eine Hardware die Möglichkeit, über ein Common Interface (CI) eine PayTV Aufzeichnung zu entschlüsseln, so kann eine verschlüsselte Aufzeichnung auch nur von dieser ausgeführt werden. Daher sollte bei der Planung schon bekannt sein, dass eine Entschlüsselung notwendig ist – sonst kann es bei Beginn der Aufzeichnung zu einer bösen Überraschung kommen, wenn die einzig fähige Hardware gerade mit irgendetwas Unwichtigem beschäftigt ist. Also gehört in die Senderliste zumindest noch die Information, ob eine Sender verschlüsselt sendet oder nicht. Und wenn sich auch das dynamisch ändert…

Genug für heute (wer Tippfehler findet, darf sie behalten). Fazit für DVB.NET 4.0: Senderlisten werden ganz anders aussehen, Aufzeichnungen werden sich bevorzugt an der dynamischen Konfiguration orientieren.

Viel Spaß

Jochen