From amarok-devel Wed Sep 29 21:39:48 2010 From: "Thomas Pfeiffer" Date: Wed, 29 Sep 2010 21:39:48 +0000 To: amarok-devel Subject: Re: Review Request: MusicBrainz and MusicDNS services support Message-Id: <20100929213948.25939.9092 () vidsolbach ! de> X-MARC-Message: https://marc.info/?l=amarok-devel&m=128579643501457 MIME-Version: 1 Content-Type: multipart/mixed; boundary="--===============0638447356==" --===============0638447356== Content-Type: multipart/alternative; boundary="===============8501380973137032500==" --===============8501380973137032500== Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable > On None, Sergey Ivanov wrote: > > Looks works for me. > = > Leo Franchi wrote: > Doesn't compile when KDE4_BUILD_TESTS is enabled: > = > = > [ 54%] Building CXX object tests/core-impl/collections/proxycollectio= n/CMakeFiles/testproxycollectionmeta.dir/TestProxyCollectionMeta.o > /home/leo/kde/src/amarok/tests/core-impl/collections/proxycollection/= TestProxyCollectionMeta.cpp: In member function =E2=80=98void TestProxyColl= ectionMeta::testEditableCapabilityOnMultipleTracks()=E2=80=99: = = = > /home/leo/kde/src/amarok/tests/core-impl/collections/proxycollection/= TestProxyCollectionMeta.cpp:463:51: error: cannot allocate an object of abs= tract type =E2=80=98MyEditCapability=E2=80=99 > /home/leo/kde/src/amarok/tests/core-impl/collections/proxycollection/= TestProxyCollectionMeta.cpp:433:1: note: because the following virtual fu= nctions are pure within =E2=80=98MyEditCapability=E2=80=99: > /home/leo/kde/src/amarok/src/core/capabilities/EditCapability.h:57:26= : note: virtual void Capabilities::EditCapability::setUid(const QString&= , const QString&) > /home/leo/kde/src/amarok/tests/core-impl/collections/proxycollection/= TestProxyCollectionMeta.cpp:464:51: error: cannot allocate an object of abs= tract type =E2=80=98MyEditCapability=E2=80=99 > /home/leo/kde/src/amarok/tests/core-impl/collections/proxycollection/= TestProxyCollectionMeta.cpp:433:1: note: since type =E2=80=98MyEditCapabi= lity=E2=80=99 has pure virtual functions > make[2]: *** [tests/core-impl/collections/proxycollection/CMakeFiles/= testproxycollectionmeta.dir/TestProxyCollectionMeta.o] Error 1 > make[1]: *** [tests/core-impl/collections/proxycollection/CMakeFiles/= testproxycollectionmeta.dir/all] Error 2 > > = > Leo Franchi wrote: > I have some doubts about the mass tagging UI. When I first open the M= usicBrainz tagger with multiple files selected, I see this: > = > http://imagebin.ca/view/e25y1kwP.html' > = > I can select files in the left pane, and that populates the fields be= low. It's not clear if the "Start Searching..." button operates on the curr= ently selected track, or all the tracks. I learned it operates on all the t= racks, but I didn't know until I tried it. The text should clarify this. Th= en I see this: > = > http://imagebin.ca/view/iKtHSXE.html' > = > Now I am just confused. What happened to the tracks on the left? What= are the entries on the right? None of them are track names, they are actua= lly album names. It's not good to h ave the left listview be tracks and the= right listview be albums without any sort of help for the user to figure t= hat out. Anyway, as a new user i'm curious as to what these entries are, so= I expand one or two: > = > http://imagebin.ca/view/jrUBpR3K.html' > = > And so I am extrapolating here, it seems like it is picking albums an= d bolding the names of tracks in the album that matches one of the tracks I= had on the left---but has now disappeared. What are all the non-bold track= names for? They are not related to the original tracks in the left hand pa= ne. I can't have an overview of what this dialog is actually going to do. > = > I'm not sure at this point if "Save" operates on the currently select= ed tracks, or if it saves all the tracks (what tracks? the ones that are bo= ld? all of them? it is confusing). = > = > Also, I am unable to use the MusicDNS finder. No matter what, it neve= r find anything. Here is my debug output: > = > = > amarok: BEGIN: MusicDNSFinder::MusicDNSFinder(const Meta::Track= List&, QObject*, const QString&, int, const QString&, const QString&, const= QString&) = > amarok: [MusicDNSFinder] Initiating MusicDNS search: = > amarok: [MusicDNSFinder] Host: "ofa.musicdn= s.org" = > amarok: [MusicDNSFinder] Port: 80 = > amarok: [MusicDNSFinder] Path Prefix: "/ofa/1" = > amarok: [MusicDNSFinder] Client ID: "0c6019606b1= d8a54d0985e448f3603ca" = > amarok: [MusicDNSFinder] Client version: "2.3-GIT" = > amarok: BEGIN: MusicDNSAudioDecoder::MusicDNSAudioDecoder(con= st Meta::TrackList&, int) = > amarok: END__: MusicDNSAudioDecoder::MusicDNSAudioDecoder(con= st Meta::TrackList&, int) - Took 0.085s = > amarok: END__: MusicDNSFinder::MusicDNSFinder(const Meta::Track= List&, QObject*, const QString&, int, const QString&, const QString&, const= QString&) - Took 0.086s = > amarok: END__: void MusicBrainzTagger::searchDone() - DELAY Took = (quite long) 10s = > amarok: END__: void MusicBrainzFinder::sendNewRequest() - DELAY Too= k (quite long) 10s = > amarok: BEGIN: void MusicDNSFinder::decodingDone(ThreadWeaver::Job*= ) = > amarok: END__: void MusicDNSFinder::decodingDone(ThreadWeaver::Job*= ) - Took 0.00011s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: [MusicDNSFinder] There is no any queued requests. Stoppin= g timer. = > amarok: BEGIN: void MusicBrainzTagger::mdnsSearchDone() = > amarok: END__: void MusicBrainzTagger::mdnsSearchDone() - Took 6.= 9e-05s = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00026= s = > amarok: BEGIN: void MusicBrainzFinder::sendNewRequest() = > amarok: [MusicBrainzFinder] There is no any queued requests. Stop= ping timer. = > amarok: BEGIN: void MusicBrainzTagger::searchDone() = > amarok: END__: void MusicBrainzTagger::searchDone() - Took 8.5e-0= 5s = > amarok: END__: void MusicBrainzFinder::sendNewRequest() - Took 0.00= 029s = > = > am I doing something wrong? > = > Sergey Ivanov wrote: > This UI made to be like on Picard (original musicbrainz tagger). On a= left side we have tracks to search, on a right side - search result. When = a track found we move it from left side to the right one. On the right tabl= e complete album's track list is shown. Albums, that contains a track has a= bold text, the same to tracks - all tracks in a album linked to real track= s has a bold text. BTW all tracks are drag-able. So if don't wanna save sea= rch result for some tracks, you can drop this tracks to left panel. = > Could you send one of this track on 123kash@gmail.com, i didn't have = such troubles with my "test samples". > = > Leo Franchi wrote: > Sorry for the delay. Work has been keeping me busy. > = > I've never used Picard, so that's why I was confused. But I think thi= s points to a valid criticism---the use of Picard is not necessary to the u= se of Amarok. Users should not be expected to be familiar with the user int= erface of another program to feel comfortable with Amarok's user interface.= For example, I had no idea i could drag tracks---there are no visual indic= ators that dragging is possible, nor do I know what dragging would do exact= ly (why is dragging right->left "choosing not to save results"?). My point = with this is that I think we need a better explanation than "it is how Pica= rd does it"---we want Amarok to be as intuitive and user-friendly as possib= le, regardless of how good or bad other programs are :) I think a few thing= s at least need to be done: > = > 1) Workflow clarified---what is the user supposed to do? What buttons= do what, and how is the user informed of that? > 2) Text to explain to the user what to do. Tooltips to explain what b= uttons do > = > Re: files: > = > What sort of files are supposed to 'work'? I tried some popular bands= (the beatles, the who, queen, led zeppelin) that they definitely should ha= ve in their records, but got 0 results. I can send you some if you want, or= come find me on irc (nick lfranchi, #amarok on Freenode) > = > Sergey Ivanov wrote: > All known by musicdns.org, but It could be some problems due to misse= d check in CMakeLists, so MusicDNS decomressor/fingerprint-generator should= not been compiled at all. Now It fixed, so could you try one more time? > = > Leo Franchi wrote: > Maybe the new ffmpeg stuff doesn't support flac? > = > [flac @ 0x4cb4380] invalid coding type > [flac @ 0x4cb4380] decode_frame() failed = > = > Tried also with an MP3 (AC/DC Back in Black, very very common file) a= nd it just seems to loop with a network request: > = > amarok: BEGIN: void MusicBrainzTagger::searchDone() = > amarok(18683)/kdeui (KNotification) KNotificationManager::close: 23598 > amarok: BEGIN: MusicDNSFinder::MusicDNSFinder(const Meta::TrackLi= st&, QObject*, const QString&, int, const QString&, const QString&, const Q= String&) = > amarok: [MusicDNSFinder] Initiating MusicDNS search: = > amarok: [MusicDNSFinder] Host: "ofa.musicdns.org" = > amarok: [MusicDNSFinder] Port: 80 = > amarok: [MusicDNSFinder] Path Prefix: "/ofa/1" = > amarok: [MusicDNSFinder] Client ID: "0c6019606b1d8a54d09= 85e448f3603ca" = > amarok: [MusicDNSFinder] Client version: "2.4-GIT" = > amarok: END__: MusicDNSFinder::MusicDNSFinder(const Meta::TrackLi= st&, QObject*, const QString&, int, const QString&, const QString&, const Q= String&) - Took 0.00054s = > amarok: END__: void MusicBrainzTagger::searchDone() - Took 0.95s = > amarok: END__: void MusicBrainzFinder::sendNewRequest() - Took 0.95s = > [mp3 @ 0x42d7c90] max_analyze_duration reached > [mp3 @ 0x42d7c90] Estimating duration from bitrate, this may be inacc= urate = = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = = = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00013s = > amarok: BEGIN: void MusicDNSFinder::trackDecoded(Meta::TrackPtr, QStr= ing) = > amarok: END__: void MusicDNSFinder::trackDecoded(Meta::TrackPtr, QStr= ing) - Took 0.00027s = > amarok: BEGIN: void MusicDNSFinder::decodingDone(ThreadWeaver::Job*) = > amarok: END__: void MusicDNSFinder::decodingDone(ThreadWeaver::Job*) = - Took 0.00014s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok(18683)/kio (Scheduler) KIO::SchedulerPrivate::doJob: KIO::Simp= leJob(0x48b5170) > amarok: [MusicDNSFinder] Request sent: "http://ofa.musicdns.org:80= /ofa/1/track/?gnr=3D&art=3D&rmd=3D0&cid=3D0c6019606b1d8a54d0985e448f3603ca&= alb=3D&fmt=3D&brt=3D128&cvr=3D2.4-GIT&fpt=3DAQ1DLwI4DDxJF9sTSBS/D+UT6xEzDyQ= QTgqkFHUSZg+hCpsPhgsgDbcaJBWSEl4TzhFNC5MJHAb8BdYFXAR/BE4DrwPrA0sDMANiAucClQ= KS7/m6bdptYZz/SAuOAcD+HwF+Afb/e/zz/rD65fhOAMj/Vf/H/br+7vm0/BH+y/9D/1kAAP/7A= JwBkQKOAnACBwGNAMYBJgGvAb0BdQGmAaMNCzRJII0sIv2C/dX1dv6N9Lr2hPbS8iD5SOkK9cv5= 0fsW8wD27u+jxSXbg9p23+zjtu6M9Vj46/pw/Aj81/4E/jH+J/01/ZX9vv5K/wH+lf1zCLsTkRN= e7crrTcyBBLbbcfGJ6ynwa/bbwLIKl+mP9d76/gURCURBgwfrF7YBE/zY/1L9wwBgAGEAYABpAM= MBBADVARIARQBm//UAUgACJ4FATqeHERT2swTnDKn9XfB2/A8D+/W3BxQIGeQaCXoC7PfR+8MA0= xnIBwoHPf1JARoAMQB+/9MCCgKbArACBgL1AioBtgIXAgEBngIsAZnzcfKfIKMCt/bN+wkvfPKX= 8TDmSf686sQCnTFw38cD8fnD7Mn2ZADjO9rlqwGE13DiyvNf9bX7Xvwi/jr+ZgA2/4b//wFp/97= /kP9g/sf/ugss/R8RBgZBAA8ERf/g+rTplNpk8NwE3gRhFRj2KO4x6ILWtshtyArxVis/CLQkkx= dFDvMFvgNKA8oDcQIZAXD/9gBHAN0AsQIAALsArwDKIDdBRQ=3D=3D&ttl=3D&tnm=3D&lkt=3D= &dur=3D254000&yrr=3D" = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00059s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00011s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 9.9e-05s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00013s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.0001s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.0001s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00011s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 9.6e-05s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 9.8e-05s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 9e-05s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 9.6e-05s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 9.7e-05s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.0001s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 9.9e-05s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.0001s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00013s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00011s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 9.9e-05s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00014s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.0001s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00011s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00012s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00012s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00013s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 9.5e-05s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.0001s = > amarok: BEGIN: void MusicDNSFinder::sendNewRequest() = > amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.0001s = > > = > Sergey Ivanov wrote: > Trouble with flac fixed. > There is no any loops with request, sendNewRequest runs once a second= by timer. That (sendNewRequest() spam) happened due to some network lag, '= cos there was no reply from server, or error report, and if you follow the = link from log, you'll find track PUID in XML wrap. Now timer stops when the= re is no more requests to send. > = > Sergey Ivanov wrote: > And so? :) I filled up all hints, to make it's behavior clear for end= user, and fixed all found bugs (didn't I?). What should I do now? :) > = > Leo Franchi wrote: > Thanks for the work. I apologize that I am not able to reply to your = updates and test faster. Unfortunately I have a day job :P = > = > I just tested again the musicdns stuff, and worked. > = > I appreciate your improvements to the UI. However, you have not addre= ssed some of my main concerns regarding the UI, mostly regarding the workfl= ow itself. Tooltips are good, but do not substitute for an easy to use inte= rface. I have also asked Thomas Pfeiffer, our resident usability profession= al, for some more formal comments. He will comment as well as soon as he ha= s a chance, and I value his opinion as he actually knows what he is talking= about when he analyzes interfaces :) I finally found the time to have closer look at the problem and post some c= omments. Sorry for letting you wait so long. My personal life got in the wa= y. Let's have a look at this from a task/user perspective. First question: Wha= t is the task the user wants to complete with this feature? In my optinion it is the following: The user has some tracks with missing/i= ncomplete/incorrect tags. The user wants to find the correct tags using mus= icbrainz. So what would the logical steps for this task be? 1. Select the tracks to update the tags for. 2. Send information on the tracks to musicbrainz. 3. Receive suggestions for tags from musicbrainz. 4. Select the tracks for which the correct tags have been found. 5. Update the tags on the files. So the user selects the tracks to be updated and activates the mass tagging= feature. The user is presented with a dialog with two list boxes, two forms for tags= and several buttons. The Save button doesn't make any sense at this point = since there is nothing to save. The user clicks "Start searching". = Several album and track names appear in the right list and the left list is= empty. Some tracks are bold. So the user is presented with a lot of inform= ation she does not actually care about (the other tracks on those albums fo= r which she has not even searched) in an unexpected place (not visually rel= ated to the original tracks that were in the left box). What the user expects at this point is a clear connection between the track= s to be tagged and the tags musicbrainz suggests for them. What the user has: Tracks without correct tags. What the user wants: Correc= t tags for these tracks. Nothing else. The next thing the user wants to do is to decide for each track if the tags= suggested for it are correct or not. The choice should not be "Do I want t= his track to be updated with musicbrainz tags or not?" but "Are the suggest= ed tags for this track correct or not?" So I'd suggest the following: Use the same columns in the left as in the right field. Leave the selected tracks in the left box. Remove all the tag fields below the lists. We don't need them for this task. In the right box, display the suggested tags for each track side-by-side to= the track on the left. = Place a checkbox to the left of each track. An "Update tags" button below the checkboxes should update the tags of all = checked tracks. If you want to use drag&drop as an alternative, allow dragging of the tags = on the right onto the track on the left. This would instantly update the ta= gs and show them on the left. So, long story short, the essence is: Give the user exactly the information= she needs to make the following informed decision: "Which of the tracks I = searched for can be updated using musicbrainz because it has found the corr= ect tags?" No more, no less. And in the most direct manner possible. The above suggestion is only one possible solution and I could agree with o= thers as long as they keep this essence. Regards, Thomas - Thomas ----------------------------------------------------------- This is an automatically generated e-mail. To reply, visit: http://git.reviewboard.kde.org/r/100000/#review4 ----------------------------------------------------------- On 2010-09-26 21:20:19, Sergey Ivanov wrote: > = > ----------------------------------------------------------- > This is an automatically generated e-mail. To reply, visit: > http://git.reviewboard.kde.org/r/100000/ > ----------------------------------------------------------- > = > (Updated 2010-09-26 21:20:19) > = > = > Review request for amarok. > = > = > Summary > ------- > = > MusicBrainz and MusicDNS services support implementation. > There are three independent parts: > 1. MusicBrainzFinder class - used to make requests to MusicBrainz server = and process replies. All relies process in separate threads by MusicBrainzX= mlParser class. For a search uses guessed from a file name track informatio= n. No external dependences required. > 2. MusicDNSFinder class - used for the same purpose as MusicBrainzFinder,= but i communicate with musicdns server and receives track's PUID as a repl= y. Replies ether process in separate threads by MusicDNSXmlParser class. Fi= ngerprints generated by libofa (the only external dependence in entire patc= h). For track decompressing (MusicDNSAudioDecoder class) used xine engine (= I'm not sure is It a good choice, but amarok based on phonon media-engine, = that uses xine. So we don't deed to pull any other dependences). Received P= UIDs sends to MusicBrainzFinder class, for a search routine. > 3. View. All classes used for store (MusicBrainzTagsModel, MusicBrainzTra= ckListModel) and display (MusicBrainzTagsModelDelegate) purposes. > = > = > Diffs > ----- > = > CMakeLists.txt b8b0721 = > cmake/modules/FindFFmpeg.cmake PRE-CREATION = > cmake/modules/FindLibOFA.cmake PRE-CREATION = > config-amarok.h.cmake 981b7b7 = > src/CMakeLists.txt abdcee8 = > src/core-impl/capabilities/timecode/TimecodeEditCapability.h 6e15303 = > src/core-impl/capabilities/timecode/TimecodeEditCapability.cpp 8205d45 = > src/core-impl/collections/mediadevicecollection/MediaDeviceMeta.h e35b5= 7f = > src/core-impl/collections/mediadevicecollection/MediaDeviceMeta.cpp 9be= 62d9 = > src/core-impl/collections/proxycollection/ProxyCollectionMeta.cpp 8bdbf= 75 = > src/core-impl/collections/sqlcollection/CapabilityDelegateImpl.cpp b5cb= 083 = > src/core-impl/collections/sqlcollection/SqlMeta.h ee3ec21 = > src/core-impl/collections/sqlcollection/SqlMeta.cpp 2da0333 = > src/core-impl/meta/file/File.h 6d4d395 = > src/core-impl/meta/file/File.cpp 30cd2ff = > src/core-impl/meta/file/TagLibUtils.cpp 15b64a4 = > src/core-impl/meta/proxy/MetaProxy.h 2ef3805 = > src/core-impl/meta/proxy/MetaProxy.cpp 341e076 = > src/core/capabilities/EditCapability.h 79344bd = > src/dialogs/MusicBrainzTagger.h PRE-CREATION = > src/dialogs/MusicBrainzTagger.cpp PRE-CREATION = > src/dialogs/MusicBrainzTagger.ui PRE-CREATION = > src/dialogs/TagDialog.h 50cd801 = > src/dialogs/TagDialog.cpp 26d4eb8 = > src/dialogs/TagDialogBase.ui 9974d0b = > src/musicbrainz/DecodedAudioData.h PRE-CREATION = > src/musicbrainz/DecodedAudioData.cpp PRE-CREATION = > src/musicbrainz/MusicBrainzFinder.h PRE-CREATION = > src/musicbrainz/MusicBrainzFinder.cpp PRE-CREATION = > src/musicbrainz/MusicBrainzMetaClasses.h PRE-CREATION = > src/musicbrainz/MusicBrainzMetaClasses.cpp PRE-CREATION = > src/musicbrainz/MusicBrainzTagsModel.h PRE-CREATION = > src/musicbrainz/MusicBrainzTagsModel.cpp PRE-CREATION = > src/musicbrainz/MusicBrainzTagsModelDelegate.h PRE-CREATION = > src/musicbrainz/MusicBrainzTagsModelDelegate.cpp PRE-CREATION = > src/musicbrainz/MusicBrainzTrackListModel.h PRE-CREATION = > src/musicbrainz/MusicBrainzTrackListModel.cpp PRE-CREATION = > src/musicbrainz/MusicBrainzXmlParser.h PRE-CREATION = > src/musicbrainz/MusicBrainzXmlParser.cpp PRE-CREATION = > src/musicbrainz/MusicDNSAudioDecoder.h PRE-CREATION = > src/musicbrainz/MusicDNSAudioDecoder.cpp PRE-CREATION = > src/musicbrainz/MusicDNSFinder.h PRE-CREATION = > src/musicbrainz/MusicDNSFinder.cpp PRE-CREATION = > src/musicbrainz/MusicDNSXmlParser.h PRE-CREATION = > src/musicbrainz/MusicDNSXmlParser.cpp PRE-CREATION = > tests/core-impl/collections/proxycollection/TestProxyCollectionMeta.cpp= 55d1914 = > = > Diff: http://git.reviewboard.kde.org/r/100000/diff > = > = > Testing > ------- > = > = > Thanks, > = > Sergey > = > --===============8501380973137032500== Content-Type: text/html; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable
This is an automatically generated e-mail. To reply, visit: http://git.revie= wboard.kde.org/r/100000/

On , Sergey Ivanov wrote:

Looks wor=
ks for me.

On September 22nd, 2010, 2:27 a.m., Leo Franchi wrote:

Doesn'=
;t compile when KDE4_BUILD_TESTS is enabled:


[ 54%] Building CXX object tests/core-impl/collections/proxycollection/CMak=
eFiles/testproxycollectionmeta.dir/TestProxyCollectionMeta.o
/home/leo/kde/src/amarok/tests/core-impl/collections/proxycollection/TestPr=
oxyCollectionMeta.cpp: In member function =E2=80=98void TestProxyCollection=
Meta::testEditableCapabilityOnMultipleTracks()=E2=80=99:                   =
                                                                           =
   =

/home/leo/kde/src/amarok/tests/core-impl/collections/proxycollection/TestPr=
oxyCollectionMeta.cpp:463:51: error: cannot allocate an object of abstract =
type =E2=80=98MyEditCapability=E2=80=99
/home/leo/kde/src/amarok/tests/core-impl/collections/proxycollection/TestPr=
oxyCollectionMeta.cpp:433:1: note:   because the following virtual function=
s are pure within =E2=80=98MyEditCapability=E2=80=99:
/home/leo/kde/src/amarok/src/core/capabilities/EditCapability.h:57:26: note=
:    virtual void Capabilities::EditCapability::setUid(const QString&, =
const QString&)
/home/leo/kde/src/amarok/tests/core-impl/collections/proxycollection/TestPr=
oxyCollectionMeta.cpp:464:51: error: cannot allocate an object of abstract =
type =E2=80=98MyEditCapability=E2=80=99
/home/leo/kde/src/amarok/tests/core-impl/collections/proxycollection/TestPr=
oxyCollectionMeta.cpp:433:1: note:   since type =E2=80=98MyEditCapability=
=E2=80=99 has pure virtual functions
make[2]: *** [tests/core-impl/collections/proxycollection/CMakeFiles/testpr=
oxycollectionmeta.dir/TestProxyCollectionMeta.o] Error 1
make[1]: *** [tests/core-impl/collections/proxycollection/CMakeFiles/testpr=
oxycollectionmeta.dir/all] Error 2

On September 22nd, 2010, 2:44 a.m., Leo Franchi wrote:

I have so=
me doubts about the mass tagging UI. When I first open the MusicBrainz tagg=
er with multiple files selected, I see this:

http://imagebin.ca/view/e25y1kwP.html'

I can select files in the left pane, and that populates the fields below. I=
t's not clear if the "Start Searching..." button operates on =
the currently selected track, or all the tracks. I learned it operates on a=
ll the tracks, but I didn't know until I tried it. The text should clar=
ify this. Then I see this:

http://imagebin.ca/view/iKtHSXE.html'

Now I am just confused. What happened to the tracks on the left? What are t=
he entries on the right? None of them are track names, they are actually al=
bum names. It's not good to h ave the left listview be tracks and the r=
ight listview be albums without any sort of help for the user to figure tha=
t out. Anyway, as a new user i'm curious as to what these entries are, =
so I expand one or two:

http://imagebin.ca/view/jrUBpR3K.html'

And so I am extrapolating here, it seems like it is picking albums and bold=
ing the names of tracks in the album that matches one of the tracks I had o=
n the left---but has now disappeared. What are all the non-bold track names=
 for? They are not related to the original tracks in the left hand pane. I =
can't have an overview of what this dialog is actually going to do.

I'm not sure at this point if "Save" operates on the currentl=
y selected tracks, or if it saves all the tracks (what tracks? the ones tha=
t are bold? all of them? it is confusing). =


Also, I am unable to use the MusicDNS finder. No matter what, it never find=
 anything. Here is my debug output:


amarok:       BEGIN: MusicDNSFinder::MusicDNSFinder(const Meta::TrackList&a=
mp;, QObject*, const QString&, int, const QString&, const QString&a=
mp;, const QString&) =

amarok:         [MusicDNSFinder] Initiating MusicDNS search: =

amarok:         [MusicDNSFinder]        Host:            "ofa.musicdns=
.org" =

amarok:         [MusicDNSFinder]        Port:            80 =

amarok:         [MusicDNSFinder]        Path Prefix:     "/ofa/1" =

amarok:         [MusicDNSFinder]        Client ID:       "0c6019606b1d=
8a54d0985e448f3603ca" =

amarok:         [MusicDNSFinder]        Client version:  "2.3-GIT"=
; =

amarok:         BEGIN: MusicDNSAudioDecoder::MusicDNSAudioDecoder(const Met=
a::TrackList&, int) =

amarok:         END__: MusicDNSAudioDecoder::MusicDNSAudioDecoder(const Met=
a::TrackList&, int) - Took 0.085s =

amarok:       END__: MusicDNSFinder::MusicDNSFinder(const Meta::TrackList&a=
mp;, QObject*, const QString&, int, const QString&, const QString&a=
mp;, const QString&) - Took 0.086s =

amarok:     END__: void MusicBrainzTagger::searchDone() - DELAY Took (quite=
 long) 10s =

amarok:   END__: void MusicBrainzFinder::sendNewRequest() - DELAY Took (qui=
te long) 10s =

amarok:   BEGIN: void MusicDNSFinder::decodingDone(ThreadWeaver::Job*) =

amarok:   END__: void MusicDNSFinder::decodingDone(ThreadWeaver::Job*) - To=
ok 0.00011s =

amarok:   BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok:     [MusicDNSFinder] There is no any queued requests. Stopping time=
r. =

amarok:     BEGIN: void MusicBrainzTagger::mdnsSearchDone() =

amarok:     END__: void MusicBrainzTagger::mdnsSearchDone() - Took 6.9e-05s =

amarok:   END__: void MusicDNSFinder::sendNewRequest() - Took 0.00026s =

amarok:   BEGIN: void MusicBrainzFinder::sendNewRequest() =

amarok:     [MusicBrainzFinder] There is no any queued requests. Stopping t=
imer. =

amarok:     BEGIN: void MusicBrainzTagger::searchDone() =

amarok:     END__: void MusicBrainzTagger::searchDone() - Took 8.5e-05s =

amarok:   END__: void MusicBrainzFinder::sendNewRequest() - Took 0.00029s =


am I doing something wrong?

On September 22nd, 2010, 9:30 a.m., Sergey Ivanov wrote:

This UI m=
ade to be like on Picard (original musicbrainz tagger). On a left side we h=
ave tracks to search, on a right side - search result. When a track found w=
e move it from left side to the right one. On the right table complete albu=
m's track list is shown. Albums, that contains a track has a bold text,=
 the same to tracks - all tracks in a album linked to real tracks has a bol=
d text. BTW all tracks are drag-able. So if don't wanna save search res=
ult for some tracks, you can drop this tracks to left panel. =

Could you send one of this track on 123kash@gmail.com, i didn't have su=
ch troubles with my "test samples".

On September 24th, 2010, 1:11 a.m., Leo Franchi wrote:

Sorry for=
 the delay. Work has been keeping me busy.

I've never used Picard, so that's why I was confused. But I think t=
his points to a valid criticism---the use of Picard is not necessary to the=
 use of Amarok. Users should not be expected to be familiar with the user i=
nterface of another program to feel comfortable with Amarok's user inte=
rface. For example, I had no idea i could drag tracks---there are no visual=
 indicators that dragging is possible, nor do I know what dragging would do=
 exactly (why is dragging right->left "choosing not to save results=
"?). My point with this is that I think we need a better explanation t=
han "it is how Picard does it"---we want Amarok to be as intuitiv=
e and user-friendly as possible, regardless of how good or bad other progra=
ms are :) I think a few things at least need to be done:

1) Workflow clarified---what is the user supposed to do? What buttons do wh=
at, and how is the user informed of that?
2) Text to explain to the user what to do. Tooltips to explain what buttons=
 do

Re: files:

What sort of files are supposed to 'work'? I tried some popular ban=
ds (the beatles, the who, queen, led zeppelin) that they definitely should =
have in their records, but got 0 results. I can send you some if you want, =
or come find me on irc (nick lfranchi, #amarok on Freenode)

On September 24th, 2010, 1:05 p.m., Sergey Ivanov wrote:

All known=
 by musicdns.org, but It could be some problems due to missed check in CMak=
eLists, so MusicDNS decomressor/fingerprint-generator should not been compi=
led at all. Now It fixed, so could you try one more time?

On September 25th, 2010, 2:58 p.m., Leo Franchi wrote:

Maybe the=
 new ffmpeg stuff doesn't support flac?

[flac @ 0x4cb4380] invalid coding type
[flac @ 0x4cb4380] decode_frame() failed         =


Tried also with an MP3 (AC/DC Back in Black, very very common file) and it =
just seems to loop with a network request:

amarok:   BEGIN: void MusicBrainzTagger::searchDone() =

amarok(18683)/kdeui (KNotification) KNotificationManager::close: 23598
amarok:     BEGIN: MusicDNSFinder::MusicDNSFinder(const Meta::TrackList&=
;, QObject*, const QString&, int, const QString&, const QString&=
;, const QString&) =

amarok:       [MusicDNSFinder] Initiating MusicDNS search: =

amarok:       [MusicDNSFinder]  Host:            "ofa.musicdns.org&quo=
t; =

amarok:       [MusicDNSFinder]  Port:            80 =

amarok:       [MusicDNSFinder]  Path Prefix:     "/ofa/1" =

amarok:       [MusicDNSFinder]  Client ID:       "0c6019606b1d8a54d098=
5e448f3603ca" =

amarok:       [MusicDNSFinder]  Client version:  "2.4-GIT" =

amarok:     END__: MusicDNSFinder::MusicDNSFinder(const Meta::TrackList&=
;, QObject*, const QString&, int, const QString&, const QString&=
;, const QString&) - Took 0.00054s =

amarok:   END__: void MusicBrainzTagger::searchDone() - Took 0.95s =

amarok: END__: void MusicBrainzFinder::sendNewRequest() - Took 0.95s =

[mp3 @ 0x42d7c90] max_analyze_duration reached
[mp3 @ 0x42d7c90] Estimating duration from bitrate, this may be inaccurate =
                                                                           =
                                                            =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest()                       =
                                                                           =
                                                            =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00013s =

amarok: BEGIN: void MusicDNSFinder::trackDecoded(Meta::TrackPtr, QString) =

amarok: END__: void MusicDNSFinder::trackDecoded(Meta::TrackPtr, QString) -=
 Took 0.00027s =

amarok: BEGIN: void MusicDNSFinder::decodingDone(ThreadWeaver::Job*) =

amarok: END__: void MusicDNSFinder::decodingDone(ThreadWeaver::Job*) - Took=
 0.00014s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok(18683)/kio (Scheduler) KIO::SchedulerPrivate::doJob: KIO::SimpleJob(=
0x48b5170)
amarok:   [MusicDNSFinder] Request sent:  "http://ofa.musicdns.org:80/=
ofa/1/track/?gnr=3D&art=3D&rmd=3D0&cid=3D0c6019606b1d8a54d0985e=
448f3603ca&alb=3D&fmt=3D&brt=3D128&cvr=3D2.4-GIT&fpt=3D=
AQ1DLwI4DDxJF9sTSBS/D+UT6xEzDyQQTgqkFHUSZg+hCpsPhgsgDbcaJBWSEl4TzhFNC5MJHAb=
8BdYFXAR/BE4DrwPrA0sDMANiAucClQKS7/m6bdptYZz/SAuOAcD+HwF+Afb/e/zz/rD65fhOAM=
j/Vf/H/br+7vm0/BH+y/9D/1kAAP/7AJwBkQKOAnACBwGNAMYBJgGvAb0BdQGmAaMNCzRJII0sI=
v2C/dX1dv6N9Lr2hPbS8iD5SOkK9cv50fsW8wD27u+jxSXbg9p23+zjtu6M9Vj46/pw/Aj81/4E=
/jH+J/01/ZX9vv5K/wH+lf1zCLsTkRNe7crrTcyBBLbbcfGJ6ynwa/bbwLIKl+mP9d76/gURCUR=
BgwfrF7YBE/zY/1L9wwBgAGEAYABpAMMBBADVARIARQBm//UAUgACJ4FATqeHERT2swTnDKn9Xf=
B2/A8D+/W3BxQIGeQaCXoC7PfR+8MA0xnIBwoHPf1JARoAMQB+/9MCCgKbArACBgL1AioBtgIXA=
gEBngIsAZnzcfKfIKMCt/bN+wkvfPKX8TDmSf686sQCnTFw38cD8fnD7Mn2ZADjO9rlqwGE13Di=
yvNf9bX7Xvwi/jr+ZgA2/4b//wFp/97/kP9g/sf/ugss/R8RBgZBAA8ERf/g+rTplNpk8NwE3gR=
hFRj2KO4x6ILWtshtyArxVis/CLQkkxdFDvMFvgNKA8oDcQIZAXD/9gBHAN0AsQIAALsArwDKID=
dBRQ=3D=3D&ttl=3D&tnm=3D&lkt=3D&dur=3D254000&yrr=3D&quo=
t; =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00059s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00011s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 9.9e-05s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00013s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.0001s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.0001s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00011s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 9.6e-05s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 9.8e-05s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 9e-05s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 9.6e-05s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 9.7e-05s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.0001s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 9.9e-05s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.0001s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00013s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00011s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 9.9e-05s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00014s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.0001s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00011s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00012s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00012s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.00013s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 9.5e-05s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.0001s =

amarok: BEGIN: void MusicDNSFinder::sendNewRequest() =

amarok: END__: void MusicDNSFinder::sendNewRequest() - Took 0.0001s =

On September 25th, 2010, 9:11 p.m., Sergey Ivanov wrote:

Trouble w=
ith flac fixed.
There is no any loops with request, sendNewRequest runs once a second by ti=
mer. That (sendNewRequest() spam) happened due to some network lag, 'co=
s there was no reply from server, or error report, and if you follow the li=
nk from log, you'll find track PUID in XML wrap. Now timer stops when t=
here is no more requests to send.

On September 28th, 2010, 8:41 p.m., Sergey Ivanov wrote:

And so? :=
) I filled up all hints, to make it's behavior clear for end user, and =
fixed all found bugs (didn't I?). What should I do now? :)

On September 29th, 2010, 1:51 a.m., Leo Franchi wrote:

Thanks fo=
r the work. I apologize that I am not able to reply to your updates and tes=
t faster. Unfortunately I have a day job :P =


I just tested again the musicdns stuff, and worked.

I appreciate your improvements to the UI. However, you have not addressed s=
ome of my main concerns regarding the UI, mostly regarding the workflow its=
elf. Tooltips are good, but do not substitute for an easy to use interface.=
 I have also asked Thomas Pfeiffer, our resident usability professional, fo=
r some more formal comments. He will comment as well as soon as he has a ch=
ance, and I value his opinion as he actually knows what he is talking about=
 when he analyzes interfaces :) 
I finally f=
ound the time to have closer look at the problem and post some comments. So=
rry for letting you wait so long. My personal life got in the way.

Let's have a look at this from a task/user perspective. First question:=
 What is the task the user wants to complete with this feature?
In my optinion it is the following: The user has some tracks with missing/i=
ncomplete/incorrect tags. The user wants to find the correct tags using mus=
icbrainz.
So what would the logical steps for this task be?
1. Select the tracks to update the tags for.
2. Send information on the tracks to musicbrainz.
3. Receive suggestions for tags from musicbrainz.
4. Select the tracks for which the correct tags have been found.
5. Update the tags on the files.

So the user selects the tracks to be updated and activates the mass tagging=
 feature.
The user is presented with a dialog with two list boxes, two forms for tags=
 and several buttons. The Save button doesn't make any sense at this po=
int since there is nothing to save.
The user clicks "Start searching". =

Several album and track names appear in the right list and the left list is=
 empty. Some tracks are bold. So the user is presented with a lot of inform=
ation she does not actually care about (the other tracks on those albums fo=
r which she has not even searched) in an unexpected place (not visually rel=
ated to the original tracks that were in the left box).
What the user expects at this point is a clear connection between the track=
s to be tagged and the tags musicbrainz suggests for them.
What the user has: Tracks without correct tags. What the user wants: Correc=
t tags for these tracks. Nothing else.

The next thing the user wants to do is to decide for each track if the tags=
 suggested for it are correct or not. The choice should not be "Do I w=
ant this track to be updated with musicbrainz tags or not?" but "=
Are the suggested tags for this track correct or not?"

So I'd suggest the following:
Use the same columns in the left as in the right field.
Leave the selected tracks in the left box.
Remove all the tag fields below the lists. We don't need them for this =
task.
In the right box, display the suggested tags for each track side-by-side to=
 the track on the left. =

Place a checkbox to the left of each track.
An "Update tags" button below the checkboxes should update the ta=
gs of all checked tracks.
If you want to use drag&drop as an alternative, allow dragging of the t=
ags on the right onto the track on the left. This would instantly update th=
e tags and show them on the left.


So, long story short, the essence is: Give the user exactly the information=
 she needs to make the following informed decision: "Which of the trac=
ks I searched for can be updated using musicbrainz because it has found the=
 correct tags?" No more, no less. And in the most direct manner possib=
le.
The above suggestion is only one possible solution and I could agree with o=
thers as long as they keep this essence.

Regards,
Thomas

- Thomas


On September 26th, 2010, 9:20 p.m., Sergey Ivanov wrote:

Review request for amarok.
By Sergey Ivanov.

Updated 2010-09-26 21:20:19

Descripti= on

MusicBrainz and MusicDNS services support implementation.
There are three independent parts:
1. MusicBrainzFinder class - used to make requests to MusicBrainz server an=
d process replies. All relies process in separate threads by MusicBrainzXml=
Parser class. For a search uses guessed from a file name track information.=
  No external dependences required.
2. MusicDNSFinder class - used for the same purpose as MusicBrainzFinder, b=
ut i communicate with musicdns server and receives track's PUID as a re=
ply. Replies ether process in separate threads by MusicDNSXmlParser class. =
Fingerprints generated by libofa (the only external dependence in entire pa=
tch). For track decompressing (MusicDNSAudioDecoder class) used xine engine=
 (I'm not sure is It a good choice, but amarok based on phonon media-en=
gine, that uses xine. So we don't deed to pull any other dependences). =
Received PUIDs sends to MusicBrainzFinder class, for a search routine.
3. View. All classes used for store (MusicBrainzTagsModel, MusicBrainzTrack=
ListModel) and display (MusicBrainzTagsModelDelegate) purposes.

Diffs=

  • CMakeLists.txt (b8b0721)
  • cmake/modules/FindFFmpeg.cmake (PRE-CREATI= ON)
  • cmake/modules/FindLibOFA.cmake (PRE-CREATI= ON)
  • config-amarok.h.cmake (981b7b7)
  • src/CMakeLists.txt (abdcee8)
  • src/core-impl/capabilities/timecode/TimecodeEditCapability.h (6e15303)
  • src/core-impl/capabilities/timecode/TimecodeEditCapability.cpp (8205d45)
  • src/core-impl/collections/mediadevicecollection/MediaDeviceMeta.h (e35b57f)
  • src/core-impl/collections/mediadevicecollection/MediaDeviceMeta.cpp (9be62d9)
  • src/core-impl/collections/proxycollection/ProxyCollectionMeta.cpp (8bdbf75)
  • src/core-impl/collections/sqlcollection/CapabilityDelegateImpl.cpp (b5cb083)
  • src/core-impl/collections/sqlcollection/SqlMeta.h (ee3ec21)
  • src/core-impl/collections/sqlcollection/SqlMeta.cpp (2da0333)
  • src/core-impl/meta/file/File.h (6d4d395)
  • src/core-impl/meta/file/File.cpp (30cd2ff)=
  • src/core-impl/meta/file/TagLibUtils.cpp (1= 5b64a4)
  • src/core-impl/meta/proxy/MetaProxy.h (2ef3= 805)
  • src/core-impl/meta/proxy/MetaProxy.cpp (34= 1e076)
  • src/core/capabilities/EditCapability.h (79= 344bd)
  • src/dialogs/MusicBrainzTagger.h (PRE-CREAT= ION)
  • src/dialogs/MusicBrainzTagger.cpp (PRE-CRE= ATION)
  • src/dialogs/MusicBrainzTagger.ui (PRE-CREA= TION)
  • src/dialogs/TagDialog.h (50cd801)
  • src/dialogs/TagDialog.cpp (26d4eb8)=
  • src/dialogs/TagDialogBase.ui (9974d0b)
  • src/musicbrainz/DecodedAudioData.h (PRE-CR= EATION)
  • src/musicbrainz/DecodedAudioData.cpp (PRE-= CREATION)
  • src/musicbrainz/MusicBrainzFinder.h (PRE-C= REATION)
  • src/musicbrainz/MusicBrainzFinder.cpp (PRE= -CREATION)
  • src/musicbrainz/MusicBrainzMetaClasses.h (= PRE-CREATION)
  • src/musicbrainz/MusicBrainzMetaClasses.cpp (PRE-CREATION)
  • src/musicbrainz/MusicBrainzTagsModel.h (PR= E-CREATION)
  • src/musicbrainz/MusicBrainzTagsModel.cpp (= PRE-CREATION)
  • src/musicbrainz/MusicBrainzTagsModelDelegate.h (PRE-CREATION)
  • src/musicbrainz/MusicBrainzTagsModelDelegate.cpp (PRE-CREATION)
  • src/musicbrainz/MusicBrainzTrackListModel.h (PRE-CREATION)
  • src/musicbrainz/MusicBrainzXmlParser.h (PR= E-CREATION)
  • src/musicbrainz/MusicBrainzXmlParser.cpp (= PRE-CREATION)
  • src/musicbrainz/MusicDNSAudioDecoder.h (PR= E-CREATION)
  • src/musicbrainz/MusicDNSAudioDecoder.cpp (= PRE-CREATION)
  • src/musicbrainz/MusicDNSFinder.h (PRE-CREA= TION)
  • src/musicbrainz/MusicDNSFinder.cpp (PRE-CR= EATION)
  • src/musicbrainz/MusicDNSXmlParser.h (PRE-C= REATION)
  • src/musicbrainz/MusicDNSXmlParser.cpp (PRE= -CREATION)
  • tests/core-impl/collections/proxycollection/TestProxyCollectionMeta.cp= p (55d1914)

View Diff

--===============8501380973137032500==-- --===============0638447356== Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: inline _______________________________________________ Amarok-devel mailing list Amarok-devel@kde.org https://mail.kde.org/mailman/listinfo/amarok-devel --===============0638447356==--