Mac build instructions

Is this Mac build information still correct? It’s got references to 10., Carbon… stuff that’s long gone. The link to the dependencies is a server not found error.

https://picard.musicbrainz.org/docs/build-osx/

I get this below, when trying to build it.

python setup.py clean
File “setup.py”, line 232
generate_file(‘win-version-info.txt.in’, ‘win-version-info.txt’, {**args, **version_args})

No, it’s horribly outdated. I recently cleaned up the Windows build, but haven’t got to the macOS one yet. But it is now basically much easier then it is described there.

Have a look at https://github.com/metabrainz/picard/blob/master/scripts/setup-osx.sh

This should give you an idea how you can setup the dependencies. Then the following should allow you to run Picard from source:

python3 setup.py build_ext -i
python3 setup.py build_locales -i
python3 tagger.py

Try running with python3 instead of python.

1 Like

Is this the only way the build works, or is there a different method also?

While the release build posted this week is good, I still can’t seem to build what I’ve got … and not encounter the invalid selection error that was initially associated with the touch pad.

Can you give more details what you have done so far and where the problem is? I need to look into this in more detail. but roughly this is what I did on my mac:

Preparations:

  1. Install xcode
  2. Installed latest Python 3.7 with official packages from https://www.python.org/downloads/mac-osx/ (I guess this could also be done using homebrew instead)
  3. Did brew install libdiscid gettext
  4. Installed the Python dependencies with
    pip3 install -r requirements-macos.txt
    pip3 install -r requirements-build.txt
    

Then the actual building is the same as on other platforms. To run directly from source tree:

python3 setup.py build_locales -i
python3 setup.py build_ext -i
python3 tagger.py

To actually build an app package:

python3 setup.py build
python3 setup.py build_ext -i
pyinstaller --noconfirm --clean picard.spec

The app package will be placed in "dist/MusicBrainz Picard.app".

Please let me know if the above works for you or if it hangs. Then I could update the build instructions for the website.

1 Like

For the Preparations, I had done/current already except appeared to install all of it’s parts as I saw a whole lot of not found echoed to the shell. Check again afterwards and the requirements are all satisfied.

To run from the source tree doesn’t give any fatal errors during the build process and works, but has the drag more than one item issue.

To build the app package, I need to sudo it, otherwise:

python3 setup.py build
running build
generating scripts/picard from scripts/picard.in
error: [Errno 13] Permission denied: 'scripts/picard'

sudo python3 setup.py build and I’ll see some instances of:
package init file 'picard/acoustid/__pycache__/__init__.py' not found (or not a regular file)

python3 setup.py build_ext -i
running build_ext
copying build/lib.macosx-10.14-x86_64-3.7/picard/util/_astrcmp.cpython-37m-darwin.so -> picard/util

That one is instant.

pyinstaller --noconfirm --clean picard.spec throws a few warnings and then:

Unable to find "libdiscid.0.dylib" when adding binary and data files.

That’s it.

Looking into that missing library, the first few returns are Picard related tickets. …

That’s what I get from those steps. The dump from the terminal is below.

iMac-Pro:picard tdiaz$ pip3 install -r requirements-macos.txt
Requirement already satisfied: discid==1.2.0 in /usr/local/lib/python3.7/site-packages (from -r requirements-macos.txt (line 1)) (1.2.0)
Requirement already satisfied: mutagen==1.42.0 in /usr/local/lib/python3.7/site-packages (from -r requirements-macos.txt (line 2)) (1.42.0)
Requirement already satisfied: PyQt5==5.13.1 in /usr/local/lib/python3.7/site-packages (from -r requirements-macos.txt (line 3)) (5.13.1)
Requirement already satisfied: PyQt5_sip<13,>=4.19.19 in /usr/local/lib/python3.7/site-packages (from PyQt5==5.13.1->-r requirements-macos.txt (line 3)) (4.19.19)
iMac-Pro:picard tdiaz$ pip3 install -r requirements-build.txt
Requirement already satisfied: Babel==2.6 in /usr/local/lib/python3.7/site-packages (from -r requirements-build.txt (line 1)) (2.6.0)
Requirement already satisfied: PyInstaller==3.5 in /usr/local/lib/python3.7/site-packages (from -r requirements-build.txt (line 2)) (3.5)
Requirement already satisfied: pytz>=0a in /usr/local/lib/python3.7/site-packages (from Babel==2.6->-r requirements-build.txt (line 1)) (2019.3)
Requirement already satisfied: altgraph in /usr/local/lib/python3.7/site-packages (from PyInstaller==3.5->-r requirements-build.txt (line 2)) (0.16.1)
Requirement already satisfied: macholib>=1.8 in /usr/local/lib/python3.7/site-packages (from PyInstaller==3.5->-r requirements-build.txt (line 2)) (1.11)
Requirement already satisfied: setuptools in /usr/local/lib/python3.7/site-packages (from PyInstaller==3.5->-r requirements-build.txt (line 2)) (41.0.1)
iMac-Pro:picard tdiaz$ 
iMac-Pro:picard tdiaz$ 
iMac-Pro:picard tdiaz$ python3 setup.py build
running build
generating scripts/picard from scripts/picard.in
error: [Errno 13] Permission denied: 'scripts/picard'
iMac-Pro:picard tdiaz$ 
iMac-Pro:picard tdiaz$ sudo python3 setup.py build
Password:
running build
generating scripts/picard from scripts/picard.in
running build_py
package init file 'picard/__pycache__/__init__.py' not found (or not a regular file)
package init file 'picard/acoustid/__pycache__/__init__.py' not found (or not a regular file)
package init file 'picard/browser/__pycache__/__init__.py' not found (or not a regular file)
package init file 'picard/const/__pycache__/__init__.py' not found (or not a regular file)
package init file 'picard/coverart/__pycache__/__init__.py' not found (or not a regular file)
package init file 'picard/coverart/providers/__pycache__/__init__.py' not found (or not a regular file)
package init file 'picard/formats/__pycache__/__init__.py' not found (or not a regular file)
package init file 'picard/formats/mutagenext/__pycache__/__init__.py' not found (or not a regular file)
package init file 'picard/plugins/__pycache__/__init__.py' not found (or not a regular file)
package init file 'picard/ui/__pycache__/__init__.py' not found (or not a regular file)
package init file 'picard/ui/options/__pycache__/__init__.py' not found (or not a regular file)
package init file 'picard/ui/searchdialog/__pycache__/__init__.py' not found (or not a regular file)
package init file 'picard/util/__pycache__/__init__.py' not found (or not a regular file)
package init file 'picard/webservice/__pycache__/__init__.py' not found (or not a regular file)
running build_ext
running build_scripts
copying and adjusting scripts/picard -> build/scripts-3.7
running build_locales
msgfmt -o build/locale/af/LC_MESSAGES/picard.mo po/af.po
msgfmt -o build/locale/ar/LC_MESSAGES/picard.mo po/ar.po
msgfmt -o build/locale/ast/LC_MESSAGES/picard.mo po/ast.po
msgfmt -o build/locale/bg/LC_MESSAGES/picard.mo po/bg.po
msgfmt -o build/locale/ca/LC_MESSAGES/picard.mo po/ca.po
msgfmt -o build/locale/cs/LC_MESSAGES/picard.mo po/cs.po
msgfmt -o build/locale/cy/LC_MESSAGES/picard.mo po/cy.po
msgfmt -o build/locale/da/LC_MESSAGES/picard.mo po/da.po
msgfmt -o build/locale/de/LC_MESSAGES/picard.mo po/de.po
msgfmt -o build/locale/el/LC_MESSAGES/picard.mo po/el.po
msgfmt -o build/locale/en/LC_MESSAGES/picard.mo po/en.po
msgfmt -o build/locale/en_AU/LC_MESSAGES/picard.mo po/en_AU.po
msgfmt -o build/locale/en_CA/LC_MESSAGES/picard.mo po/en_CA.po
msgfmt -o build/locale/en_GB/LC_MESSAGES/picard.mo po/en_GB.po
msgfmt -o build/locale/eo/LC_MESSAGES/picard.mo po/eo.po
msgfmt -o build/locale/es/LC_MESSAGES/picard.mo po/es.po
msgfmt -o build/locale/et/LC_MESSAGES/picard.mo po/et.po
msgfmt -o build/locale/fa/LC_MESSAGES/picard.mo po/fa.po
msgfmt -o build/locale/fi/LC_MESSAGES/picard.mo po/fi.po
msgfmt -o build/locale/fo/LC_MESSAGES/picard.mo po/fo.po
msgfmt -o build/locale/fr/LC_MESSAGES/picard.mo po/fr.po
msgfmt -o build/locale/fr_CA/LC_MESSAGES/picard.mo po/fr_CA.po
msgfmt -o build/locale/fy/LC_MESSAGES/picard.mo po/fy.po
msgfmt -o build/locale/gl/LC_MESSAGES/picard.mo po/gl.po
msgfmt -o build/locale/he/LC_MESSAGES/picard.mo po/he.po
msgfmt -o build/locale/hi/LC_MESSAGES/picard.mo po/hi.po
msgfmt -o build/locale/hr/LC_MESSAGES/picard.mo po/hr.po
msgfmt -o build/locale/hu/LC_MESSAGES/picard.mo po/hu.po
msgfmt -o build/locale/id/LC_MESSAGES/picard.mo po/id.po
msgfmt -o build/locale/is/LC_MESSAGES/picard.mo po/is.po
msgfmt -o build/locale/it/LC_MESSAGES/picard.mo po/it.po
msgfmt -o build/locale/ja/LC_MESSAGES/picard.mo po/ja.po
msgfmt -o build/locale/kn/LC_MESSAGES/picard.mo po/kn.po
msgfmt -o build/locale/ko/LC_MESSAGES/picard.mo po/ko.po
msgfmt -o build/locale/lt/LC_MESSAGES/picard.mo po/lt.po
msgfmt -o build/locale/mr/LC_MESSAGES/picard.mo po/mr.po
msgfmt -o build/locale/nb/LC_MESSAGES/picard.mo po/nb.po
msgfmt -o build/locale/nds/LC_MESSAGES/picard.mo po/nds.po
msgfmt -o build/locale/ne/LC_MESSAGES/picard.mo po/ne.po
msgfmt -o build/locale/nl/LC_MESSAGES/picard.mo po/nl.po
msgfmt -o build/locale/oc/LC_MESSAGES/picard.mo po/oc.po
msgfmt -o build/locale/pl/LC_MESSAGES/picard.mo po/pl.po
msgfmt -o build/locale/pt/LC_MESSAGES/picard.mo po/pt.po
msgfmt -o build/locale/pt_BR/LC_MESSAGES/picard.mo po/pt_BR.po
msgfmt -o build/locale/ro/LC_MESSAGES/picard.mo po/ro.po
msgfmt -o build/locale/ru/LC_MESSAGES/picard.mo po/ru.po
msgfmt -o build/locale/sco/LC_MESSAGES/picard.mo po/sco.po
msgfmt -o build/locale/sk/LC_MESSAGES/picard.mo po/sk.po
msgfmt -o build/locale/sl/LC_MESSAGES/picard.mo po/sl.po
msgfmt -o build/locale/sq/LC_MESSAGES/picard.mo po/sq.po
msgfmt -o build/locale/sr/LC_MESSAGES/picard.mo po/sr.po
msgfmt -o build/locale/sv/LC_MESSAGES/picard.mo po/sv.po
msgfmt -o build/locale/ta/LC_MESSAGES/picard.mo po/ta.po
msgfmt -o build/locale/te/LC_MESSAGES/picard.mo po/te.po
msgfmt -o build/locale/tr/LC_MESSAGES/picard.mo po/tr.po
msgfmt -o build/locale/uk/LC_MESSAGES/picard.mo po/uk.po
msgfmt -o build/locale/zh_CN/LC_MESSAGES/picard.mo po/zh_CN.po
msgfmt -o build/locale/zh_TW/LC_MESSAGES/picard.mo po/zh_TW.po
msgfmt -o build/locale/ca/LC_MESSAGES/picard-countries.mo po/countries/ca.po
msgfmt -o build/locale/cs/LC_MESSAGES/picard-countries.mo po/countries/cs.po
msgfmt -o build/locale/cy/LC_MESSAGES/picard-countries.mo po/countries/cy.po
msgfmt -o build/locale/da/LC_MESSAGES/picard-countries.mo po/countries/da.po
msgfmt -o build/locale/de/LC_MESSAGES/picard-countries.mo po/countries/de.po
msgfmt -o build/locale/el/LC_MESSAGES/picard-countries.mo po/countries/el.po
msgfmt -o build/locale/en_AU/LC_MESSAGES/picard-countries.mo po/countries/en_AU.po
msgfmt -o build/locale/en_CA/LC_MESSAGES/picard-countries.mo po/countries/en_CA.po
msgfmt -o build/locale/en_GB/LC_MESSAGES/picard-countries.mo po/countries/en_GB.po
msgfmt -o build/locale/eo/LC_MESSAGES/picard-countries.mo po/countries/eo.po
msgfmt -o build/locale/es/LC_MESSAGES/picard-countries.mo po/countries/es.po
msgfmt -o build/locale/et/LC_MESSAGES/picard-countries.mo po/countries/et.po
msgfmt -o build/locale/fi/LC_MESSAGES/picard-countries.mo po/countries/fi.po
msgfmt -o build/locale/fr/LC_MESSAGES/picard-countries.mo po/countries/fr.po
msgfmt -o build/locale/fr_CA/LC_MESSAGES/picard-countries.mo po/countries/fr_CA.po
msgfmt -o build/locale/gl/LC_MESSAGES/picard-countries.mo po/countries/gl.po
msgfmt -o build/locale/he/LC_MESSAGES/picard-countries.mo po/countries/he.po
msgfmt -o build/locale/hr/LC_MESSAGES/picard-countries.mo po/countries/hr.po
msgfmt -o build/locale/it/LC_MESSAGES/picard-countries.mo po/countries/it.po
msgfmt -o build/locale/ja/LC_MESSAGES/picard-countries.mo po/countries/ja.po
msgfmt -o build/locale/ko/LC_MESSAGES/picard-countries.mo po/countries/ko.po
msgfmt -o build/locale/mr/LC_MESSAGES/picard-countries.mo po/countries/mr.po
msgfmt -o build/locale/nb/LC_MESSAGES/picard-countries.mo po/countries/nb.po
msgfmt -o build/locale/nl/LC_MESSAGES/picard-countries.mo po/countries/nl.po
msgfmt -o build/locale/pa/LC_MESSAGES/picard-countries.mo po/countries/pa.po
msgfmt -o build/locale/pl/LC_MESSAGES/picard-countries.mo po/countries/pl.po
msgfmt -o build/locale/pt/LC_MESSAGES/picard-countries.mo po/countries/pt.po
msgfmt -o build/locale/pt_BR/LC_MESSAGES/picard-countries.mo po/countries/pt_BR.po
msgfmt -o build/locale/ro/LC_MESSAGES/picard-countries.mo po/countries/ro.po
msgfmt -o build/locale/ru/LC_MESSAGES/picard-countries.mo po/countries/ru.po
msgfmt -o build/locale/sk/LC_MESSAGES/picard-countries.mo po/countries/sk.po
msgfmt -o build/locale/sl/LC_MESSAGES/picard-countries.mo po/countries/sl.po
msgfmt -o build/locale/sq/LC_MESSAGES/picard-countries.mo po/countries/sq.po
msgfmt -o build/locale/sr/LC_MESSAGES/picard-countries.mo po/countries/sr.po
msgfmt -o build/locale/sv/LC_MESSAGES/picard-countries.mo po/countries/sv.po
msgfmt -o build/locale/te/LC_MESSAGES/picard-countries.mo po/countries/te.po
msgfmt -o build/locale/tr/LC_MESSAGES/picard-countries.mo po/countries/tr.po
msgfmt -o build/locale/vi/LC_MESSAGES/picard-countries.mo po/countries/vi.po
msgfmt -o build/locale/zh_CN/LC_MESSAGES/picard-countries.mo po/countries/zh_CN.po
msgfmt -o build/locale/zh_TW/LC_MESSAGES/picard-countries.mo po/countries/zh_TW.po
msgfmt -o build/locale/da/LC_MESSAGES/picard-attributes.mo po/attributes/da.po
msgfmt -o build/locale/de/LC_MESSAGES/picard-attributes.mo po/attributes/de.po
msgfmt -o build/locale/el/LC_MESSAGES/picard-attributes.mo po/attributes/el.po
msgfmt -o build/locale/en_AU/LC_MESSAGES/picard-attributes.mo po/attributes/en_AU.po
msgfmt -o build/locale/en_CA/LC_MESSAGES/picard-attributes.mo po/attributes/en_CA.po
msgfmt -o build/locale/en_GB/LC_MESSAGES/picard-attributes.mo po/attributes/en_GB.po
msgfmt -o build/locale/eo/LC_MESSAGES/picard-attributes.mo po/attributes/eo.po
msgfmt -o build/locale/es/LC_MESSAGES/picard-attributes.mo po/attributes/es.po
msgfmt -o build/locale/et/LC_MESSAGES/picard-attributes.mo po/attributes/et.po
msgfmt -o build/locale/fi/LC_MESSAGES/picard-attributes.mo po/attributes/fi.po
msgfmt -o build/locale/fr/LC_MESSAGES/picard-attributes.mo po/attributes/fr.po
msgfmt -o build/locale/fr_CA/LC_MESSAGES/picard-attributes.mo po/attributes/fr_CA.po
msgfmt -o build/locale/gl/LC_MESSAGES/picard-attributes.mo po/attributes/gl.po
msgfmt -o build/locale/he/LC_MESSAGES/picard-attributes.mo po/attributes/he.po
msgfmt -o build/locale/hr/LC_MESSAGES/picard-attributes.mo po/attributes/hr.po
msgfmt -o build/locale/it/LC_MESSAGES/picard-attributes.mo po/attributes/it.po
msgfmt -o build/locale/ja/LC_MESSAGES/picard-attributes.mo po/attributes/ja.po
msgfmt -o build/locale/nb/LC_MESSAGES/picard-attributes.mo po/attributes/nb.po
msgfmt -o build/locale/nl/LC_MESSAGES/picard-attributes.mo po/attributes/nl.po
msgfmt -o build/locale/oc/LC_MESSAGES/picard-attributes.mo po/attributes/oc.po
msgfmt -o build/locale/pl/LC_MESSAGES/picard-attributes.mo po/attributes/pl.po
msgfmt -o build/locale/pt_BR/LC_MESSAGES/picard-attributes.mo po/attributes/pt_BR.po
msgfmt -o build/locale/pt_PT/LC_MESSAGES/picard-attributes.mo po/attributes/pt_PT.po
msgfmt -o build/locale/ro/LC_MESSAGES/picard-attributes.mo po/attributes/ro.po
msgfmt -o build/locale/ru/LC_MESSAGES/picard-attributes.mo po/attributes/ru.po
msgfmt -o build/locale/sk/LC_MESSAGES/picard-attributes.mo po/attributes/sk.po
msgfmt -o build/locale/sq/LC_MESSAGES/picard-attributes.mo po/attributes/sq.po
msgfmt -o build/locale/sv/LC_MESSAGES/picard-attributes.mo po/attributes/sv.po
msgfmt -o build/locale/tr/LC_MESSAGES/picard-attributes.mo po/attributes/tr.po
msgfmt -o build/locale/zh_CN/LC_MESSAGES/picard-attributes.mo po/attributes/zh_CN.po
msgfmt -o build/locale/zh_TW/LC_MESSAGES/picard-attributes.mo po/attributes/zh_TW.po
iMac-Pro:picard tdiaz$ python3 setup.py build_ext -i
running build_ext
copying build/lib.macosx-10.14-x86_64-3.7/picard/util/_astrcmp.cpython-37m-darwin.so -> picard/util
iMac-Pro:picard tdiaz$ pyinstaller --noconfirm --clean picard.spec
40 INFO: PyInstaller: 3.5
40 INFO: Python: 3.7.4
44 INFO: Platform: Darwin-18.2.0-x86_64-i386-64bit
46 INFO: UPX is not available.
46 INFO: Removing temporary files and cleaning cache in /Users/tdiaz/Library/Application Support/pyinstaller
50 INFO: Extending PYTHONPATH with paths
['/Users/tdiaz/Merlin/picard', '/Users/tdiaz/Merlin/picard/picard']
50 INFO: checking Analysis
50 INFO: Building Analysis because Analysis-00.toc is non existent
50 INFO: Initializing module dependency graph...
51 INFO: Initializing module graph hooks...
52 INFO: Analyzing base_library.zip ...
2074 INFO: running Analysis Analysis-00.toc
2078 INFO: Caching module hooks...
2081 INFO: Analyzing tagger.py
3393 INFO: Loading module hooks...
3393 INFO: Loading module hook "hook-encodings.py"...
3436 INFO: Loading module hook "hook-pydoc.py"...
3436 INFO: Loading module hook "hook-PyQt5.py"...
3509 INFO: Loading module hook "hook-PyQt5.QtCore.py"...
3518 INFO: Loading module hook "hook-PyQt5.QtGui.py"...
3540 INFO: Loading module hook "hook-PyQt5.QtMultimedia.py"...
3576 INFO: Loading module hook "hook-PyQt5.QtNetwork.py"...
3589 INFO: Loading module hook "hook-PyQt5.QtWidgets.py"...
3620 INFO: Loading module hook "hook-xml.py"...
3802 INFO: Looking for ctypes DLLs
3818 INFO: Analyzing run-time hooks ...
3821 INFO: Including run-time hook 'pyi_rth_pyqt5.py'
3826 INFO: Looking for dynamic libraries
3997 INFO: Looking for eggs
3997 INFO: Using Python library /usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/Python
4000 INFO: Warnings written to /Users/tdiaz/Merlin/picard/build/picard/warn-picard.txt
4028 INFO: Graph cross-reference written to /Users/tdiaz/Merlin/picard/build/picard/xref-picard.html
4038 INFO: Appending 'binaries' from .spec
Unable to find "libdiscid.0.dylib" when adding binary and data files.
iMac-Pro:picard tdiaz$ 

Output from Building to run from source:

iMac-Pro:picard tdiaz$ 
iMac-Pro:picard tdiaz$ python3 setup.py build_locales -i
running build_locales
msgfmt -o locale/af/LC_MESSAGES/picard.mo po/af.po
msgfmt -o locale/ar/LC_MESSAGES/picard.mo po/ar.po
msgfmt -o locale/ast/LC_MESSAGES/picard.mo po/ast.po
msgfmt -o locale/bg/LC_MESSAGES/picard.mo po/bg.po
msgfmt -o locale/ca/LC_MESSAGES/picard.mo po/ca.po
msgfmt -o locale/cs/LC_MESSAGES/picard.mo po/cs.po
msgfmt -o locale/cy/LC_MESSAGES/picard.mo po/cy.po
msgfmt -o locale/da/LC_MESSAGES/picard.mo po/da.po
msgfmt -o locale/de/LC_MESSAGES/picard.mo po/de.po
msgfmt -o locale/el/LC_MESSAGES/picard.mo po/el.po
msgfmt -o locale/en/LC_MESSAGES/picard.mo po/en.po
msgfmt -o locale/en_AU/LC_MESSAGES/picard.mo po/en_AU.po
msgfmt -o locale/en_CA/LC_MESSAGES/picard.mo po/en_CA.po
msgfmt -o locale/en_GB/LC_MESSAGES/picard.mo po/en_GB.po
msgfmt -o locale/eo/LC_MESSAGES/picard.mo po/eo.po
msgfmt -o locale/es/LC_MESSAGES/picard.mo po/es.po
msgfmt -o locale/et/LC_MESSAGES/picard.mo po/et.po
msgfmt -o locale/fa/LC_MESSAGES/picard.mo po/fa.po
msgfmt -o locale/fi/LC_MESSAGES/picard.mo po/fi.po
msgfmt -o locale/fo/LC_MESSAGES/picard.mo po/fo.po
msgfmt -o locale/fr/LC_MESSAGES/picard.mo po/fr.po
msgfmt -o locale/fr_CA/LC_MESSAGES/picard.mo po/fr_CA.po
msgfmt -o locale/fy/LC_MESSAGES/picard.mo po/fy.po
msgfmt -o locale/gl/LC_MESSAGES/picard.mo po/gl.po
msgfmt -o locale/he/LC_MESSAGES/picard.mo po/he.po
msgfmt -o locale/hi/LC_MESSAGES/picard.mo po/hi.po
msgfmt -o locale/hr/LC_MESSAGES/picard.mo po/hr.po
msgfmt -o locale/hu/LC_MESSAGES/picard.mo po/hu.po
msgfmt -o locale/id/LC_MESSAGES/picard.mo po/id.po
msgfmt -o locale/is/LC_MESSAGES/picard.mo po/is.po
msgfmt -o locale/it/LC_MESSAGES/picard.mo po/it.po
msgfmt -o locale/ja/LC_MESSAGES/picard.mo po/ja.po
msgfmt -o locale/kn/LC_MESSAGES/picard.mo po/kn.po
msgfmt -o locale/ko/LC_MESSAGES/picard.mo po/ko.po
msgfmt -o locale/lt/LC_MESSAGES/picard.mo po/lt.po
msgfmt -o locale/mr/LC_MESSAGES/picard.mo po/mr.po
msgfmt -o locale/nb/LC_MESSAGES/picard.mo po/nb.po
msgfmt -o locale/nds/LC_MESSAGES/picard.mo po/nds.po
msgfmt -o locale/ne/LC_MESSAGES/picard.mo po/ne.po
msgfmt -o locale/nl/LC_MESSAGES/picard.mo po/nl.po
msgfmt -o locale/oc/LC_MESSAGES/picard.mo po/oc.po
msgfmt -o locale/pl/LC_MESSAGES/picard.mo po/pl.po
msgfmt -o locale/pt/LC_MESSAGES/picard.mo po/pt.po
msgfmt -o locale/pt_BR/LC_MESSAGES/picard.mo po/pt_BR.po
msgfmt -o locale/ro/LC_MESSAGES/picard.mo po/ro.po
msgfmt -o locale/ru/LC_MESSAGES/picard.mo po/ru.po
msgfmt -o locale/sco/LC_MESSAGES/picard.mo po/sco.po
msgfmt -o locale/sk/LC_MESSAGES/picard.mo po/sk.po
msgfmt -o locale/sl/LC_MESSAGES/picard.mo po/sl.po
msgfmt -o locale/sq/LC_MESSAGES/picard.mo po/sq.po
msgfmt -o locale/sr/LC_MESSAGES/picard.mo po/sr.po
msgfmt -o locale/sv/LC_MESSAGES/picard.mo po/sv.po
msgfmt -o locale/ta/LC_MESSAGES/picard.mo po/ta.po
msgfmt -o locale/te/LC_MESSAGES/picard.mo po/te.po
msgfmt -o locale/tr/LC_MESSAGES/picard.mo po/tr.po
msgfmt -o locale/uk/LC_MESSAGES/picard.mo po/uk.po
msgfmt -o locale/zh_CN/LC_MESSAGES/picard.mo po/zh_CN.po
msgfmt -o locale/zh_TW/LC_MESSAGES/picard.mo po/zh_TW.po
msgfmt -o locale/ca/LC_MESSAGES/picard-countries.mo po/countries/ca.po
msgfmt -o locale/cs/LC_MESSAGES/picard-countries.mo po/countries/cs.po
msgfmt -o locale/cy/LC_MESSAGES/picard-countries.mo po/countries/cy.po
msgfmt -o locale/da/LC_MESSAGES/picard-countries.mo po/countries/da.po
msgfmt -o locale/de/LC_MESSAGES/picard-countries.mo po/countries/de.po
msgfmt -o locale/el/LC_MESSAGES/picard-countries.mo po/countries/el.po
msgfmt -o locale/en_AU/LC_MESSAGES/picard-countries.mo po/countries/en_AU.po
msgfmt -o locale/en_CA/LC_MESSAGES/picard-countries.mo po/countries/en_CA.po
msgfmt -o locale/en_GB/LC_MESSAGES/picard-countries.mo po/countries/en_GB.po
msgfmt -o locale/eo/LC_MESSAGES/picard-countries.mo po/countries/eo.po
msgfmt -o locale/es/LC_MESSAGES/picard-countries.mo po/countries/es.po
msgfmt -o locale/et/LC_MESSAGES/picard-countries.mo po/countries/et.po
msgfmt -o locale/fi/LC_MESSAGES/picard-countries.mo po/countries/fi.po
msgfmt -o locale/fr/LC_MESSAGES/picard-countries.mo po/countries/fr.po
msgfmt -o locale/fr_CA/LC_MESSAGES/picard-countries.mo po/countries/fr_CA.po
msgfmt -o locale/gl/LC_MESSAGES/picard-countries.mo po/countries/gl.po
msgfmt -o locale/he/LC_MESSAGES/picard-countries.mo po/countries/he.po
msgfmt -o locale/hr/LC_MESSAGES/picard-countries.mo po/countries/hr.po
msgfmt -o locale/it/LC_MESSAGES/picard-countries.mo po/countries/it.po
msgfmt -o locale/ja/LC_MESSAGES/picard-countries.mo po/countries/ja.po
msgfmt -o locale/ko/LC_MESSAGES/picard-countries.mo po/countries/ko.po
msgfmt -o locale/mr/LC_MESSAGES/picard-countries.mo po/countries/mr.po
msgfmt -o locale/nb/LC_MESSAGES/picard-countries.mo po/countries/nb.po
msgfmt -o locale/nl/LC_MESSAGES/picard-countries.mo po/countries/nl.po
msgfmt -o locale/pa/LC_MESSAGES/picard-countries.mo po/countries/pa.po
msgfmt -o locale/pl/LC_MESSAGES/picard-countries.mo po/countries/pl.po
msgfmt -o locale/pt/LC_MESSAGES/picard-countries.mo po/countries/pt.po
msgfmt -o locale/pt_BR/LC_MESSAGES/picard-countries.mo po/countries/pt_BR.po
msgfmt -o locale/ro/LC_MESSAGES/picard-countries.mo po/countries/ro.po
msgfmt -o locale/ru/LC_MESSAGES/picard-countries.mo po/countries/ru.po
msgfmt -o locale/sk/LC_MESSAGES/picard-countries.mo po/countries/sk.po
msgfmt -o locale/sl/LC_MESSAGES/picard-countries.mo po/countries/sl.po
msgfmt -o locale/sq/LC_MESSAGES/picard-countries.mo po/countries/sq.po
msgfmt -o locale/sr/LC_MESSAGES/picard-countries.mo po/countries/sr.po
msgfmt -o locale/sv/LC_MESSAGES/picard-countries.mo po/countries/sv.po
msgfmt -o locale/te/LC_MESSAGES/picard-countries.mo po/countries/te.po
msgfmt -o locale/tr/LC_MESSAGES/picard-countries.mo po/countries/tr.po
msgfmt -o locale/vi/LC_MESSAGES/picard-countries.mo po/countries/vi.po
msgfmt -o locale/zh_CN/LC_MESSAGES/picard-countries.mo po/countries/zh_CN.po
msgfmt -o locale/zh_TW/LC_MESSAGES/picard-countries.mo po/countries/zh_TW.po
msgfmt -o locale/da/LC_MESSAGES/picard-attributes.mo po/attributes/da.po
msgfmt -o locale/de/LC_MESSAGES/picard-attributes.mo po/attributes/de.po
msgfmt -o locale/el/LC_MESSAGES/picard-attributes.mo po/attributes/el.po
msgfmt -o locale/en_AU/LC_MESSAGES/picard-attributes.mo po/attributes/en_AU.po
msgfmt -o locale/en_CA/LC_MESSAGES/picard-attributes.mo po/attributes/en_CA.po
msgfmt -o locale/en_GB/LC_MESSAGES/picard-attributes.mo po/attributes/en_GB.po
msgfmt -o locale/eo/LC_MESSAGES/picard-attributes.mo po/attributes/eo.po
msgfmt -o locale/es/LC_MESSAGES/picard-attributes.mo po/attributes/es.po
msgfmt -o locale/et/LC_MESSAGES/picard-attributes.mo po/attributes/et.po
msgfmt -o locale/fi/LC_MESSAGES/picard-attributes.mo po/attributes/fi.po
msgfmt -o locale/fr/LC_MESSAGES/picard-attributes.mo po/attributes/fr.po
msgfmt -o locale/fr_CA/LC_MESSAGES/picard-attributes.mo po/attributes/fr_CA.po
msgfmt -o locale/gl/LC_MESSAGES/picard-attributes.mo po/attributes/gl.po
msgfmt -o locale/he/LC_MESSAGES/picard-attributes.mo po/attributes/he.po
msgfmt -o locale/hr/LC_MESSAGES/picard-attributes.mo po/attributes/hr.po
msgfmt -o locale/it/LC_MESSAGES/picard-attributes.mo po/attributes/it.po
msgfmt -o locale/ja/LC_MESSAGES/picard-attributes.mo po/attributes/ja.po
msgfmt -o locale/nb/LC_MESSAGES/picard-attributes.mo po/attributes/nb.po
msgfmt -o locale/nl/LC_MESSAGES/picard-attributes.mo po/attributes/nl.po
msgfmt -o locale/oc/LC_MESSAGES/picard-attributes.mo po/attributes/oc.po
msgfmt -o locale/pl/LC_MESSAGES/picard-attributes.mo po/attributes/pl.po
msgfmt -o locale/pt_BR/LC_MESSAGES/picard-attributes.mo po/attributes/pt_BR.po
msgfmt -o locale/pt_PT/LC_MESSAGES/picard-attributes.mo po/attributes/pt_PT.po
msgfmt -o locale/ro/LC_MESSAGES/picard-attributes.mo po/attributes/ro.po
msgfmt -o locale/ru/LC_MESSAGES/picard-attributes.mo po/attributes/ru.po
msgfmt -o locale/sk/LC_MESSAGES/picard-attributes.mo po/attributes/sk.po
msgfmt -o locale/sq/LC_MESSAGES/picard-attributes.mo po/attributes/sq.po
msgfmt -o locale/sv/LC_MESSAGES/picard-attributes.mo po/attributes/sv.po
msgfmt -o locale/tr/LC_MESSAGES/picard-attributes.mo po/attributes/tr.po
msgfmt -o locale/zh_CN/LC_MESSAGES/picard-attributes.mo po/attributes/zh_CN.po
msgfmt -o locale/zh_TW/LC_MESSAGES/picard-attributes.mo po/attributes/zh_TW.po
iMac-Pro:picard tdiaz$ 
iMac-Pro:picard tdiaz$ 
iMac-Pro:picard tdiaz$ python3 setup.py build_ext -i
running build_ext
copying build/lib.macosx-10.14-x86_64-3.7/picard/util/_astrcmp.cpython-37m-darwin.so -> picard/util
iMac-Pro:picard tdiaz$ 
iMac-Pro:picard tdiaz$ 
iMac-Pro:picard tdiaz$ python3 tagger.py
iMac-Pro:picard tdiaz$

Please don’t run any of the build commands with sudo, this will mess with permissions. First you should clean up, do a

sudo rm -rf build dist

This should remove the builds and resolve your permission errors. Then you can repeat the build steps without sudo.

Also please post the output of python3 tagger.py -V (uppercase V) to see the exact versions of dependencies being used.

Missing libdiscid warnings you can ignore if you don’t need the discid functionality. Otherwise you need to check the libdiscid install. On my system I installed it with Homebrew and that was sufficient for Picard builds to find the library.

1 Like

That one build command will -not- run without sudo. That was why I did that. It comes right back with a permission error, as shown in the log.

python3 setup.py build
running build
generating scripts/picard from scripts/picard.in
error: [Errno 13] Permission denied: 'scripts/picard'

So, something is amiss there. The next two lines will work without sudo, though the package building does abort with that missing library.

I had installed discid previously mostly because I got sick of seeing it complain when I started it :wink:

python3 tagger.py -V
Picard 2.2.2.dev1, Python 3.7.4, PyQt 5.13.1, Qt 5.13.1, Mutagen 1.42.0, Discid discid 1.2.0, libdiscid 0.6.2, astrcmp C, SSL Secure Transport, macOS Mojave (10.14)

The QDragManager::drag in possibly invalid state message comes across when:

Select any single item, drag it wherever. Do it again. Do that all you want. No issues occur.

Select multiple items, deselect them. select a single, drag still works.

But, select more than 1 item, then go to drag them and nothing happens other than the selected items un-highlight as expected. But you never see that transparent hovering bit trailing the cursor.

Only after you click on an item will it then echo QDragManager::drag in possibly invalid state
… to which, you’ve got to relaunch it.

This indicates you had run things with sudo before, and some files where generated with permissions so that your normal user can’t access it. I would suggest you remove scripts completely and reset it with git:

sudo rm -rf scripts
git checkout scripts

If you can’t run a clean build and get permission errors like this it is hard to tell in what state the build is.

Also I need more details which revision you run and what changes you applied. Can you post the outputs of the following commands:

git status
git rev-parse HEAD
git diff origin/head
1 Like

git status

On branch master
Your branch is ahead of 'origin/master' by 2 commits.
  (use "git push" to publish your local commits)

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   ../picard/ui/options/renaming.py
	modified:   ../picard/util/emptydir.py

no changes added to commit (use "git add" and/or "git commit -a")

git rev-parse HEAD
0486ac27160a93b5925b64b36b9d40f28fb61600

git diff origin/head

diff --git a/.gitignore b/.gitignore
index 193258b4..06e057f4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -34,3 +34,4 @@ win-version-info.txt
 *~
 appledev.p12
 build.cfg
+/picbld
diff --git a/picard/file.py b/picard/file.py
index 2917747d..3c1f1f63 100644
--- a/picard/file.py
+++ b/picard/file.py
@@ -420,27 +420,59 @@ class File(QtCore.QObject, Item):
             # os.path.realpath can fail if cwd doesn't exist
             return new_path
 
+
     def _rename(self, old_filename, metadata):
         new_filename, ext = os.path.splitext(
             self.make_filename(old_filename, metadata))
-
+            
         if old_filename == new_filename + ext:
             return old_filename
-
-        new_dirname = os.path.dirname(new_filename)
-        if not os.path.isdir(new_dirname):
-            os.makedirs(new_dirname)
-        tmp_filename = new_filename
-        i = 1
-        while (not pathcmp(old_filename, new_filename + ext)
-               and os.path.exists(new_filename + ext)):
-            new_filename = "%s (%d)" % (tmp_filename, i)
-            i += 1
+            
+        tmp_directory,tmp_filename = os.path.split(new_filename)
+        new_directory = tmp_directory
+        i = 0
+        file_found = True
+        while not pathcmp(old_filename, new_filename + ext) and file_found: 
+            if not os.path.isdir(new_directory):
+                os.makedirs(new_directory)
+        
+            if os.path.exists(new_filename + ext):
+                i += 1
+                new_directory = "%s (%d)" % (tmp_directory, i)
+                new_filename = os.path.join(new_directory, tmp_filename)
+            else:
+                 file_found = False
+                                  
         new_filename = new_filename + ext
         log.debug("Moving file %r => %r", old_filename, new_filename)
         shutil.move(old_filename, new_filename)
         return new_filename
 
+
+############ Original Code #############
+#    def _rename(self, old_filename, metadata):
+#        new_filename, ext = os.path.splitext(
+#            self.make_filename(old_filename, metadata))
+#
+#        if old_filename == new_filename + ext:
+#            return old_filename
+#
+#        new_dirname = os.path.dirname(new_filename)
+#        if not os.path.isdir(new_dirname):
+#            os.makedirs(new_dirname)
+#        tmp_filename = new_filename
+#        i = 1
+#        while (not pathcmp(old_filename, new_filename + ext)
+#               and os.path.exists(new_filename + ext)):
+#            new_filename = "%s (%d)" % (tmp_filename, i)
+#            i += 1
+#        new_filename = new_filename + ext
+#        log.debug("Moving file %r => %r", old_filename, new_filename)
+#        shutil.move(old_filename, new_filename)
+#        return new_filename~
+############# Original Code #############
+
+
     def _save_images(self, dirname, metadata):
         """Save the cover images to disk."""
         if not metadata.images:
diff --git a/picard/ui/options/renaming.py b/picard/ui/options/renaming.py
index c42f6473..d790b56b 100644
--- a/picard/ui/options/renaming.py
+++ b/picard/ui/options/renaming.py
@@ -239,25 +239,32 @@ class RenamingOptionsPage(OptionsPage):
 #        self.ui.file_naming_format.setCursorPosition(0)
 
     def example_1(self):
-        file = File("ticket_to_ride.mp3")
+        file = File("Ticket_to_Ride.mp3")
         file.state = File.NORMAL
         file.metadata['album'] = 'Help!'
-        file.metadata['title'] = 'Ticket to Ride'
         file.metadata['artist'] = 'The Beatles'
-        file.metadata['artistsort'] = 'Beatles, The'
+        file.metadata['title'] = 'Ticket to Ride'
+        file.metadata['date'] = '1965-08-06'
         file.metadata['albumartist'] = 'The Beatles'
-        file.metadata['albumartistsort'] = 'Beatles, The'
         file.metadata['tracknumber'] = '7'
         file.metadata['totaltracks'] = '14'
-        file.metadata['discnumber'] = '1'
         file.metadata['totaldiscs'] = '1'
-        file.metadata['date'] = '1965-08-06'
+        file.metadata['discnumber'] = '1'
+        file.metadata['artistsort'] = 'Beatles, The'
+        file.metadata['albumartistsort'] = 'Beatles, The'
+        file.metadata['media'] = 'Vinyl'
+        file.metadata['label'] = 'Apple Records'
         file.metadata['releasetype'] = ['album', 'soundtrack']
         file.metadata['~primaryreleasetype'] = ['album']
         file.metadata['~secondaryreleasetype'] = ['soundtrack']
-        file.metadata['releasestatus'] = 'official'
+        file.metadata['releasestatus'] = 'Official'
+        file.metadata['catalognumber'] = 'M8541'
         file.metadata['releasecountry'] = 'US'
         file.metadata['~extension'] = 'mp3'
+        file.metadata['~length'] = '4_20'
+        file.metadata['bitrate'] = '256.0'
+        file.metadata['sample_rate'] = '44100'
+        file.metadata['channels'] = '2'
         file.metadata['musicbrainz_albumid'] = '2c053984-4645-4699-9474-d2c35c227028'
         file.metadata['musicbrainz_albumartistid'] = 'b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d'
         file.metadata['musicbrainz_artistid'] = 'b10bbbfc-cf9e-42e0-be17-e2c3e1d2600d'
@@ -266,28 +273,34 @@ class RenamingOptionsPage(OptionsPage):
         return file
 
     def example_2(self):
-        file = File("track05.mp3")
+        file = File("Classical_Crass.mp3")
         file.state = File.NORMAL
-        file.metadata['album'] = "Coup d'État, Volume 1: Ku De Ta / Prologue"
-        file.metadata['title'] = "I've Got to Learn the Mambo"
-        file.metadata['artist'] = "Snowboy feat. James Hunter"
-        file.metadata['artistsort'] = "Snowboy feat. Hunter, James"
+        file.metadata['album'] = "Compilation Album"
+        file.metadata['title'] = "Track Title"
+        file.metadata['artist'] = "Artist feat. Last, First"
+        file.metadata['artistsort'] = "Artist feat. First, Last"
         file.metadata['albumartist'] = config.setting['va_name']
         file.metadata['albumartistsort'] = config.setting['va_name']
+        file.metadata['media'] = 'Vinyl'
         file.metadata['tracknumber'] = '5'
         file.metadata['totaltracks'] = '13'
         file.metadata['discnumber'] = '2'
         file.metadata['totaldiscs'] = '2'
-        file.metadata['discsubtitle'] = "Beat Up"
+        file.metadata['label'] = 'Bootleg Records'
+        file.metadata['discsubtitle'] = "Disc Subtitle"
         file.metadata['date'] = '2005-07-04'
         file.metadata['releasetype'] = ['album', 'compilation']
         file.metadata['~primaryreleasetype'] = 'album'
         file.metadata['~secondaryreleasetype'] = 'compilation'
-        file.metadata['releasestatus'] = 'official'
+        file.metadata['releasestatus'] = 'Release Status'
         file.metadata['releasecountry'] = 'AU'
+        file.metadata['~extension'] = 'mp3'
+        file.metadata['~length'] = '10_40'
+        file.metadata['bitrate'] = '256.0'
+        file.metadata['sample_rate'] = '44100'
+        file.metadata['channels'] = '2'
         file.metadata['compilation'] = '1'
         file.metadata['~multiartist'] = '1'
-        file.metadata['~extension'] = 'mp3'
         file.metadata['musicbrainz_albumid'] = '4b50c71e-0a07-46ac-82e4-cb85dc0c9bdd'
         file.metadata['musicbrainz_recordingid'] = 'b3c487cb-0e55-477d-8df3-01ec6590f099'
         file.metadata['musicbrainz_releasetrackid'] = 'f8649a05-da39-39ba-957c-7abf8f9012be'
diff --git a/picard/util/__init__.py b/picard/util/__init__.py
index 2c032c43..2e0cbd25 100644
--- a/picard/util/__init__.py
+++ b/picard/util/__init__.py
@@ -120,11 +120,11 @@ def format_time(ms, display_zero=False):
     duration_seconds = round(ms / 1000)
     if duration_seconds < 3600:
         minutes, seconds = divmod(duration_seconds, 60)
-        return "%d:%02d" % (minutes, seconds)
+        return "%dm%02ds" % (minutes, seconds)
     else:
         hours, remainder = divmod(duration_seconds, 3600)
         minutes, seconds = divmod(remainder, 60)
-        return "%d:%02d:%02d" % (hours, minutes, seconds)
+        return "%dh%02dm%02ds" % (hours, minutes, seconds)
 
 
 def sanitize_date(datestr):
diff --git a/picard/util/emptydir.py b/picard/util/emptydir.py
index 1cd7d11c..beaaae2d 100644
--- a/picard/util/emptydir.py
+++ b/picard/util/emptydir.py
@@ -29,7 +29,7 @@ from picard.util import get_qt_enum
 
 # Files not considered relevant for a directory. If a directory has only
 # some of these files inside it is still considered empty and can be deleted.
-JUNK_FILES = set([".DS_Store", "desktop.ini", "Desktop.ini", "Thumbs.db"])
+JUNK_FILES = set([".DS_Store", "desktop.ini", "Desktop.ini", "Thumbs.db", "Back.jpg", "cover.jpg", "Cover.jpg", "Folder.jpg", "Front.jpg", "Mini.jpg"])
 
 # Special file system locations Picard should never delete.
 PROTECTED_DIRECTORIES = set()

The build works with the scripts replaced. I thought I’d done that previously, …guess not.

The package building still terminates with the missing library, and there is nothing in dist.

python3 setup.py build
/usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/Resources/Python.app/Contents/MacOS/Python: can't open file 'setup.py': [Errno 2] No such file or directory
iMac-Pro:dist tdiaz$ cd ./.
iMac-Pro:dist tdiaz$ cd ..
iMac-Pro:picard tdiaz$ pyinstaller --noconfirm --clean picard.spec
38 INFO: PyInstaller: 3.5
38 INFO: Python: 3.7.4
43 INFO: Platform: Darwin-18.2.0-x86_64-i386-64bit
45 INFO: UPX is not available.
45 INFO: Removing temporary files and cleaning cache in /Users/tdiaz/Library/Application Support/pyinstaller
68 INFO: Extending PYTHONPATH with paths
['/Users/tdiaz/Merlin/picard', '/Users/tdiaz/Merlin/picard/picard']
68 INFO: checking Analysis
68 INFO: Building Analysis because Analysis-00.toc is non existent
68 INFO: Initializing module dependency graph...
69 INFO: Initializing module graph hooks...
74 INFO: Analyzing base_library.zip ...
2151 INFO: running Analysis Analysis-00.toc
2155 INFO: Caching module hooks...
2168 INFO: Analyzing tagger.py
3496 INFO: Loading module hooks...
3496 INFO: Loading module hook "hook-encodings.py"...
3538 INFO: Loading module hook "hook-pydoc.py"...
3538 INFO: Loading module hook "hook-PyQt5.py"...
3652 INFO: Loading module hook "hook-PyQt5.QtCore.py"...
3662 INFO: Loading module hook "hook-PyQt5.QtGui.py"...
3677 INFO: Loading module hook "hook-PyQt5.QtMultimedia.py"...
3698 INFO: Loading module hook "hook-PyQt5.QtNetwork.py"...
3710 INFO: Loading module hook "hook-PyQt5.QtWidgets.py"...
3738 INFO: Loading module hook "hook-xml.py"...
3934 INFO: Looking for ctypes DLLs
3951 INFO: Analyzing run-time hooks ...
3954 INFO: Including run-time hook 'pyi_rth_pyqt5.py'
3959 INFO: Looking for dynamic libraries
4133 INFO: Looking for eggs
4133 INFO: Using Python library /usr/local/Cellar/python/3.7.4_1/Frameworks/Python.framework/Versions/3.7/Python
4136 INFO: Warnings written to /Users/tdiaz/Merlin/picard/build/picard/warn-picard.txt
4163 INFO: Graph cross-reference written to /Users/tdiaz/Merlin/picard/build/picard/xref-picard.html
4173 INFO: Appending 'binaries' from .spec
Unable to find "libdiscid.0.dylib" when adding binary and data files.

Yes, for building the app bundle this is required. If you don’t need it uncomment the two lines at picard/picard.spec at master · metabrainz/picard · GitHub

1 Like

I installed it for when it runs from source, it no longer complains about not finding it.

pip3 install discid Requirement already satisfied: discid in /usr/local/lib/python3.7/site-packages (1.2.0)

That says I have it already.

I’ve tried putting the binary in ~/usr/local/bin … and a few other places, nothing will take it.

It’s in the app .pkg for the release builds - … it gets there somehow. So for me right now, it’s Chicken vs. Egg. Who’s on First.

I gave in for the moment and disabled discid in the build. Although I do not have to do that if I run from source, it will not work to build the pkg.

Prior to installing libdiscid, I would see the message about discid during launch from running from source.

However the Qt issues does not happen if the app pkg is built. So for the moment, until I can figure out why even though the build dependencies say I’ve got whats needed installed, the build process will still not complete.

pip3 install discid installs the Python module, that’s one part of the puzzle. But you also need the libdiscid C library installed, which I think can be done with brew:

brew install libdiscid
1 Like

That’s an interesting result. I have no good explanation why running directly from source is different from the app pkg , but I’m glad it works.

Couple of things:

tagger.py changed it’s name to tagger.py.in, which affects running from source. python3 tagger.py.in. What does the change / additional file extension mean here?

python setup.py build_ui
  File "setup.py", line 240
    generate_file('installer/picard-setup.nsi.in', 'installer/picard-setup.nsi', {**args, **installer_args})
                                                                                   ^
SyntaxError: invalid syntax
ICBM-Pro:picard tdiaz

Somewhere along the line I got the GUI results scrambled up … and I get this when trying to fix it.

The error is because you are trying to run the setup.py with Python 2. By default if you just run python on macOS this refers to the Python 2 version provided by the OS itself. If you have separately installed Python 3 you usually need to call it as python3

The .in files are files meant to be templates for a file generated at build time. In this case we recently had tagger.py to get generated by setup.py build to allow the disable-autoupdate build time parameter to be used.

Thus run python3 setup.py build to do the build and generate tagger.py.

2 Likes

D’oh! - I should have seen that.

What am I missing here? I’ve cleared all the previous builds, cache, etc. like the steps for building to release. I don’t have any errors showing in the terminal session and code wise, I’m following the development release with the options settings. Diff doesn’t show me anything related missing anything from the UI / Options code areas.

Building the UI leaves me with a misplaced window and it’s not showing up in the left side listings.


I’ve verified that what I have agrees with the latest development releases.

Something goes wrong when initializing the UI, probably some exception happening on one of the option pages. Nothing logged?

…and another “Why do I keep forgetting that is there” thing. The logging window is more than just what got saved.

E: 07:36:50,671 ui.options.dialog.__init__:128: Failed initializing options page <picard.ui.options.about.AboutOptionsPage object at 0x1177124b0>
AttributeError: __getattribute__

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "picard/ui/options/dialog.py", line 125, in __init__
  File "picard/ui/options/advanced.py", line 52, in __init__
  File "picard/ui/ui_options_advanced.py", line 92, in setupUi
  File "picard/ui/widgets/taglisteditor.py", line 38, in __init__
  File "picard/ui/ui_widget_taglisteditor.py", line 68, in setupUi
SystemError: <built-in function connectSlotsByName> returned a result with an error set
E: 07:36:50,681 ui.options.dialog.__init__:128: Failed initializing options page <picard.ui.options.interface_colors.InterfaceColorsOptionsPage object at 0x117799690>
AttributeError: __getattribute__

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "picard/ui/options/dialog.py", line 125, in __init__
  File "picard/ui/options/interface_top_tags.py", line 53, in __init__
  File "picard/ui/ui_options_interface_top_tags.py", line 21, in setupUi
  File "picard/ui/widgets/taglisteditor.py", line 38, in __init__
  File "picard/ui/ui_widget_taglisteditor.py", line 68, in setupUi
SystemError: <built-in function connectSlotsByName> returned a result with an error set
D: 07:36:50,738 coverart.providers.cover_art_providers:96: CA Providers order: Local Files [x] > Cover Art Archive [x] > TheAudioDB [x] > fanart.tv [x] > CaaReleaseGroup [x] > Whitelist [x]

Now to see what this stuff means :slight_smile: