View Issue Details

IDProjectCategoryView StatusLast Update
0017199MMW 5DB / Backuppublic2021-01-14 21:28
Reporterlowlander Assigned To 
PriorityurgentSeveritymajorReproducibilityalways
Status closedResolutionreopened 
Product Version5.0 
Target Version5.0Fixed in Version5.0 
Summary0017199: Locate Moved/Missing Files not including all files/finding wrong results
DescriptionTried Located Moved/Missing Files and found that:
1) Unmoved files in selected files is not shown
2) Deleted file in selected files is not shown
3) 1 match was incorrect
TagsNo tags attached.
Fixed in build2294

Activities

lowlander

2020-12-09 02:12

developer   ~0060637

This file selection works as expected in MediaMonkey 4.1.30.

Ludek

2020-12-10 16:53

developer   ~0060688

Last edited: 2020-12-10 16:53

Are you sure that it wasn't only a test error? For me the functionality works as expected in MM5 (also tested directly with your files)

Please replace your current MediaMonkeyEngine.exe from build 2281 by this one : https://www.dropbox.com/s/dbo4ym7r5mk7dof/MediaMonkeyEngine.exe?dl=0
and generate new debug log. I added more debug info to see every checked file.

Ludek

2020-12-10 17:56

developer   ~0060689

Last edited: 2020-12-10 18:19

Debugging offline and further logs from LowLander shown that the functionality works same as MM4, but he had multiple copies of the same file in the scanned directory and it preferred the other one (with different filename).
The expected would be to prefer the one with the most similar filename (when multiple copies exist).

Fixed in 2282

peke

2020-12-12 19:12

developer   ~0060739

Verified 2283

I am unable to replicate behavior.

@Lowlander is informed to confirm and close bug.

lowlander

2020-12-27 20:37

developer   ~0061096

On 2291

1) Trooper is correctly matched
2) Unlocated, fails to show Ariana Grande file that has been deleted
3) Unmoved fails to show Sarah Brightman file that hasn't moved

Log & Screencast in same file share

Ludek

2020-12-28 18:45

developer   ~0061107

Last edited: 2020-12-28 18:53

Strange, based on the log "2291 Unmoved & Unlocatable Fail.zip" I see:

1 unlocated: D:\Media\Test\12. Ariana Grande - God Is A Woman.flac
1 unmoved: D:\Media\Test\02 - Sarah Brightman - What A Wonderful World .mp3
1 located: D:\Media\Test\Trooper2\HIts From 10 Albums\01. Trooper - Baby Wontcha Please Come Home.flac ( for old: D:\Media\Test\Trooper\HIts From 10 Albums\01. Trooper - Baby Wontcha Please Come Home.flac )

So based on the log the tracks should be showing just fine in the dialog :-/
The lists seem correctly transferred to the UI (dlgMovedFile.js) so I don't understand why it wasn't showing for you, looks like UI refresh issue or something like this?
If you resize the window, do the tracks re-appear? Or if you click the first row in the "empty lists" -- is it selectable like a track without metadata ?

Ludek

2020-12-28 19:03

developer   ~0061108

Last edited: 2020-12-29 17:25

Please replace your current D:\Software\MediaMonkey 5\Controls\dlgMovedFiles.js
by the attached dlgMovedFiles.js and generate new log for me (if the issue still occurs with the new dlgMovedFiles.js). And also if the lists are still empty then try to resize the dialog window slightly to see whether the files does appear then ?
dlgMovedFiles.js (7,198 bytes)   
requirejs("controls/gridview");
requirejs("controls/checkbox");
requirejs("controls/columntracklist");

var automaticallyUpdateMovedFiles = false,
    foundList = null,
    sameList = null,
    notList = null,
    locatedList = null,
    unlocatedList = null;

function init(params) {

    resizeable = true;
    title = _('Locate moved/missing files');

    automaticallyUpdateMovedFiles = params.scanRes.automaticallyUpdateMovedFiles;
    foundList = params.scanRes.foundList;
    sameList = params.scanRes.sameList;
    notList = params.scanRes.notList;
    checkedList = params.scanRes.checkedList;

    ODS(sprintf('LMMF results in dlg: found: %d, same %d, unlocated: %d, checked: %d', foundList.count, sameList.count, notList.count, checkedList.count));

    // preset list views
    var assignDataList = function (listView, data) {
        var lv = qid(listView);
        lv.controlClass.data = data;
        lv.controlClass.dataSource = lv.controlClass.data;
        lv.controlClass.invalidateAll();
    }

    foundList.setAllChecked(true); // #15604
    assignDataList('lvLocatedList', foundList);
    assignDataList('lvUnmovedList', sameList);
    assignDataList('lvUnlocatedList', notList);

    // initialize tabs
    var tabs = qid('tabs');

    function selecttab(tab, oldtab) {
        if (oldtab)
            setVisibility(qid(oldtab), false, {
                animate: true
            });
        setVisibility(qid(tab), true, {
            animate: true
        });
    }

    window.localListen(tabs, 'selected', function (e) {
        var oldTab;
        if (e.detail.oldTabIndex >= 0)
            oldTab = tabs.controlClass.items[e.detail.oldTabIndex].getAttribute('tabname');
        selecttab(tabs.controlClass.items[e.detail.tabIndex].getAttribute('tabname'), oldTab);
    });
    tabs.controlClass.selectedIndex = 0;

    window.localListen(qid('btnUpdate'), 'click', function () {
        qid('btnUpdate').controlClass.disabled = true;

        var ar = [];

        if (qid('ChBUpdateTracks').controlClass.checked) {
            locatedList = foundList.getCheckedList();
            ar.push(locatedList.whenLoaded());
        }
        if (qid('ChBRemoveTracks').controlClass.checked) {
            unlocatedList = notList.getCheckedList();
            ar.push(unlocatedList.whenLoaded());
        }

        window.localPromise(whenAll(ar)).then(function () {
            modalResult = 1;
        });
    });
}

function getData() {

    var ret = {};

    if (qid('ChBUpdateTracks').controlClass.checked) {
        ret.locatedList = locatedList;
    }
    if (qid('ChBRemoveTracks').controlClass.checked) {
        ret.unlocatedList = unlocatedList;
    }

    return ret;
}

// myLocatedListView --------------------------------------------
function myLocatedListView(element) {
    ColumnTrackList.call(this, element);

    var tracksList = this;
    this.showHeader = true;

    this.defaultColumns = new Array();
    this.defaultColumns.push({
        visible: true,
        title: '',
        width: 20,
        order: 1,
        headerRenderer: ColumnTrackList.prototype.headerRenderers.renderCheck,
        setupCell: ColumnTrackList.prototype.cellSetups.setupCheckbox,
        bindData: ColumnTrackList.prototype.defaultBinds.bindCheckboxCell
    });
    this.defaultColumns.push({
        visible: true,
        title: _('Artist'),
        width: 180,
        order: 2,
        bindData: function (div, item) {
            div.innerText = item.SD.artist;
        },
        columnType: 'artist',
    });
    this.defaultColumns.push({
        visible: true,
        title: _('File'),
        width: 180,
        order: 3,
        bindData: function (div, item) {
            div.innerText = item.SD.title;
        },
        columnType: 'title',
    });
    this.defaultColumns.push({
        visible: true,
        title: _('New Path'),
        width: 280,
        order: 4,
        bindData: function (div, item) {
            div.innerText = item.newPath;
        },
    });
    this.defaultColumns.push({
        visible: true,
        title: _('Old Path'),
        width: 280,
        order: 5,
        bindData: function (div, item) {
            div.innerText = item.SD.path;
        },
        columnType: 'path',
    });
    this.setColumns(this.defaultColumns);
}
myLocatedListView.prototype = Object.create(ColumnTrackList.prototype);

// myUnmovedListView --------------------------------------------
function myUnmovedListView(element) {
    ColumnTrackList.call(this, element);

    var tracksList = this;
    this.showHeader = true;

    this.defaultColumns = new Array();
    this.defaultColumns.push({
        visible: true,
        title: _('Artist'),
        width: 180,
        order: 1,
        bindData: function (div, item) {
            div.innerText = item.SD.artist;
        },
        columnType: 'artist',
    });
    this.defaultColumns.push({
        visible: true,
        title: _('File'),
        width: 180,
        order: 2,
        bindData: function (div, item) {
            div.innerText = item.SD.title;
        },
        columnType: 'title',
    });
    this.defaultColumns.push({
        visible: true,
        title: _('Path'),
        width: 280,
        order: 3,
        bindData: function (div, item) {
            div.innerText = item.SD.path;
        },
        columnType: 'path',
    });
    this.setColumns(this.defaultColumns);
}
myUnmovedListView.prototype = Object.create(ColumnTrackList.prototype);

// myUnlocatedListView --------------------------------------------
function myUnlocatedListView(element) {
    ColumnTrackList.call(this, element);

    var tracksList = this;
    this.showHeader = true;

    this.defaultColumns = new Array();
    this.defaultColumns.push({
        visible: true,
        title: '',
        width: 20,
        order: 1,
        headerRenderer: ColumnTrackList.prototype.headerRenderers.renderCheck,
        setupCell: ColumnTrackList.prototype.cellSetups.setupCheckbox,
        bindData: ColumnTrackList.prototype.defaultBinds.bindCheckboxCell
    });
    this.defaultColumns.push({
        visible: true,
        title: _('Artist'),
        width: 180,
        order: 2,
        bindData: function (div, item) {
            div.innerText = item.SD.artist;
        },
        columnType: 'artist',
    });
    this.defaultColumns.push({
        visible: true,
        title: _('File'),
        width: 180,
        order: 3,
        bindData: function (div, item) {
            div.innerText = item.SD.title;
        },
        columnType: 'title',
    });
    this.defaultColumns.push({
        visible: true,
        title: _('Path'),
        width: 280,
        order: 4,
        bindData: function (div, item) {
            div.innerText = item.SD.path;
        },
        columnType: 'path',
    });
    this.setColumns(this.defaultColumns);
}
myUnlocatedListView.prototype = Object.create(ColumnTrackList.prototype);
dlgMovedFiles.js (7,198 bytes)   

lowlander

2021-01-02 21:17

developer   ~0061137

dlgMovedFiles.js doesn't exist in controls, but does under dialogs, placed it there and the files show as expected.

Before doing so, clicking in the list didn't do anything, it is actually empty. Using column headers for sorting did reveal the files or selecting the all files checkbox worked as well.

Another problem: Unmoved Files doesn't have the checkboxes column.

Ludek

2021-01-04 16:19

developer   ~0061141

OK, so my understanding is that the new dlgMovedFiles.js fixed the issue for you?
So marked as fixed in 2292 to verify.

Why the "Unmoved Files" tab should have the checkboxes column? Is there any reason for it?

lowlander

2021-01-09 19:46

developer   ~0061261

Was the fix included? It's not working on 2293 (both unmoved and unlocatable). Clicking on a column header did show the files.

Yes, checkboxes make no sense on Unmoved, no action is needed on this tab.

Ludek

2021-01-11 15:17

developer   ~0061279

Last edited: 2021-01-11 15:20

Yes, the fix was included. So there must be still a timing UI refresh issue for you.
I cannot replicate, but double-checked the code and probably found a possible reason for the refresh glitch.

Fixed in 2294, so please re-test in 2294 to confirm that it is OK finally.

lowlander

2021-01-14 21:28

developer   ~0061338

Confirmed on 2294