<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>xscDevBlog - LastSharp &#38; Co. &#187; rest</title>
	<atom:link href="http://dev.xscheme.de/tag/rest/feed/" rel="self" type="application/rss+xml" />
	<link>http://dev.xscheme.de</link>
	<description>Der xscheme-DevelopmentBlog</description>
	<lastBuildDate>Sun, 23 May 2010 11:40:10 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Wie verwende ich Lapicon in meinem eigenen Programm? (.NET)</title>
		<link>http://dev.xscheme.de/2009/04/lapicon-in-eigenem-programm-verwenden/</link>
		<comments>http://dev.xscheme.de/2009/04/lapicon-in-eigenem-programm-verwenden/#comments</comments>
		<pubDate>Sun, 26 Apr 2009 19:43:55 +0000</pubDate>
		<dc:creator>xsc</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Lapicon]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[rest]]></category>

		<guid isPermaLink="false">http://dev.xscheme.de/?p=677</guid>
		<description><![CDATA[Lapicon (Loose API Connection Language) kann (ab Version 1.0.10) auf einfache Art und Weise im eigenen Programm verwendet werden.
Um zu lernen, wie das geht, entwickeln wir hier (mit C#, aber eine Übertragung auf andere .NET-Sprachen dürfte jeder einigermaßen versierte Programmierer hinbekommen) ein Mini-Programm, das in einem Fenster zwei Eingabefelder für &#8220;Interpret&#8221; und &#8220;Titel&#8221; bereitstellt und [...]]]></description>
			<content:encoded><![CDATA[<p><strong><a href="http://dev.xscheme.de/lapicon">Lapicon</a></strong> (Loose API Connection Language) kann (ab Version 1.0.10) auf einfache Art und Weise im eigenen Programm verwendet werden.</p>
<p>Um zu lernen, wie das geht, entwickeln wir hier (mit C#, aber eine Übertragung auf andere .NET-Sprachen dürfte jeder einigermaßen versierte Programmierer hinbekommen) ein Mini-Programm, das in einem Fenster zwei Eingabefelder für &#8220;Interpret&#8221; und &#8220;Titel&#8221; bereitstellt und das zugehörige Album findet. Ich gebe zu, keine bahnbrechende Idee, aber zur Demonstration reicht&#8217;s.  <span id="more-677"></span></p>
<p>Zuallererst erstellen wir ein neues Projekt vom Typ &#8220;Windows Forms Anwendung&#8221; mit beliebigem Namen und erstellen einen Verweis auf Lapicon.  Das geht folgendermaßen:</p>
<ol>
<li>Rechtsklick auf &#8220;Veweise&#8221; im Projektmappen-Explorer, dann Klick auf &#8220;Verweis hinzufügen&#8230;&#8221;:<img class="size-full wp-image-678 alignnone" title="Lapicon Tutorial: Verweis hinzufügen" src="http://dev.xscheme.de/wp-content/uploads/2009/04/lapiconassemblytut1.png" alt="Lapicon Tutorial: Verweis hinzufügen" width="343" height="189" /></li>
<li>Unter &#8220;Durchsuchen&#8221; die Datei &#8220;Lapicon.exe&#8221; suchen und auswählen. Klick auf &#8220;OK&#8221;.<img class="alignnone size-full wp-image-679" title="Lapicon Tutorial: Lapicon.exe einbinden" src="http://dev.xscheme.de/wp-content/uploads/2009/04/lapiconassemblytut2.png" alt="Lapicon Tutorial: Lapicon.exe einbinden" width="504" height="232" /></li>
</ol>
<p>Jetzt kann die Programmentwicklung losgehen. Wir erstellen ein Fenster, das in etwa so aussieht:</p>
<p style="text-align: center;"><img class="size-full wp-image-680 aligncenter" title="Lapicon Tutorial: Fenster" src="http://dev.xscheme.de/wp-content/uploads/2009/04/lapiconassemblytut3.png" alt="Lapicon Tutorial: Fenster" width="322" height="160" /></p>
<p>Jetzt geht es an die Implementierung der Funktionen. Alle Lapicon-Funktionen werden durch das Objekt &#8220;LapiconProcessor&#8221; im Namespace &#8220;Lapicon&#8221; bereitgestellt. Da &#8220;LapiconProcessor&#8221; ein ziemlich langer Name ist und Programmierer von Haus aus faul sind, fügen wir folgendes Statement an den Anfang des Codes unseres Fensters (Rechtsklick auf das Fenster &gt;&gt; &#8220;Code anzeigen&#8221;) ein:</p>
<pre>using L = Lapicon.LapiconProcessor;</pre>
<p>Damit kürzen wir das Objekt &#8220;LapiconProcessor&#8221; als &#8220;L&#8221; ab und können ab sofort in unserem Code darauf zugreifen. Zuallererst ist unsere Anwendung ja auf das Last.FM-API ausgelegt, d.h. beim Laden der Anwendung würde es sich anbieten, Lapicon für dieses API zu konfigurieren. Hierfür verwenden wir das &#8220;Load&#8221;-Ereignis des Fensters, indem wir an irgendeine freie Stelle (im Fensterentwurf) doppelklicken. Anschließend ergänzen wir den so erstellten Code folgendermaßen:</p>
<pre>private void AlbumFinderForm_Load(object sender, EventArgs e)
{
<span style="color: #ff9900;"><span style="color: #000000;">   // Lapicon: Initialisierung für Last.FM (entspricht L.Process("#lastfm"))</span></span>
<span style="color: #ff9900;">   L.LastFMInit();<span style="color: #000000;"> </span></span>
}</pre>
<p>Jetzt müssen wir noch festlegen, was passiert, wenn wir auf den Button klicken. Also erstellen wir mit einem Doppelklick darauf das &#8220;Click&#8221;-Event und verwenden die verschiedenen Lapicon-Funktionen, um eine Anfrage an Last.FM zu senden und das Ergebnis in einer MessageBox anzuzeigen. Die wichtigsten Lapicon-Funktionen sind:</p>
<ul>
<li><strong>Process(&#8220;statement1&#8243;, &#8220;statement2&#8243;, &#8230;) </strong>führt die angegebenen Lapicon-Befehle nacheinander aus.</li>
<li><strong>Var(&#8220;var&#8221;)</strong> liefert den Wert einer Variablen.</li>
<li><strong>Var(&#8220;var&#8221;, &#8220;wert&#8221;)</strong> speichert &#8220;wert&#8221; in der Variable &#8220;var&#8221;.</li>
<li><strong>VarExists(&#8220;var&#8221;)</strong> liefert &#8220;true&#8221;, wenn eine Variable existiert.</li>
<li><strong>List(&#8220;var&#8221;)</strong> liefert eine Liste.</li>
<li><strong>ListCreate(&#8220;var&#8221;)</strong> erstellt eine Liste.</li>
<li><strong>List(&#8220;var&#8221;, &#8220;wert&#8221;)</strong> fügt &#8220;wert&#8221; zur Liste hinzu.</li>
<li><strong>ListExists(&#8220;var&#8221;)</strong> liefert &#8220;true&#8221;, wenn eine Liste existiert.</li>
</ul>
<p>Mehr braucht man meistens nicht. Unser Click-Event wird demnach folgendermaßen aussehen:</p>
<pre class="c-sharp" name="code">private void btFindAlbum_Click(object sender, EventArgs e)
{
    // Interpret und Titel
    string artist = txtArtist.Text.Trim();
    string track = txtTrack.Text.Trim();

    // Wenn eins von beidem leer ist: nicht weitermachen
    if (artist == "" || track == "") return;

    // Ansonsten: Album (und richtig geschriebene Infos) holen
    L.Process(
        "[track.getInfo : track=" + track + "&amp;artist=" + artist + "]",
        "store track/album/title in album",
        "store track/artist/name in artist",
        "store track/name in track"
    );

    // Ausgabe oder Fehler
    if (L.Var("album") == "")
    {
        MessageBox.Show(
            "Kein Album zu diesen Eingaben gefunden!",
            "Kein Album",
            MessageBoxButtons.OK,
            MessageBoxIcon.Exclamation);
    }
    else
    {
        MessageBox.Show(
            "Gefundene Informationen:\n\n" +
               "   " + L.Var("artist") + " - " + L.Var("track") + "\n" +
               "   Album: " + L.Var("album"),
            "Album gefunden!",
            MessageBoxButtons.OK,
            MessageBoxIcon.Information);
    }
}</pre>
<p>Das war auch schon alles. Mit &#8220;Process&#8221; wird die Anfrage abgeschickt und die nötigen Daten gesichert, mit &#8220;Var&#8221; erfolgt die Verwendung der Daten. Und schon ist das Programm <em>good to go</em>:</p>
<p><img class="alignnone size-full wp-image-681" title="Lapicon Tutorial: Fertiges Programm" src="http://dev.xscheme.de/wp-content/uploads/2009/04/lapiconassemblytut4.png" alt="Lapicon Tutorial: Fertiges Programm" width="486" height="305" /></p>
<p>Viel einfacher geht es wirklich nicht mehr. Ich hoffe, damit allen, die Interesse an Lapicon haben, ein Stück weiter geholfen zu haben.</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.xscheme.de/2009/04/lapicon-in-eigenem-programm-verwenden/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Wie baue ich mir ein Script mit Lapicon?</title>
		<link>http://dev.xscheme.de/2009/04/kurzanleitung-zu-lapicon/</link>
		<comments>http://dev.xscheme.de/2009/04/kurzanleitung-zu-lapicon/#comments</comments>
		<pubDate>Sat, 25 Apr 2009 00:06:07 +0000</pubDate>
		<dc:creator>xsc</dc:creator>
				<category><![CDATA[HowTo]]></category>
		<category><![CDATA[Lapicon]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[lastfm]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[webservice]]></category>

		<guid isPermaLink="false">http://dev.xscheme.de/?p=635</guid>
		<description><![CDATA[Lapicon (Loose API Connection Language) ist ein Interpreter für eine Scriptsprache, die auf den ersten Blick Ähnlichkeiten mit dem Windows-Eigenen Batch hat und dafür gedacht ist, mit Webservern in Verbindung zu treten, die ihre Daten als XML bereitstellen und REST-Anfragen über HTTP-GET unterstützen. Soweit die Theorie.
Praktisch gesehen ist Lapicon eine einfache Möglichkeit, Webservices zu verwenden. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://dev.xscheme.de/lapicon"><strong>Lapicon</strong></a> (Loose API Connection Language) ist ein Interpreter für eine Scriptsprache, die auf den ersten Blick Ähnlichkeiten mit dem Windows-Eigenen <em>Batch</em> hat und dafür gedacht ist, mit Webservern in Verbindung zu treten, die ihre Daten als XML bereitstellen und REST-Anfragen über HTTP-GET unterstützen. Soweit die Theorie.</p>
<p>Praktisch gesehen ist Lapicon eine einfache Möglichkeit, <strong>Webservices zu verwenden</strong>. Und geeignete gibt es (wie die Google-Suche nach &#8220;REST-API&#8221; schon bald zeigt) einige:</p>
<ul>
<li>Last.FM (http://www.last.fm/api)</li>
<li>Flickr (http://www.flickr.com/services/api/)</li>
<li>Twitter (http://apiwiki.twitter.com/Twitter-API-Documentation)</li>
<li>Wuala (http://www.wuala.com/de/api)</li>
<li>&#8230;</li>
</ul>
<p>Aber wie geht man nun vor, wenn man Lapicon für irgendeines dieser APIs verwenden will? Diese Frage will ich in diesem Artikel beantworten, anhand zweier Beispiele: den Skripts DownloadAlbumAfterSearch.lpc und Lyrics.lpc aus dem Paket <strong>DarkSharpScripts</strong>, das ab Version 1.0.9 von Lapicon im Verzeichnis &#8220;packages&#8221; zu finden ist. Das erste Script sucht anhand einer Eingabe alle in Frage kommenden Alben und lässt den User eines auswählen, das anschließend komplett von Last.FM heruntergeladen wird (wenn möglich). Und das zweite findet mithilfe der <a href="http://lyricwiki.org/Main_Page">LyricWiki</a> (noch eine Seite, die REST-Anfragen unterstützt!) den Songtext zu einem vom User eingegebenen Musiktitel.</p>
<p><span id="more-635"></span><strong></strong></p>
<p><strong>Schritt 0: Den einfachen Scriptstart ermöglichen</strong></p>
<p>Damit man möglichst einfach Lapicon-Scripts starten kann, sollte man eine Datei mit der Endung &#8220;.lpc&#8221; anlegen und unter Windows darauf doppelklicken und anschließend über &#8220;Programm aus Liste auswählen&#8221; &gt;&gt; &#8220;Durchsuchen&#8230;&#8221; die Lapicon.exe als Standardprogramm festlegen. Dann lassen sich Scripts per Doppelklick starten.</p>
<p><strong>Schritt 1: Grundeinstellungen</strong></p>
<p>Zuallererst muss Lapicon mitgeteilt werden, wohin es Anfragen schicken soll, wie diese Anfragen aussehen sollen und wie es mit den Antworten umzugehen hat. Man stelle sich folgende Fragen:</p>
<ol>
<li>Wie lautet die URL, an die die Anfragen gehen sollen? (Findet man meistens auf der API-Seite.)</li>
<li>Brauche ich irgendwelche Daten für die Anfrage, die immer vorhanden sein müssen? (Beispielsweise bei Last.FM: ein API-Schlüssel.)</li>
<li>Wie ist das Format der Anfrage-URL? &#8220;URL?Parameter&#8221; oder &#8220;URL/Parameter1/Parameter2&#8243;?</li>
<li>Wie sieht die Antwort aus? Welcher XML-Knoten ist die Wurzel? Sind irgendwelche Namespaces enthalten?</li>
<li>Werden mir Informationen bereitgestellt, ob Fehler aufgetreten sind, und wo finde ich sie?</li>
</ol>
<p>Jetzt geht es ans Konfigurieren von Lapicon, hier am Beispiel Last.FM:</p>
<pre>// s.o. Punkt 1: die Basis-URL
#base http://ws.audioscrobbler.com/2.0/

// s.o. Punkt 2: API-Key muss immer mitgesendet werden
#static api_key ce59c153ff5e3003c74df5b618aeccac

// s.o. Punkt 3: Die Anfrage hat das Format "URL?Parameter" (ansonsten: #noquery)
#query

// s.o. Punkt 4: Wurzel ist der "lfm"-Knoten; wir brauchen die Namespaces "xspf" und "lastfm"
#rootnode
#namespace xspf http://xspf.org/ns/0/
#namespace lastfm http://www.audioscrobbler.net/dtd/xspf-lastfm

// s.o. Punkt 5: wenn kein Fehler aufgetreten ist, steht im Attribut "status" des "lfm"-Knotens "ok"
#errornode lfm/@status
#noerrorvalue ok</pre>
<p>Für &#8220;#rootnode&#8221; und &#8220;#errornode&#8221;, sowie später für Anfragen, wird Kenntnis von XPath benötigt. Es sei an dieser Stelle auf den <a href="http://de.wikipedia.org/wiki/XPATH">Wikipedia-Artikel zum Thema</a> verwiesen.</p>
<p>Da Last.FM als eines der Hauptanwendungsfelder für Lapicon gedacht war, lässt sich das oben geschriebene abkürzen:</p>
<pre>#lastfm</pre>
<p>Und schon ist Lapicon bereit dafür, zu arbeiten.</p>
<p><strong>Schritt 2: Wie soll das Programm ablaufen?</strong></p>
<p>Es ist immer wichtig, sich klarzumachen, was man jetzt eigentlich vorhat. Was also soll unser Script machen? Welche Daten brauchen wir dafür? Welche Anfragen müssen wir senden und welche Teile der Antworten verwenden?</p>
<p>Wir schreiben ein Script, das Alben sucht und anschließend komplett herunterlädt, also soll es folgende Schritte ausführen:</p>
<ol>
<li>Eingabe des Suchstrings</li>
<li>Verwendung der Funktion <a href="http://www.last.fm/api/show/?service=357">album.search</a> des Last.FM-APIs um eine Suche durchzuführen. Aus der Antwort lesen wir die Titel, Interpreten und IDs der einzelnen Alben aus.</li>
<li>Ausgabe einer nummerierten Liste mit Interpreten und Albumtitel</li>
<li>Eingabe der Nummer des gewünschten Albums</li>
<li>Verwendung der Funktion <a href="http://www.last.fm/api/show/?service=271">playlist.fetch</a>, um an die Tracks des Albums zu kommen. (Mit zwei nicht dokumentierten Parametern.) Wir verwenden die URLs und die Titel der Tracks.</li>
<li>Erstellen des Ausgabeverzeichnisses nach dem Muster &#8220;Interpret/Album&#8221;</li>
<li>Schleife, die einen Track nach dem anderen herunterlädt.</li>
<li>Ende.</li>
</ol>
<p><strong>Schritt 3: Implementierung</strong></p>
<p>Das Originalscript setzt zuerst die Last.FM-Einstellungen fest, dann lädt es die DarkSharpScripts-Konfigurationsdatei, die im selben Verzeichnis liegt:</p>
<pre>// Use Last.FM
#lastfm

// Include
inc(&lt;script directory&gt;/Config.DarkSharpScripts.lpc)</pre>
<p>Anschließend folgt die Eingabe des Suchstrings und eine Prüfung, ob auch wirklich etwas eingegeben wurde:</p>
<pre>// Search
def query &lt;&lt; Suchen
echo

[if &lt;query&gt; is not empty]</pre>
<p>Die Zeile &#8220;def query &lt;&lt; Suchen&#8221; bewirkt, dass der User eine Eingabezeile mit der Beschriftung &#8220;[in] Suchen:&#8221; vor sich hat. Drückt er die Enter-Taste wird alles eingegebene in der Variable &#8220;query&#8221; gespeichert. Um auf den Wert dieses Variable wiederum zuzugreifen, muss man sie in spitze Klammern setzen: &#8220;&lt;query&gt;&#8221;. Alles, was jetzt folgt, wird demnach nur ausgeführt, wenn der Wert von &#8220;query&#8221; nicht leer ist:</p>
<pre>   [album.search : album=&lt;query&gt;&amp;limit=&lt;DS_SearchLimit&gt;]*
   store* results/albummatches/album/name in albumTitles
   store* results/albummatches/album/artist in albumCreators
   store* results/albummatches/album/id in albumIDs

   // Choose
   f:displayAlbum n
      echo [&lt;n&gt;] &lt;albumCreators[&lt;n&gt;]&gt; - &lt;albumTitles[&lt;n&gt;]&gt;
   f:end
   forall* albumTitles index t: displayAlbum(&lt;t&gt;)
   echo</pre>
<p>Das Konstrukt in eckigen Klammern ist die Anfrage an Last.FM. Vor dem Doppelpunkt steht die Funktion, die aufgerufen werden soll, dahinter ihre Argumente &#8211; in diesem Fall &#8220;album&#8221; und &#8220;limit&#8221; mit den Werten der Variablen &#8220;query&#8221; und &#8220;DS_SearchLimit&#8221; (letztere aus der Konfigurationsdatei; sie legt fest, wie viele Suchergebnisse maximal angezeigt werden). Die Sternchen signalisieren, dass nun nicht ein einzelner Wert gespeichert werden soll, sondern eine Reihe von Werten in einer Liste. &#8220;store* results/albummatches/album/name in albumTitles&#8221; beispielsweise speichert alle Werte, die über diesen XPath (&#8220;results/&#8230;&#8221;) zu erreichen sind, in der Liste &#8220;albumTitles&#8221;.</p>
<p>Was dann folgt, ist eine Funktion, die genau einen Wert (die Variable &#8220;n&#8221;) als Argument erhält. Sie gibt anhand der beiden Listen &#8220;albumTitles&#8221; und &#8220;albumCreators&#8221; das n-te Album (wobei n bei 0 beginnt) aus. Hier sieht man den Zugriff auf einzelne Listenelemente: &lt;albumTitles[0]&gt; wäre z.B. der Titel des ersten gefundenen Albums, falls vorhanden.</p>
<p>Diese Funktion wird nun für jedes Element der Liste &#8220;albumTitles&#8221; aufgerufen, immer mit dem aktuellen Index als Argument. (Neben der gezeigten Version der &#8220;forall*&#8221;-Schleife gibt es noch eine weitere, die nicht den Index, sondern den Wert als Variable liefert: &#8220;forall* list as element: &#8230;&#8221;)</p>
<p>Jetzt kann der User eingeben, welches Album er haben will, anschließend wird die Playlist mit den einzelnen Titel geladen:</p>
<pre>   def nr &lt;&lt; Nummer des Albums
   echo

   // Album Info
   def albumID = &lt;albumIDs[&lt;nr&gt;]&gt;
   def albumName = file(&lt;albumTitles[&lt;nr&gt;]&gt;)
   def albumCreator = file(&lt;albumCreators[&lt;nr&gt;]&gt;)

   // Playlist Info
   [playlist.fetch : playlistURL=lastfm://playlist/album/&lt;albumID&gt;&amp;streaming=1&amp;fod=1]*
   store* xspf:playlist/xspf:trackList/xspf:track/xspf:title in trackTitles
   store* xspf:playlist/xspf:trackList/xspf:track/xspf:location in trackLocation</pre>
<p>Die Zeile &#8220;def albumName = file(&#8230;)&#8221; speichert in der Variable &#8220;albumName&#8221; einen bereinigten, für Dateinamen geeigneten String. Jetzt haben wir die URLs und Titel der Tracks, die wir herunterladen wollen. Und genau das macht der folgende Abschnitt &#8211; wieder nach dem Prinzip: &#8220;Lade die Datei mit dem Index &#8220;index&#8221; herunter!&#8221;</p>
<pre>   [if &lt;trackLocation length&gt; != 0]

      // Directory
      def dir = &lt;DS_AlbumsPath&gt;&lt;albumCreator&gt;/&lt;albumName&gt;
      mkdir &lt;dir&gt;

      // Download Function
      f:dl index
         def title = file(&lt;trackTitles[&lt;index&gt;]&gt;)
         def nindex
         nindex ::= &lt;index&gt;+1
         echo Downloading(&lt;nindex&gt;/&lt;trackLocation length&gt;) &lt;albumCreator&gt; - &lt;title&gt;...
         def fn = &lt;dir&gt;/&lt;nindex&gt; - &lt;albumCreator&gt; - &lt;title&gt;.mp3
         lpc(&lt;script directory&gt;/ResolveAndDownload.lpc) with &lt;trackLocation[&lt;index&gt;]&gt;|&lt;fn&gt;
         mp3Gain(&lt;fn&gt;)
      f:end

      // Download
      forall* trackTitles as t: dl(&lt;trackTitles counter&gt;)
      //
      wait

   [else]

      wait Album nicht herunterladbar

   [endif]

[else]

   wait Keine Sucheingabe

[endif]</pre>
<p>Wir sehen einiges Neues hier: die Funktion &#8220;mkdir&#8221; erstellt ein Verzeichnis, die Zuweisung mit &#8220;::=&#8221; löst eine Berechnung aus (damit &#8220;nindex&#8221; um 1 größer ist als &#8220;index&#8221;) und dann das Konstrukt &#8220;lpc(&#8230;) with &#8230;&#8221;. Hier geschieht folgendes: Lapicon ruft das Script ResolveAndDownload.lpc auf, das im selben Verzeichnis liegt, und zwar mit den <span style="text-decoration: underline;">Kommandozeilenargumenten</span> &lt;trackLocation[&lt;index&gt;]&gt; und &lt;fn&gt;. Dieses kleine Hilfsscript macht nichts anderes, als die übergebene URL (das erste Argument) mithilfe von HTTP aufzulösen und dann herunterzuladen. Das zweite Argument ist der Name der heruntergeladenen Datei. Es sollte sich also eigentlich von selbst erschließen:</p>
<pre>// Data
def url = &lt;cmd 1&gt;
def file = &lt;cmd 2&gt;

// Resolve
def rurl

#error off
rurl = resolve &lt;url&gt;
#error on

[if &lt;rurl&gt; is not empty]

   down &lt;rurl&gt; &gt;&gt; &lt;file&gt;

[else]

   echo Resolving URL "&lt;url&gt;" failed...
   echo
   wait Taste drücken zum Beenden
   exit

[endif]</pre>
<p>Die Funktion &#8220;mp3Gain&#8221;, die nach dem &#8220;lpc&#8221;-Statement kommt, ist in der Konfigurationsdatei definiert und ruft ein Hilfsprogramm auf, das wiederum mit der mp3Gain.exe,  die im selben Verzeichnis liegt, die Musikdatei normalisiert:</p>
<pre>// MP3-Gain
f:mp3Gain file

   [if &lt;file&gt; is not empty]

      echo Normalisieren...
      shell: &lt;script directory&gt;/ExecuteMp3Gain.bat | "&lt;file&gt;"

   [endif]

f:end</pre>
<p>Eine genaue Übersicht über alle von Lapicon unterstützen Funktionen findet sich in der Datei Lapicon.txt oder auf SourceForge: <a href="http://lastsharp.svn.sourceforge.net/viewvc/lastsharp/branches/Lapicon/Lapicon.txt?view=markup&amp;pathrev=65">http://lastsharp.svn.sourceforge.net/viewvc/lastsharp/branches/Lapicon/Lapicon.txt?view=markup&amp;pathrev=65</a></p>
<p><strong>Beispiel 2: Lyrics.lpc</strong></p>
<pre>// -------------------------------------------------------------------
// DarkSharp.Lyrics
//   Downloads lyrics
//   Copyright (c) 2009 Yannick Scherer
// -------------------------------------------------------------------
// Lyricwiki
#base http://lyricwiki.org/api.php
#rootnode LyricsResult
#static func getSong
#static fmt xml

// Config
inc(&lt;script directory&gt;/Config.DarkSharpScripts.lpc)

// Input
def artist &lt;&lt; Interpret
def track &lt;&lt; Titel

// Get Lyrics from Lyricwiki
[artist=&lt;artist&gt;&amp;song=&lt;track&gt;] store lyrics in lyrics

[if &lt;lyrics&gt; is not empty]
   // Clean
   artist = file(&lt;artist&gt;)
   track = file(&lt;track&gt;)
   // Save
   mkdir &lt;DS_LyricsPath&gt;
   echo crlf(&lt;lyrics&gt;) &gt;&gt;&gt; &lt;DS_LyricsPath&gt;&lt;artist&gt; - &lt;track&gt;.txt
[else]
   echo Keine Lyrics gefunden!
[endif]

echo
wait</pre>
<p>Anmerkungen hierzu: man kann Anfragen auch in einer Zeile und/oder ohne Angabe der Funktion schreiben. Letzteres ist immer dann notwendig, wenn der Parameter, der die Funktion enthält, nicht &#8220;method&#8221; heißt.</p>
<p>Des weiteren sieht man eine Dateiausgabe: zuerst wird mit &#8220;artist = file(&lt;artist&gt;)&#8221; der Interpret und anschließend der Titel bereinigt, dann wird ein Verzeichnis erstellt und anschließend eine Ausgabe in eine Datei getätigt. Das Einschließen der Lyrics in &#8220;crlf(&#8230;)&#8221; bewirkt, dass Zeilenumbrüche richtig umgesetzt werden; das Verwenden von &#8220;&gt;&gt;&gt;&#8221; statt &#8220;&gt;&gt;&#8221; zwingt Lapicon, eine evtl. vorhandene Datei zu überschreiben, anstatt an deren Ende etwas anzuhängen.</p>
<p>Das Nachvollziehen der Grundeinstellungen bleibt jedem selbst überlassen.</p>
<p>Ich hoffe, damit konnte ich ein wenig helfen, wenn es um die Arbeit mit Lapicon geht!</p>
]]></content:encoded>
			<wfw:commentRss>http://dev.xscheme.de/2009/04/kurzanleitung-zu-lapicon/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
