ripperX GTK2

RipperX is a GTK app that rips CD audio tracks and encodes them to the Ogg, MP3, or FLAC formats. It is also my favourite simple ripping tool, but it still uses the ugly GTK1 interface. That was my motivation to write a patch that ports ripperX to GTK2.

Patch against current SVN: ripperX-2.7-gtk2_i18n-rev2.patch.gz
RipperX source with the patch applied: ripperX-2.7.1-gtk2.tar.bz2

The patch is to be applied against the current code in SVN, but if you don't have all the necessary build tools to build from SVN and want to give it a go I've provided a tarball, made with 'make dist'.

What the patch does:

GTK2
Implements a GTK2 interface, version 2.6.0 or greater is required.
Not all deprecated GTK functions have been replaced. For developer help, I've added the --disable-deprecated configure option, with sets GTK_DISABLE_DEPRECATED. (Since not all are replaced, using that will result in a build failure at present.)

i18n
Implements the i18n (internationalisation) framework. gettext 0.15 or greater is recommended.
The patch includes a British English translation, po/en_GB.po, but this is simply a demonstration, as there's nothing that needs translating into British English.

build system
autoconf >= 2.60 is required.
All the files that will be auto-generated have been removed, such as configure, Makefile.in, etc. There is now no need to have a configure script in each sub directory. I have added autogen.sh, and this should be used to initiate an svn build, configure options can be passed to autogen.sh, as it runs configure. configure.in has been replaced by configure.ac, and configure.ac has all the necessary directives for building. 'make dist' will build both tar.gz and tar.bz2.

UPDATE [14-Jun-2007]
Updated both the patch and the tarball. The changes are in configure.ac: the configure script will now refuse to go any further if libid3 cannot be found.
UPDATE [25-Jan-2008]
A modified version of this patch is now in ripperX SVN, see this post for more information.

 

8 Responses to “ripperX GTK2”

  1. cycojesus Says:

    It doesn't compile here (Slackware-current)
    compilation fail on missing -lid3 -lstdc++

    Using Mozilla Firefox Mozilla Firefox 2.0.0.4 on Linux Linux
  2. rab Says:

    You need libid3, I can confirm that it works with version 3.8.3. You also need need libstdc++.

    Using Galeon Galeon 2.0.3 on Debian GNU/Linux Debian GNU/Linux
  3. cycojesus Says:

    I do have them, what I mean is that configure does not set them correctly (here) in the Makefile (and I never mastered the obscure art of autotools enough to try to fix it…)

    Using Mozilla Firefox Mozilla Firefox 2.0.0.4 on Linux Linux
  4. rab Says:

    Hmm, you had better give me a few more details. Did you build from SVN after applying the patch, or did you use the tarball that I provided?
    What are the actual error messages that you see?
    You can delete line 43 of configure.ac, 'AM_PROG_CC_STDC', (it is not needed), and then run ./autogen.sh again.

    Using Galeon Galeon 2.0.3 on Debian GNU/Linux Debian GNU/Linux
  5. cycojesus Says:

    Sorry about the lack of details ;)
    I tried both using the tarball you provide and applying your patch to svn, with the same result.

    It fails here :
    gcc -g -O2 -o ripperX cddb.o cddbp.o config_rw.o config_window_handler.o dir_window_handler.o err_dialog_handler.o job_control.o main.o main_window_handler.o misc_utils.o players_manipulation.o ripper_encoder_manipulation.o select_frame_handler.o status_frame_handler.o xpms.o /usr/lib/libgtk-x11-2.0.so /usr/lib/libgdk-x11-2.0.so /usr/lib/libatk-1.0.so /usr/lib/libgdk_pixbuf-2.0.so -lm /usr/lib/libpangocairo-1.0.so /usr/lib/libpango-1.0.so /usr/lib/libcairo.so /usr/lib/libgobject-2.0.so /usr/lib/libgmodule-2.0.so -ldl /usr/lib/libglib-2.0.so -lutil
    job_control.o: In function `job_finisher':
    /home/cycojesus/netStuff/2007/mai/25/ripperX-2.7.1-gtk2/src/job_control.c:475: undefined reference to `ID3Tag_New'
    /home/cycojesus/netStuff/2007/mai/25/ripperX-2.7.1-gtk2/src/job_control.c:476: undefined reference to `ID3Tag_Link'
    /home/cycojesus/netStuff/2007/mai/25/ripperX-2.7.1-gtk2/src/job_control.c:484: undefined reference to `ID3Tag_UpdateByTagType'
    /home/cycojesus/netStuff/2007/mai/25/ripperX-2.7.1-gtk2/src/job_control.c:485: undefined reference to `ID3Tag_Delete'
    misc_utils.o: In function `set_TagField':
    /home/cycojesus/netStuff/2007/mai/25/ripperX-2.7.1-gtk2/src/misc_utils.c:973: undefined reference to `ID3Frame_NewID'
    /home/cycojesus/netStuff/2007/mai/25/ripperX-2.7.1-gtk2/src/misc_utils.c:975: undefined reference to `ID3Tag_FindFrameWithID'
    /home/cycojesus/netStuff/2007/mai/25/ripperX-2.7.1-gtk2/src/misc_utils.c:978: undefined reference to `ID3Tag_RemoveFrame'
    /home/cycojesus/netStuff/2007/mai/25/ripperX-2.7.1-gtk2/src/misc_utils.c:981: undefined reference to `ID3Frame_GetField'
    /home/cycojesus/netStuff/2007/mai/25/ripperX-2.7.1-gtk2/src/misc_utils.c:981: undefined reference to `ID3Field_SetASCII'
    /home/cycojesus/netStuff/2007/mai/25/ripperX-2.7.1-gtk2/src/misc_utils.c:982: undefined reference to `ID3Tag_AttachFrame'
    collect2: ld returned 1 exit status
    make[2]: *** [ripperX] Erreur 1
    make[2]: quittant le répertoire « /home/cycojesus/netStuff/2007/mai/25/ripperX-2.7.1-gtk2/src »
    make[1]: *** [all-recursive] Erreur 1
    make[1]: quittant le répertoire « /home/cycojesus/netStuff/2007/mai/25/ripperX-2.7.1-gtk2 »
    make: *** [all] Erreur 2
    [1] 26400 exit 2 make

    then when I manually cd into src/ and run
    gcc -g -O2 -o ripperX cddb.o cddbp.o config_rw.o config_window_handler.o dir_window_handler.o err_dialog_handler.o job_control.o main.o main_window_handler.o misc_utils.o players_manipulation.o ripper_encoder_manipulation.o select_frame_handler.o status_frame_handler.o xpms.o /usr/lib/libgtk-x11-2.0.so /usr/lib/libgdk-x11-2.0.so /usr/lib/libatk-1.0.so /usr/lib/libgdk_pixbuf-2.0.so -lm /usr/lib/libpangocairo-1.0.so /usr/lib/libpango-1.0.so /usr/lib/libcairo.so /usr/lib/libgobject-2.0.so /usr/lib/libgmodule-2.0.so -ldl /usr/lib/libglib-2.0.so -lutil -lid3

    it fails with
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string, std::allocator >::copy(char*, unsigned int, unsigned int) const'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::_List_node_base::hook(std::_List_node_base*)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `operator new[](unsigned int)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::_List_node_base::unhook()'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `__cxa_begin_catch'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string
    , std::allocator >::_Rep::_M_destroy(std::allocator const&)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `operator delete[](void*)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_istream
    >::seekg(std::fpos<__mbstate_t>)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string, std::allocator >::_M_leak_hard()'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_ostream
    >::put(char)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::__throw_length_error(char const*)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::ios_base::ios_base()'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `operator delete(void*)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string
    , std::allocator >::basic_string(std::basic_string, std::allocator > const&, unsigned int, unsigned int)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string
    , std::allocator >::basic_string(char const*, std::allocator const&)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::__basic_file
    ::~__basic_file()'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `__cxa_call_unexpected'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string, std::allocator >::basic_string(std::basic_string, std::allocator > const&)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `__cxa_pure_virtual'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string, std::allocator >::~basic_string()'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string
    , std::allocator >::basic_string(char const*, unsigned int, std::allocator const&)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `vtable for std::basic_ios
    >'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string
    , std::allocator >::reserve(unsigned int)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `VTT for std::basic_ifstream
    >'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::__throw_out_of_range(char const*)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_istream
    >::tellg()'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `__gxx_personality_v0'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string
    , std::allocator >::_Rep::_S_empty_rep_storage'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string
    , std::allocator >::compare(char const*) const'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_ostream
    >::write(char const*, int)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string
    , std::allocator >::basic_string(unsigned int, char, std::allocator const&)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string, std::allocator >::reserve(unsigned int)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string, std::allocator >::append(char const*, unsigned int)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string, std::allocator >::_Rep::_S_empty_rep_storage'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string
    , std::allocator >::_M_mutate(unsigned int, unsigned int, unsigned int)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `VTT for std::basic_fstream >'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string
    , std::allocator >::append(std::basic_string, std::allocator > const&)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::ios_base::Init::~Init()'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_ostream
    >::seekp(std::fpos<__mbstate_t>)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_ostream >::flush()'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `__cxa_end_catch'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_filebuf
    >::open(char const*, std::_Ios_Openmode)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `vtable for std::basic_filebuf
    >'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `vtable for std::basic_streambuf
    >'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_ostream
    >::tellp()'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::locale::~locale()'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `vtable for __cxxabiv1::__class_type_info'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `__gnu_cxx::__exchange_and_add(int volatile*, int)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::ios_base::Init::Init()'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::ios_base::~ios_base()'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `__gnu_cxx::__atomic_add(int volatile*, int)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string
    , std::allocator >::_Rep::_S_max_size'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::__throw_logic_error(char const*)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `vtable for std::basic_ifstream
    >'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::__basic_file
    ::is_open() const'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_ios
    >::init(std::basic_streambuf >*)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string
    , std::allocator >::assign(std::basic_string, std::allocator > const&)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_istream
    >::read(char*, int)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_istream
    >::seekg(long long, std::_Ios_Seekdir)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_ostream
    >::seekp(long long, std::_Ios_Seekdir)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_filebuf
    >::close()'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string, std::allocator >::_Rep::_M_destroy(std::allocator const&)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_ios >::clear(std::_Ios_Iostate)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_filebuf
    >::basic_filebuf()'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `operator new(unsigned int)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `vtable for std::basic_fstream
    >'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string
    , std::allocator >::basic_string(std::basic_string, std::allocator > const&)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `vtable for __cxxabiv1::__si_class_type_info'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string
    , std::allocator >::assign(char const*, unsigned int)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string, std::allocator >::_Rep::_S_max_size'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_string, std::allocator >::_M_mutate(unsigned int, unsigned int, unsigned int)'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_fstream
    >::basic_fstream()'
    /usr/lib/gcc/i486-slackware-linux/4.1.2/../../../libid3.so: undefined reference to `std::basic_istream
    >::peek()'
    collect2: ld returned 1 exit status

    It finally compile with either
    g++ -g -O2 -o ripperX cddb.o cddbp.o config_rw.o config_window_handler.o dir_window_handler.o err_dialog_handler.o job_control.o main.o main_window_handler.o misc_utils.o players_manipulation.o ripper_encoder_manipulation.o select_frame_handler.o status_frame_handler.o xpms.o /usr/lib/libgtk-x11-2.0.so /usr/lib/libgdk-x11-2.0.so /usr/lib/libatk-1.0.so /usr/lib/libgdk_pixbuf-2.0.so -lm /usr/lib/libpangocairo-1.0.so /usr/lib/libpango-1.0.so /usr/lib/libcairo.so /usr/lib/libgobject-2.0.so /usr/lib/libgmodule-2.0.so -ldl /usr/lib/libglib-2.0.so -lutil -lid3

    or
    gcc -g -O2 -o ripperX cddb.o cddbp.o config_rw.o config_window_handler.o dir_window_handler.o err_dialog_handler.o job_control.o main.o main_window_handler.o misc_utils.o players_manipulation.o ripper_encoder_manipulation.o select_frame_handler.o status_frame_handler.o xpms.o /usr/lib/libgtk-x11-2.0.so /usr/lib/libgdk-x11-2.0.so /usr/lib/libatk-1.0.so /usr/lib/libgdk_pixbuf-2.0.so -lm /usr/lib/libpangocairo-1.0.so /usr/lib/libpango-1.0.so /usr/lib/libcairo.so /usr/lib/libgobject-2.0.so /usr/lib/libgmodule-2.0.so -ldl /usr/lib/libglib-2.0.so -lutil -lid3 -lstdc++

    removing AMPROGCC_STDC doesn't help

    Using Mozilla Firefox Mozilla Firefox 2.0.0.4 on Linux Linux
  6. Michael Rasmussen Says:

    I get this failure when running - I think it is related to the exit-button which is not grouped together with the other buttons.

    $ src/ripperX

    (ripperX:22926): Gtk-CRITICAL **: gtk_box_pack_start: assertion `child->parent == NULL' failed

    (ripperX:22926): Gtk-CRITICAL **: gtk_box_pack_start: assertion `child->parent == NULL' failed

    (ripperX:22926): Gtk-WARNING **: Attempting to add a widget with type GtkVBox to a container of type GtkFrame, but the widget is already inside a container of type GtkFrame, the GTK+ FAQ at http://www.gtk.org/faq/ explains how to reparent a widget.

    (ripperX:22926): Gtk-CRITICAL **: gtk_box_pack_start: assertion `child->parent == NULL' failed

    (ripperX:22926): Gtk-CRITICAL **: gtk_box_pack_start: assertion `child->parent == NULL' failed

    Using Debian IceWeasel Debian IceWeasel 2.0.0.3 on Debian GNU/Linux Debian GNU/Linux
  7. rab Says:

    I have now updated the patch so that the configure script will stop if libid3 cannot be found.

    cycojesus: I don't know why the configure script does not find libid3 for you. I suspect a local problem.

    Michael: Isn't this stuff just warnings, not failures?

    Using Galeon Galeon 2.0.3 on Debian GNU/Linux Debian GNU/Linux
  8. Michael Rasmussen Says:

    "Michael: Isn't this stuff just warnings, not failures?"

    According to the GNOME coding conventions a Gtk-CRITICAL is to be used if the error may cause a crash (Segmentaion faults) or data loss.

    I haven't ducked in to the source but I am convinced it is related to the exit-button which is floating outside the button group.

    Using Debian IceWeasel Debian IceWeasel 2.0.0.4 on Debian GNU/Linux Debian GNU/Linux

Leave a Comment

  • You are currently browsing the ripperX GTK2 entry of the breviary stuff

  • Current Books

    Further information and comments (RSS)
    Frank Aydelotte - Elizabethan Rogues and Vagabonds Frank Aydelotte - Elizabethan Rogues and Vagabonds
    [Frank Cass 1967]
    Marcus Rediker - Villains of All Nations, Atlantic Pirates in the Golden Age Marcus Rediker - Villains of All Nations, Atlantic Pirates in the Golden Age
    [Verso 2004]
    Buchanan Sharp - In Contempt of All Authority, Rural Artisans and Riot in the West of England, 1586-1660 Buchanan Sharp - In Contempt of All Authority, Rural Artisans and Riot in the West of England, 1586-1660
    [University of California Press 1980]
    E. P. Thompson - Whigs and Hunters, The Origin of the Black Act E. P. Thompson - Whigs & Hunters, The Origin of the Black Act
    [Penguin 1990]
  • Current Music

    Henry Snowstorm - Civil Unrest Henry Snowstorm - Civil Unrest
    [the Wild Beast Records 2007]
    Karl Hector and The Malcouns - Sahara Swing Karl Hector & The Malcouns - Sahara Swing
    [Now-Again 2008]
    Nigeria Special: Modern Highlife, Afro Sounds and Nigerian Blues 1970-6 Nigeria Special: Modern Highlife, Afro Sounds and Nigerian Blues 1970-6
    [Soundway Records 2008]
    Hypnotic Brass Ensemble - Sankofa / Salah Ragab - One Tree/Ole Hypnotic Brass Ensemble - Sankofa / Salah Ragab and the Afro-Egyptian Ensemble - One Tree/Ole
    [Honest Jon's Records 2007]
    Hypnotic Brass Ensemble - Brass In Africa Hypnotic Brass Ensemble - Brass In Africa
    [Handcuts Records 2007]
  • Latest from Atlas Press

    Carlo Emilio Gadda - The Philosophers' Madonna Carlo Emilio Gadda - The Philosophers' Madonna
    [Eclectics & Heteroclites 8 2008]
    Alfred Jarry - Three Early Novels Alfred Jarry - Three Early Novels
    [Anti Classic 9 2007]
    Michel Leiris - Mirror of Tauromachy Michel Leiris - Mirror of Tauromachy
    [Eclectics & Heteroclites 7 2007]
    Konrad Bayer - the sixth sense Konrad Bayer - the sixth sense
    [Eclectics & Heteroclites 6 2007]
  • Pages

  • Categories

  • Archives