Jamendo Console Player
Polubiłem ostatnio słuchanie muzyki z Jamendo. Poziomem przewyższa (muzyka) pop-emo chłam, którym "raczą" mnie krajowe stacje radiowe, a do tego
Potrzeba
Niby nic, ale dla mnie to problem. Moim źródłem muzyki jest mój servero-media-center zrobiony z hapekowego cienkiego klienta i odpalanie na nim X'ów tylko do słuchania muzyki to zbyt duży 'koszt' (udam, że bez znaczenia jest fakt, że ja po prostu lubię pracować w konsoli).
Rozwiązanie
Gotowego rozwiązania nie znalazłem (jest kilka okienkowych jamendo-playerów). Trochę pokombinowałem w Pythonie. Zaliczyłem facepalm, gdy zorientowałem się, że adresy, które wyciągałem Wiresharkiem, są opublikowane na oficjalnej stronie Jamendo. W końcu doszedłem do czegoś co nawet działa.

Podstawowa funkcjonalność, która spełnia w 100% moje potrzeby zawiera się w trzech punktach:
- odtwarzanie konkretnego albumu
- ściąganie konkretnego albumu
- odtwarzanie Radia Jamendo
Nie ma żadnego przewijania, scroblowania, dodawania do ulubionych, itd. Żadnych zbędnych wodotrysków. Odpalam to sobie w screenie i leci sobie godzinami. Gdy odtwarzany kawałek wyjątkowo mi się nie podoba pojedyncze
Ctrl+C przechodzi do następnego utworu, przytrzymane - ubija playera.
Pod maską
Kod jest prosty (wręcz prostacki). Ameryki nie odkryłem. Odpytując kilka adresów, wyciągam poprzez API Jamendo adres ścieżki audio. Pozostaje tylko ją odtworzyć.
Na początku kombinowałem z gstreamer'em ale okazało się, że na jednej maszynie działa, a na drugiej - mimo zbliżonej konfiguracji - odmawia posłuszeństwa. Z wrodzonego lenistwa sięgnąłem więc po rozwiązanie najprostsze - uruchamiam w tle aplikację mpg123 z adresem mp3ki jako parametrem. Całość działa sprawnie i zgrabnie, jak na razie, żadnych większych problemów nie zaobserwowałem.
Repo
Jeśli ktoś ma ochotę zajrzeć lub pogrzebać w kodzie, to proszę się nie krępować:
git://github.com/satanowski/Jamendo-Console-Player.git
Wytykanie błędów mile widziane :)
Kilka linijek a jak cieszą :)
...tak wiem, przestałem słuchać Trójki, ale jakoś nie mogę sobie odmówić porannych wiadomości.
crontab
59 6 * * 1-5 /usr/share/budzik/budzik.sh "mms://stream.polskieradio.pl/program3_wma10"
55 7 * * 1-5 killall mplayer
budzik
$ cat /usr/share/budzik/budzik.sh
mplayer ~/.budzik </dev/null > /dev/null 2>&1 &
if [ "$1" != "" ]
then
sleep 30
killall mplayer > /dev/null 2>&1
mplayer $1 </dev/null > /dev/null 2>&1 &
fi
~/.budzik
$ ls -l .budzik
lrwxrwxrwx 1 satanowski satanowski 91 mar 28 22:30 .budzik -> Muzyka/.../xxxx.mp3
gaffitter + dvdisaster = całkiem dobry backup
Z racji niemiłych doświadczeń z dyskami twardymi, które zwykły mi padać w najmniej oczekiwanych momentach przyłożyłem się bardziej do tematu backupu danych
Na początek zamontowałem RAID'a 1. Ponieważ jednak żaden RAID nie zabezpieczy mi danych np. przed kradzieżą czy pożarem, postanowiłem usprawnić trochę procedurę backupu na płytkach DVD (w przyszłości BD), które traktuję jako żelazne zabezpieczenie właśnie na wypadek "kataklizmu".
Jako, że nie planuję backup'owych płytek na co dzień używać, pominąłem całkowicie zagadnienie ich katalogowania. Zabezpieczane dane to w moim przypadku tylko zdjęcia więc cała operacja sprowadzała się do odpowiedniego wypalenia płytek.
Pozostały więc problemy: optymalnego wykorzystania pojemności płyty oraz zabezpieczenia jej przed błędami odczytu.
Optymalne wykorzystanie miejsca
...czyli nic innego jak tzw. problem plecakowy. Z lekkim uczuciem wstydu przyznam, że zmarnowałem trochę czasu na próbach samodzielnej implementacji rozwiązania tego problemu ale na szczęście szybko pod myszkę wpadł mi gaffitter, który wybawił mnie z opresji :).
Zabezpieczenie przed błędami odczytu
Tu już nawet nie próbowałem kombinować na własną rękę - skorzystałem z poleconego dvdistaster'a.
Jak to działa?
Gdy już mamy potrzebne narzędzia możemy wziąć się do roboty. Zaczynamy od końca czyli od płytki. Znajdujemy właściwy rozmiar naszej płytki i wyznaczamy 80% tej wartości. 20% przeznaczone będzie na nadmiarowe dane naprawcze (Tak zaleca autor dvdisaster'a).
W moim przypadku było to: 4707319808B → 3765855846B
Następnie:
- używając
gaffitter'a wyznaczamy zestaw danych optymalnie wypełniających zadaną pojemność:
gaffitter -b -t 3765855846 /katalog/z/danymi - Wybrany zestaw danych zamieniamy na obraz ISO przy pomocy mkisofs:
mkisofs -o dvd.iso /katalog/z/zestawem - otrzymany plik iso wzbogacamy o dane naprawcze(żadne dodatkowe pliki nie zostaną dodane do obrazu płyty):
dvdisaster -c -mRS02 -i dvd.iso
Na końcu otrzymujemy plik ISO z gotowym do wypalania obrazem płyty.
Obraz wypalamy i cieszymy się zabezpieczoną płytką :-).
Wszystko oczywiście można też wyklikać, ale podejście konsolowe daje możliwość sporej automatyzacji.
Teścik
Oczywiście nie mogłem sobie odmówić przyjemności przetestowania skuteczności tego zabezpieczenia. Test nie był zbyt subtelny, po prostu porysowałem zabezpieczoną płytkę śrubokrętem i spróbowałem ją odczytać.
Płytka wyglądała tak:
Tak wyglądał proces jej odczytu (na czerwono zaznaczone sektory płyty, których nie dało się odzyskać:
Efektem dość długiego odczytu był obraz iso uszkodzonej płyty. Wystarczyło jedno kliknięcie (lub polecenie) w dvdisasterze i w automagiczny sposób obraz płyty wracał do stanu idealnego:
Oryginalny obrazmd5:3caeebc8dcfff53940eb2ad3a00b325b
Obraz płyty uszkodzonej
md5:758d5ae26de7f6c5159856ea5600a087
Obraz po naprawie:
md5:3caeebc8dcfff53940eb2ad3a00b325b
I to by było na tyle. Myślę, że warto poświęcić te 10 dodatkowych minut i 20% pojemności płyty dla zwiększenia bezpieczeństwa wypalanych danych. Powodzenia w backupowaniu.
Router martwy ale jednak żywy

... no i się okazało, że cała awaria to jeden elektrolit w zasilaczu. Koszt - coś koło 1zł. Po prostu super :-) Dobra rada dla właścicieli sprzętu Linksys'a (itp.), jeśli twój sprzęt przestał działać i robi tylko coś takiego: ... nie kupuj od razu nowego :)
Pidgin (dla Windows) - profile proxy
Zarówno w domu, jak i w pracy mój net śmiga przez proxy, z tym, że w domu tylko http, a w pracy wszystko. Żeby było trudniej jabber potrzebuje zupełnie innego proxy niż gg, nie mówiąc już np. o pluginie do facebook'a. Każda zmiana miejsca używania wiązała się z ręczną zmianą ustawieńJak na razie Pidgin profilów proxy nie wspiera, ani też o żadnym, służącym do tego celu pluginie nie słyszałem. Postanowiłem więc zmajstrować coś samodzielnie.
Coś mi nawet wyszło, więc się dzięlę - może komuś też się przyda :-).
Ustawienia proxy Pidgin trzyma w dwóch plikach:
- globalne ustawienia w:
PidginPortable\Data\settings\.purple\prefs.xml
- ustawienia dla poszczególnych kont w:
PidginPortable\Data\settings\.purple\accounts.xml
.bat).
Jest jednak inaczej. Pliki zawierają znacznie więcej. W przypadku zmiany jakiegokolwiek ustawienia programu, drugi zestaw ustawień stawałby się automatycznie nieaktualny.Pozostało grzebanie w plikach i podmiana tylko konkretnych ustawień proxy.
Pewnie dałoby się to zrobić w kilku liniach Perla/Pythona/itp. ale nie wchodziło to w moim przypadku w grę, ponieważ nie miałem pewności, że na wszystkich komputerach, na których będę uruchamiał Pidgina będzie coś więcej niż sam system.
Wybrałem więc windowsowy JScript. Może i jest coś lepszego, ale akurat tego chciałem spróbować :-).
Działanie skryptu jest banalne. Znajduje w plikach konfiguracyjnych odpowiednie node'y, podmienia na nowe, zapisuje i uruchamia Pidgina.
Plik:
runner.js
W nagłówku znajduje się mniej więcej taka sekcja:
var settings = {
// -------------------------------------------------------------------------------------------+
'global' : {'type':'none' , 'host':'' , 'port': ''},
// -------------------------------------------------------------------------------------------+
'66666' : {'type':'none' , 'host':'' , 'port': ''},
'login@jabber.aster.pl/zasób' : {'type':'none' , 'host':'' , 'port': ''},
'login@irc.freenode.net' : {'type':'none' , 'host':'' , 'port': ''}
// -------------------------------------------------------------------------------------------+
}
Tę sekcję należy oczywiście zmienić według własnych potrzeb. Warto zajrzeć do oryginalnego pliku accounts.xml w razie wątpliwości.Poszczególne konta mogą mieć różne ustawiania:
'66666' : {'type':'http' , 'host':'moje.super.proxy.pl' , 'port': '8080'},
lub wskazywać na głowne, które musi być wtedy oczywiście ustawione:
'global' : {'type':'http' , 'host':'moje.super.proxy.pl' , 'port': '8080'},
// -------------------------------------------------------------------------------------------+
'66666' : {'type':'global' , 'host':'' , 'port': ''},
Przygotwujemy tyle kopii tego pliku ile proxy-profili nam potrzeba (do domu, do pracy, do sąsiada, do dziewczyny, ...
Tak na wszelki wypadek, lepiej zrobić kopię zapasowa plików ustawień przed użyciem tego skryptu - to że u mnie działa, nie znaczy, że będzie działać wszędzie :-).
Za wszelkie powstałe szkody nie odpowiadam.



