TODO-list for amaroK
======================
<nick>  == reported by
-->nick == assigned to


SHORT-TERM (URGENT):

 <markey>  We really need to fix the crashes with the OpenGL analyzers that many users get.

 <illis.>  A whole lot (all?) of my mp3s have their titles truncated at 30-ish characters. This is almost
           certainly an ID3v1 vs 2 issue, v2 I think allows for unlimited length (or at least very very
           long), why don't we use it? (not sure whether the problem is in taglib or amarok...)
           <illissius> just found out via leinir that this was caused by the recoding id3v1 tags option.
                       disabling it fixed it. I think too many people are enabling this w/o knowing what
                       it does (case in point: me). Maybe stick a warning in the options dialog, or
                       make it not do unexpected things in the first place (eg, make id3v1 suck less,
                       but don't make it the default).

  <markey> Consider moving the GHNS provider list to a different server than amarok.kde.org,
           possibly download.kde.org or similar. (When our site is down, the GHNS feature fails
           to work entirely)

  <markey> amaroK fails to download any stream playlist from http://dir.xiph.org. Part of the problem is
           PlaylistLoader::isPlaylistFile(const KURL&), which only looks at the filename's extension. This
           fails for URLs like http://dir.xiph.org/listen.php?pid=669641&file=listen.m3u, because the filename
           is "listen.php". So it must look at the whole url instead.

  <markey> OSD doesn't show on top of other widgets with Fluxbox and other window managers.

  <mxcl>   Changing the title track to "" does such things as I cannot figure out, it appears to work, but
           perhaps the collection isn't updated, or maybe the tag, or both. Can't tell.

  <mxcl>   On first-ever-run, if amaroK crashes building the sqlite collection, it is impossible to _ever_
           build a collection unless the user's amarokrc file is deleted! This MUST be fixed before 1.2!
           ::muesli:: We could just _always_ try to create the sql tables on startup. This would fail on
           ::muesli:: systems which already got the tables, but would fix the situation where tables are
           ::muesli:: missing, as in this situation. Just pump the debug of these calls to /dev/null.

  <mxcl>   Just before we load any engine plugin, write to a file, and it we don't succeed the next time
           amaroK starts show a big warning saying "Gah!" and load a different one.

  <markey> In the settings dialog the "Apply" button is broken (always enabled).
           Update: This is now fixed except if you build with MySQL support. Reason is the MySQL password
           KConfigXT entry. Fix this properly for 1.2.1.

  <mxcl>   Playlist with files that exist that gst can't play + repeat-playlist = infinite loop - presumably
           load() and play() return true so the controller doesn't stop the playback

  <mxcl>   If you inline set the title tag to "", prettyTitle gets inserted as the title tag.

  <markey> When the KDE color scheme is changed while amaroK is running, all toolbar buttons (those with text)
           lose their texts.

  <markey> Ctrl-C in Playlist for copying title doesn't work, because the event gets eaten by another widget.


MID-TERM:
  <eean>   When the player window shades, it should lose its title bar and be replaced with something more
           compactish. This would probably have to be created manually.

  <sebr>   Make the player window scroll the text in the opposite direction if using right-2-left text
           (eg hebrew or arabic)

  <illiss.>Option to "fill in tags from filename" in the meta-information dialog. Perhaps steal some (more)
           code from JuK.

  <sebr>   Use Metabar's box retraction animation to the context browser. More iCandy. Any Javascript experts around?

  <mxcl>   Should be able to open collection browser by right clicking on stuff in contextB, so show the
           artist or album that is right clicked.

  <markey> AudioCD support for gst engine (cdparanoia ! *sink). -->markey

  <markey> We should cut down on unnecessary/redundant debug output/warnings (noise).

  <markey> Make ArtsEngine depend not only on kdemultimedia-devel, but also on kdemultimedia,
           since arts itself contains these crappy decoders and ppl come complain about bad sound.
           Update: Would be even better to detect the mpeglib arts-plugins directly, since some
           distros offer them as a separate package.

  <mxcl>   Perhaps a nice idea: when you drag playlistItems to a branch in the collection browser
           it prompts to change the track's tags, so drag a track to the "moolaaa" album and that
           track get's it's album tag changed to "moolaaa" and is inserted into the branch, so the user
           know's what has happened.

  <mxcl>   User asked for a CTRL-J itty-bitty dialog that allows you to jump to a specific part
           of a track. I'll see if I can do it with tiny amount of code -->mxcl

  <muesli> Don't rely on KDE timeouts to see whether a file is accessible or not,
           since this really sucks for disconnected network shares. XMMS handles
           this way better and it really is a problem in userland. maybe a thread
           helps, which simply tries to fopen() the file. if this task hasn't been
           finished in (let's say) 3 seconds, jump to the next song. XMMS even
           remembers such files and their folders, so that it's not going to open
           another file from that folder for the next few minutes. what about hdd
           sleep-timeouts? opinions?

  <mxcl>   Determine some behavior for the clear/shuffle/etc. buttons when a search is in action
           clear   -> only clear the stuff that was searched for?
           shuffle -> stop the search and do normal shuffle?
           ADDitionally what to do when user rearranges a set of items that are the search result?
  <larson> No big deal to me as long as the behaviour is consistent. I.e. if shuffle shuffles
           the search, then clear should clear the search only, and visa versa.

  <larson> Make playlist toolbar buttons toggle like the playerwidget buttons.

           Toolbar button in FileBrowser for switching recursive directory reading.

  <mxcl>   Can't resize newly displayed columns if they are hidden at beginning of session -->mxcl

  <muesli> Add an option "clean up playlist on startup".
  <mxcl>   Do you mean remove duplicates or dead entries etc. ? Cool.

  <mxcl>   Option: don't crossfade for sequential tracks on same album. Comments? -->mxcl
           Of course, there would still be the up to 150ms gap, but we can fix that some other time..
  <markey> Please clarify: is this the same as BR #75388 ?
  <mxcl>   No, this is just to make crossfading not ruin album transitions

           Add dirs to combo history when user adds a track from that dir to the playlist.

           "Show playlist" to the right click menu, redundant but necessary.

           More KTips, better KTips, somehow use the "Did you know" tip dialog (eg kmail, gideon, etc.) -->mxcl

           Option to automatically adjust column widths.

           Option to implicitly sort playlist by { track, album } (on drop only) -->mxcl

  <berkus> Playmode indication button in main widget (repeat track/pl/shuffle), clickable.


LONG-TERM:

  <sebr>   Support multiple collections.  This could be really powerful, and could be handled
           with the collection browser.  We could support non-local collections, audio cd/dvds,
           NFS/Samba etc.  This would also allow us to retrieve tracks from other networked pcs.
           Auto-polling of added collections for a 'hot-sync' style detection of collections.

  <markey> Use more accurate interpolation for analyzers (cubic or spline)

           Tabbed playlists.
           Pro: it's convenient to have several playlists
           Contra: the playlist is getting cluttered enough as it is!
           <illissius> I already added a comment wrt this to the b.k.o bug, but here's the idea:
                       switch between playlists with the playlist browser -- that's what it's there for.
                       This avoids the clutter. The way it'd work is the currently playing playlist would
                       have the same fancy fading thing the current track has. The context menu for playlists
                       would have two seperate items, one for showing and one for playing. When just showing,
                       the previous playlist would continue playing while you view/edit the other one.
                       (If you doubleclick a song in the new playlist, it would naturally start playing that
                       one instead). What to do when the user doubleclicks a playlist -- show, play, or both
                       -- is TBD.

           Make windows magnetic / sticking together (difficult).

  <mxcl>   Implement beat detection (thread?), interface should glow/move to
           the beat, visualisations have access to beat/bpm info.

           Audio system info widget, showing all available codecs and similar info.

           Resizable playerwidget, like in Winamp3.


IDEAS:

           Bookmarks inside of tracks (good for very long tracks), and nifty bookmark browser

           Using filelight (as a kpart maybe) for a graphical representation of the playlist. so
           you could see at first glance how the altogether playing time is divided into different
           albums, tunes and so on.


DISCUSSING:

  <markey> I'd very much appreciate people keeping line length in all amaroK sources/textfiles
           at 110 characters max. Longer lines cause horrible dynamic line breaks or scrolling when
           you only have limited screen width, like in console or kdevelop. pretty please with icing =)
  <mxcl>   I added a 110 char marker to my editor (since ages ago). However I don't always keep to it.
           Breaking lines is most often ugly :( Mostly I do though. You can praise me now ;)


DO-NOT-IMPLEMENT (stuff that was rejected):

  <markey> Allow removing of playlist items by dragging back into browser.
  <larson> I think this is really weird. When I drag something I expect that someting to be
           ADDed or opened in the target. Not removed from the sender.
           (RFC: is this still appropriate or would it be misleading?)
  <muesli> imho, it's misleading and not hid-compatible. i would rather
           expect that file to be copied to the browser's current directory.

          "Hide playlist when main widget is not active" option (?? comments please: )
  <berkus> Noo, we have it hiding into tray, thats enough (imagine how much flashing will be
           if i drag mouse around with "focus follows mouse" on - this is the one i use all the time)
  <mxcl>   Hence it's an option, you'd not use it with focus follows mouse. But it was just an idea
           anyway.. dunno if I like the sound of it anymore either.


BACKTRACES/DEBUG/VALGRIND:

<markey> This is rather nasty. I think we should change the SubmitItem handling in scrobbler.cpp
         from heap-allocated to stack-allocated to fix it:
==16118== 5628 (540 direct, 5088 indirect) bytes in 27 blocks are definitely lost in loss record 291 of 383
==16118==    at 0x1B904471: operator new(unsigned) (vg_replace_malloc.c:132)
==16118==    by 0x81815C6: Scrobbler::engineNewMetaData(MetaBundle const&, bool) (scrobbler.cpp:238)
==16118==    by 0x80FABDF: EngineSubject::newMetaDataNotify(MetaBundle const&, bool) (engineobserver.cpp:81)
==16118==    by 0x80F7F30: EngineController::play(MetaBundle const&) (enginecontroller.cpp:352)
==16118==    by 0x8130A02: Playlist::activate(QListViewItem*) (playlist.cpp:1126)
==16118==    by 0x812FF1C: Playlist::playNextTrack(bool) (playlist.cpp:856)
==16118==    by 0x813C55F: Playlist::qt_invoke(int, QUObject*) (playlist.moc:313)
==16118==    by 0x1CB4AD91: QObject::activate_signal(QConnectionList*, QUObject*) (in /usr/qt/3/lib/libqt-mt.so.3.3.4)
==16118==    by 0x1CB4B859: QObject::activate_signal_bool(int, bool) (in /usr/qt/3/lib/libqt-mt.so.3.3.4)
==16118==    by 0x80F8E08: EngineController::orderNext(bool) (enginecontroller.moc:212)
==16118==    by 0x80F790A: EngineController::next(bool) (enginecontroller.cpp:288)
==16118==    by 0x80F8B8B: EngineController::slotTrackEnded() (enginecontroller.cpp:597)


==16118== 3839 (2579 direct, 1260 indirect) bytes in 130 blocks are definitely lost in loss record 272 of 383
==16118==    at 0x1B9042F5: malloc (vg_replace_malloc.c:130)
==16118==    by 0x232BB946: g_malloc (in /usr/lib/libglib-2.0.so.0.600.4)
==16118==    by 0x232CC0C8: g_strdup (in /usr/lib/libglib-2.0.so.0.600.4)
==16118==    by 0x23082ADF: gst_tag_list_get_string (in /usr/lib/libgstreamer-0.8.so.1.4.0)
==16118==    by 0x2301189C: GstEngine::found_tag_cb(_GstElement*, _GstElement*, _GstStructure*, void*) (gstengine.cpp:140)
==16118==    by 0x23091D09: gst_marshal_VOID__OBJECT_BOXED (in /usr/lib/libgstreamer-0.8.so.1.4.0)
==16118==    by 0x2315B0A8: g_closure_invoke (in /usr/lib/libgobject-2.0.so.0.600.4)
==16118==    by 0x2316FA42: (within /usr/lib/libgobject-2.0.so.0.600.4)
==16118==    by 0x23170AEB: g_signal_emit_valist (in /usr/lib/libgobject-2.0.so.0.600.4)
==16118==    by 0x23170DC5: g_signal_emit (in /usr/lib/libgobject-2.0.so.0.600.4)
==16118==    by 0x2305A431: (within /usr/lib/libgstreamer-0.8.so.1.4.0)
==16118==    by 0x23091D09: gst_marshal_VOID__OBJECT_BOXED (in /usr/lib/libgstreamer-0.8.so.1.4.0)


==16118== 2876 (1096 direct, 1780 indirect) bytes in 14 blocks are definitely lost in loss record 274 of 383
==16118==    at 0x1B904CA0: calloc (vg_replace_malloc.c:175)
==16118==    by 0x232BB9BE: g_malloc0 (in /usr/lib/libglib-2.0.so.0.600.4)
==16118==    by 0x2309A1A3: (within /usr/lib/libgstreamer-0.8.so.1.4.0)
==16118==    by 0x2308E94D: gst_registry_load (in /usr/lib/libgstreamer-0.8.so.1.4.0)
==16118==    by 0x2308F7C8: (within /usr/lib/libgstreamer-0.8.so.1.4.0)
==16118==    by 0x232B32FE: g_list_foreach (in /usr/lib/libglib-2.0.so.0.600.4)
==16118==    by 0x2308F801: gst_registry_pool_load_all (in /usr/lib/libgstreamer-0.8.so.1.4.0)
==16118==    by 0x23044E74: (within /usr/lib/libgstreamer-0.8.so.1.4.0)
==16118==    by 0x230453BD: gst_init_check_with_popt_table (in /usr/lib/libgstreamer-0.8.so.1.4.0)
==16118==    by 0x2304553B: gst_init_check (in /usr/lib/libgstreamer-0.8.so.1.4.0)
==16118==    by 0x23012CCC: GstEngine::init() (gstengine.cpp:271)
==16118==    by 0x80F71DC: EngineController::loadEngine(QString const&) (enginecontroller.cpp:172)


