Drucken vom iPad auf Windows Drucker mit AirPrint

Mit dem iOS-Update sollte man eigentlich in der Lage sein, vom iPad auf Netzwerkdrucker zu drucken. Auch auf Drucker, die unter Windows freigegeben worden sind. Der dazu notwendige AirPrint-Dienst ist aber von Apple zurückgenommen worden. Bei ifun ist ein netter Artikel mit einer ausführlichen Anleitung, wie man den AirPrint-Dienst aus einer iTunes-Beta verwenden kann. Schön ist das nicht (unsupported Beta halt), aber es funktioniert mit meinem betagten CANON Pixma IP4000 perfekt. 🙂

Neue Musik entdecken mit Aweditorium

Schon witzig, manche Internetdienste laufen einem (leider) erst über den Weg, wenn sie eine passende iOS App entwickeln. In diesem Fall geht es um thesixtyone.com mit  Aweditorium. In der App bewegt man sich über eine Wand voller Fliesen, die jeweils den Song eines eher unbekannten Künstlers repräsentieren. Ein Fingertipp und schon startet der Song. Dabei hat man zwei Modi: a) Karaoke, d.h. man bekommt die Lyrics passend zur Musik angezeigt und b) Hintergrundinfos zur Band in Form von Sprechblasen ähnlich den VH1 Pop-Up Videos. Dazu kommt noch die Möglichkeit direkt das passende Musikvideo über Youtube innerhalb der App anzuschauen.

Insgesamt eine witzige Art neue Musik zu entdecken, die zudem deutlich mehr Spaß macht als bei iTunes zu stöbern. Ich habe bisher 6% der derzeitigen Fläche „erforscht“ und habe mir direkt aus der App über einen iTunes-Link Chrystalised von The xx gekauft. Rain von Priscilla Ahn gibt es anscheinend noch nicht in deutschen Download Stores. Wer bewegte Bilder zu der App sehen möchte, wird bei scobleizer.com fündig. Es wäre schön, wenn sich das lahme und überfrachtete iTunes mal eine dicke Scheibe von Aweditorium abschneiden würde.

Videos fürs iPad im Batch konvertieren

Gestern wollte ich einige .avi-Dateien in ein iPad kompatibles Format konvertieren. iTunes scheint das leider nicht von Haus aus zu unterstützen. Nach einigem relativ erfolglosen Googlen habe ich ein paar iPhone-Anleitungen mit ein paar alten Batch-Dateien kombiniert, mit denen ich mal Flash-Videos in AVI konvertiert habe.

Zutaten:

Hier die convert_to_ipad.cmd. Es nimmt alle Avi-Dateien aus dem Verzeichnis G:\AVIs und konvertiert diese in das mp4-Format im selben Verzeichnis.

[sourcecode language=“shell“]
set MPLAYERPATH=D:\Downloads\MPlayer\MPlayer-p4-svn-31372
set VIDEOPATH=G:\AVIs
for %%F IN (%VIDEOPATH%\*.avi) do %MPLAYERPATH%\mencoder.exe "%VIDEOPATH%\%%~nF.avi" -of lavf -lavfopts format=mp4 -vf scale=1024:-3 -ovc x264 -x264encopts crf=28:vbv_maxrate=1500:vbv_bufsize=2000:nocabac:global_header:frameref=3:threads=2:bframes=0:subq=6:mixed-refs=0:weightb=0:8x8dct=1:me=umh:partitions=all:qp_step=4:qcomp=0.7:trellis=1:direct_pred=auto -oac faac -faacopts mpeg=4:object=2:br=160:raw -channels 2 -srate 48000 -o "%VIDEOPATH%\%%~nF.mp4"
[/sourcecode]

UPDATE 2010-08-01: Ich habe die Parameter noch mal angepasst nach den Tipps von Mike. Die Variante vorher hat bei mir bei einigen Videos extremes Bildflackern erzeugt. Außerdem ist Bildverhältnis jetzt abhängig vom Input-Video (Parameter „-vf scale =1024:-3“).

UPDATE 2010-09-19: Der Link der Datei libfaac-1.28.7z hat sich geändert. Danke an Sören!

phonotunes.php: phonostar-Player Aufnahmen in iTunes als Podcast verfügbar machen

Ich bin ein großer Fan des phonostar-Player. Mit diesem Programm kann man sehr bequem Radiosendungen aufnehmen. Da ich einen iPod nutze, musste ich die Aufnahmen bisher umständlich in eine Playliste im iTunes importieren. Dadurch habe ich aber keine Übersicht über schon gespielte Folgen und kann längere Hörspiele nicht mal eben in der Mitte unterbrechen und später an der Stelle fortsetzen. Wie schön läuft das dagegen bei einem Original Audio Podcast – z.B. dem des ARD Radio-Tatort. Automatisch lädt die neueste Folge und wird synchronisiert, bereits angehörte Folgen werden automatisch entfernt.

Ich habe daher ein wenig geschraubt und ein PHP-Script geschrieben mit dem ich meine phonostar-Player-Aufnahmen meinem iTunes in Form eines lokalen Audio-Podcasts unterschiebe. Ein Beitrag von digitaltoast hat mich da sehr schnell auf die richtige Spur gesetzt.

Voraussetzung: ein lokaler Webserver mit PHP Unterstützung. Ich habe dafür den IIS auf meinem Windows 7 konfiguriert.

Installation (IIS): Ich habe in meinem Webserver-Verzeichnis den Ordner phonotunes erstellt, die phonotunes.php dorthin kopiert und über den IIS Manager dort ein virtuelles Verzeichnis „Aufnahmen“ eingehängt, dass auf den Aufnahmenordner des phonostar-Player zeigt. Danach zeigt „http://localhost/phonotunes/Aufnahmen“ auf „D:\\Temp\\radiostreams\\phonostar\\Aufnahmen“.

Und schon kann man im iTunes den Link http://localhost/phonotunes/phonotunes.php hinzufügen und mit seinem iPod synchronisieren.

Verbesserungsvorschläge willkommen!

[sourcecode language=“php“]
<?php
/**
* phonotunes – generate iTunes compatible audio podcasts based on phonostar-Player recordings
*
* Copyright 2010 Tobias Harmes
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
* @author Tobias Harmes, tobias@harmes.de
* @link https://harmes.de
* @version 2010-05-16
* @license Apache License, Version 2.0
*/

//change this to your needs
define (‚RECORDINGS‘, ‚D:\\Temp\\radiostreams\\phonostar\\Aufnahmen‘);
define(‚URLBASE‘,’http://localhost/phonotunes/Aufnahmen‘);

/**
* traverse sub-dirs and build up xml object
*
* @param $start directory to start at
* @param $xml_generator XML document object <by ref>
* @param $win32 determines slash, defaults to true
*/
function directoryList($start,&$xml_generator,$win32=true){
if($win32){
$slash="\\";
}else{
$slash="/";
}
$basename = pathinfo($start);
$basename = $basename[‚basename‘];
$ls=array();
$dir = dir($start);
while($item = $dir->read()){
if(is_dir($start.$slash.$item)&& $item!="." && $item!=".."){
$ls[$basename][]=directoryList($start.$slash.$item,&$xml_generator,$win32);
}else{
if($item!="."&&$item!=".."){
$ls[$basename][]=$item;
$itempath = $start.$slash.$item;
//remove default path
$itemurl = str_replace(RECORDINGS, "", $itempath);
//encode all funny characters and spaces
$itemurl = rawurlencode($itemurl);
//restore the slashes
$itemurl = str_replace(rawurlencode($slash),"/",$itemurl);
$itemurl = URLBASE.$itemurl;

$itempathinfo = pathinfo($itempath);
$recording = $xml_generator->addChild(‚item‘);
$title = str_replace("_"," ",$itempathinfo[‚filename‘]);
//remove the leading date if any
if (preg_match(‚/^\d{4}-\d{2}-\d{2}.*/‘,$title))
{
$title = substr($title, strlen("yyyy-mm-dd")+1);
}
$recording->addChild(‚title‘, $title);
$recording->addChild(‚pubDate‘, date(DATE_RFC822, filemtime($itempath)));
//if this is a regular recording use the folder name
$description = substr($start, strlen(RECORDINGS)+1);
$description = str_replace("_"," -",$description);
$recording->addChild(‚description‘, $description);
$recording->addChild(‚link‘, $itemurl);
$enclosure = $recording->addChild(‚enclosure‘);
$enclosure->addAttribute(‚url‘, $itemurl);
$enclosure->addAttribute(‚length‘, filesize($itempath));
$enclosure->addAttribute(‚type‘, ‚audio/mpeg‘);
}
}
}
return $ls;
}//directoryList

$xml_string ='<?xml version="1.0" encoding="UTF-8"?>‘."\r\n"."<channel>"."\r\n"."</channel>";
$xml_generator = new SimpleXMLElement($xml_string);
$xml_generator->addChild(‚title‘, ‚phonotunes radio podcast‘);
$xml_generator->addChild(‚category‘, ‚Audio Podcasts‘);

$dirlist = directoryList(RECORDINGS,$xml_generator, true);

header("Content-Type: text/xml");
$xml_result = $xml_generator->asXML();
$xml_LeftHandSide = ‚<?xml version="1.0" encoding="UTF-8"?>‘."\r\n".'<rss xmlns:itunes="http://www.itunes.com/DTDs/podcast-1.0.dtd" version="2.0">‘;
$xml_RightHandSide = substr($xml_result, 39);
echo $xml_LeftHandSide . $xml_RightHandSide . "</rss>";
?>
[/sourcecode]