Failing to update user or channel avatars with API

I don’t suppose someone could give an example format for the string to pass that actually works?
It would help me narrow down my troubleshooting if I could at least figure out what "string<binary>" in the API docs means. The error message keeps saying it’s the format or size, and changing the avatar via the user interface to the same jpgs is working without issue so I doubt it’s the size.

"https://test.com/exampleimage.jpg" doesn't work

"data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAAAQABAAD/2wCEAAoHCBUWFRgSEhYVEhIYGhIcGBIVEhIYGBoYHBgZGRkVGRgcIS4lHCEsHxkYJjsmKy8xODY1GiQ7QDszPy40NTEBDAwMEA8QHhISHz8rJSs0NDQxMTE/NTQ0NDQ0MTQ0NDE0NDQxNDQxMTQ0NDQ0NDQ2NDQ0NDQ0NDQ0NDQ0NDQ0NP/AABEIAOEA4QMBIgACEQEDEQH/xAAcAAEAAQUBAQAAAAAAAAAAAAAABwECAwQGBQj/xABJEAACAQIBCAUHCAYJBQAAAAABAgADEQQFBhIhMUFRYQcTcYGRIjJCUoKhsRQVM2JykrLRI0NTosHSFhckRFRzo8LwNJOzw+L/xAAYAQEAAwEAAAAAAAAAAAAAAAAAAQMEAv/EACQRAAMAAgEEAgMBAQAAAAAAAAABAgMRExIhMUFRYSIyQlKR/9oADAMBAAIRAxEAPwCZoiIAiIgCIiAIiIAiIgGN3ABLEADWSTYAcSZpJlrDMdFcRQZvVFamT4XmPL2SExVFqFQsAdYIYizDzWIGpgDuOqQccMVZqbjylZlYfWUkEeIld259FkQq9n0LeJBeTMrYjDkGhUZVH6sksh7UOrvFjzkg5Az8o1bU8TbD1TqDE/o2PJj5p5N4mJyzRNYqk7SJQGVlhUIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAUMgzKwHynEW2dfiP8AyNJOz0y/8lo2pkdfUutMcPWqEcrjvI5yKKYO0kkm5JJuSTrJJ3mZ81LwaMEvyXS16YMviZjQetm9nVXwhCG9bD/sydajjTY7PsnV2bZKWSMrUcSnWUH0hsI2Mp9Vl3GQsyzJk/G1cPUFWg2gw2jarD1XX0h/wWMujK12ZVeJPuidongZsZyU8WmryKygadInWPrKfSU8fGe/NSaa2jK009MrERJIEREAREQBERAEREAREQBERAEREAREQBERAEpKzzsvVimGruvnLSqkHmENjDBEWcWUzicS9W90BKUxu0FJAI7TdvamkJhww1TPMFPb2b5WloRETkkS1zDNaa7vAFDGPRqLWosUqIbhh71Yb1OwiTPmtl9MZRFRbLUXVUp3uUf+IO0H+IMhB2m9mzlxsFiFra+qay1UF9aE+dbivnDsI3mW4r09PwVZI2vsn6JjpuGAKkEEAgjYQdhmSbDIIiIAiIgCIiAIiIAiIgCIiAIiIAiIgCIiAUmDF0BUpvTbzXV1PYwIPxngZy53UsL5AHXVyL9UrABRxdtej2WJ7tcj3KmcuLxBIeoaaH9XSJQW4Eg6Td5ldZJXYsnHT7nnVsI9Go1GoLMhKngbbGHIixHbEsp07S4mY2bEVljvLWeYGeQCrvMDNDNMZMAEzFUEvlrQGTH0ZZSNbBKrG7UWNI9igMn7jKO6dhI26HWPV4kbtOkbcypv8BJJm6HuUYbWqZWIidnIiIgCIiAIiIAiIgCIiAIiIAiIgFJyWemdHydepokHEsNuoimp9MjeeA5XOrUfay/lRcNQeu2vRGpfWYmyr3kjsFzukJ1MS9R3q1DpVHJZm5nhwA2AbgBKst9K0i3FHU9suCkku5LMxJZmJJJO0knaZfeYjUmNnmM1mdnmF3mJnmNngF7PMTNKFpaTAKky2JQmACZiqPuh33DWZtYTC+k234SUiDu+jjLGFwuHcV6oSrUqMxXq6h0VCqqglVI3E+1JDyfljD1voaqVDvVXGkO1do8JCApCUNOxDKSrDWGBIIPEEbDLpza7aKqwp99k/wASNc08+GDLh8a1wbBMQdoO5anEfW8eIkqaJpUtoz1Ll6ZWIidHIiIgCIiAIiIAiIgCIiAIiIBGnSzjTehhwdXl1GHPzE+LzgVadZ0sIRi6T+i1EAdqu5P41nG6Ux5X+TNeL9UZS8sLzdwOSK9bXTQlfXbyV7idvdPSOZ+Jte9K/DTf+WcqafhHbqV5Zz5aWkzbx+Sq1H6RCq+uLFfEbO+aJactNeSU0/BWUvMbVBKLpN5o790aGy5nlqhm1L47psUcDfW2vlunoU6IEnsh5NbDYQDXtPGbqraVAmfDYV3OjTUueWwdp2CR3Y7IwzE7z3BmziCNqLyLN/ATzsfkLEUxpFNNRtKHS9233TpxS9HKuX7PIxGsSTejPOM1UOEqterSF0JOt6ey3MqbDsK85F7NPVzIqlco4cjezqeYam4I/j3TrHTVHOSdyTzERNhkEREAREQBERAEREAREQBKROTy3nxh6BKU74mqLgqjAKDwZ9YvyANpDaXklJvwafSlkhquGWugu+HJYgbTTawfwsrdimchmfm51oFesL0z5lM+l9duXAb+ye1hc7Mbiay0k6ujTJuwVA50B5wJa4N9mwbZ2WAwoVRYAAAAACwAGwAStTNV1FjqpnpMNDBAAarchM/ydeE5nPrPZMABTRRVxTi60ybKi7mcjX2KNtt0jRek7KOnp6dIr+zNBNDs1eV+9LSomrEYFWBFgQdRBFwRwtI0zpzV6tutpXFInyk26BPD6p907LMjPCnj0YaPVYlAC9K9wVOoOh3rfvB27QT7uUMIrqQRdSCCORnFwqR3FOWQpSwCjdftm0lECbuPwpp1Hpn0TqPEbQfC015ie/BsWvRQCVlpaWFySANZJAA4k6gJBJ62RMltXe2sU1tpN/tHP4SQcDk1UUKihVG4fHnLM38lilTWnvAux4sdp8Zlzky7RwVA16x1ealNbaTva4RfDWdwm3HHSvsx5L2/o2xhRMb4SQvj+lHHu+lTNKgl9VNaavq+sz3J7rTsMxukf5TUGFxipSrNqp1VuEqN6jKb6LHdrsTq1GwNhWZs6s2A4NWitqouSo1B/wD6575zWYOHL5RoW2IajtyCowH7xUd8mHEUNIc5wVSquTsY+JFE1BXSygMF0G0r1NxvpWpndvlNQlSr/pdNtpySjKzjsB0g4VyFqCpQJ9J1DJ95CbdpAnV0KyuodGVlIuGUgqRxBGoyxUn4KnLXkzRETogREQBERAEREASkTnc9srHD4VmQ2qORTQ7wzXuw5hQx7QJDelslLb0cpntnWzu2FwzFaakrUqKdbtsKKdyjYTv7NvHpSAltBABM0xVTp7ZtiVK0jqsxsNdnqcNFR33J+AkgOyohdtSopZjyAuT4CcZmCPIf/M/2rOjzvuMBiyu35NirW/ynmrEvxRlyv8mfNuWMpNia9TEv51R2bsXYq9iqFXumlESwrPWzWyu2FxVHEKbKrqH4Gmx0XU+ySe0A7p9NulxPkx9h7DPrDJtzRpltvV079ugLwCOM+KISqj+spB7VP5MPCcu9Sdj0kG3Vcb1Pgs4JnmLKtUzbie5RmapPSzWo6eKpqdYBLn2VJHvtPFLTo8wP+r9h/isiFukTb1LJbwyWUSCOlvK7Vsc1EH9HhgqKN2mwDu3bcqvsSf6Y1CfL+dpY47FaXnfKMR+NgPdabjCeRKqxBBBKkWIYGxBGsEHcZSIB9N5n5V+VYKhiT57pZ9VvLUlH/eUnvnj594QGlpeoynxOifiJi6HL/NqX2dbiLdml+d56uew/s1T7K/iWcWtyzuHqkRXUQTdzdziq4KppKS9Bj5dG+oje6X81/jsPEec7zXq65jmmntGypTWmfQmDxSVEWrTIZHUMrDeCLgzYkcdE2VSy1cI5voEPTv6jGzqOQax9uSNNs11LZipdL0ViInRyIiIAiIgFJGXSvij1mHpbgtRyOZKqPwt4yTZFPS1RIxFCpuamy96vf/2CV5f1ZZi/ZHJK8u6yaoeV05iNh3nR7ivKqU9/kMPeD/tkiYjDrUpvTbzXVlbsZSD7jISzcyn1GISoTZD5L/Zbf3Gx7pNuDqhhabMNbnXwZM06rZ8qZRwL0Kr4eoLPTZ1bVbWptfsIsRyImtJ66R+j/wCWf2rDaK4sABlJ0VqqBYXPosBqB3iwOwERSuYeUy/V/I6obidAJ9/S0ffLSo8vIGSzicTRwoBJqOqm25b3du5Qx7p9UEADVqAGqcT0dZiDAg1q5FTF1BokrcrTXaUUnaTqueQA59flDEBFJJAABJJ2ADWSYBF/STigatOmPRRmPtNYfgM4wtNnL2VevrvV3MbIPqDUvuF++aCo7bBbmZit9VNmyV0ykXs89nMrGaGNpcG00J+0pt+8FnmUsB62v4Tfw9PQKsuplIIPAg3BkS1L2dNbWid8ObqJ899K+STQyjUe1krhaqm2q5AV+8MpPtCTjkHKC1KaVBsYDVwO8dxuJq56Zq08fQ6pjoVFJalVtco1rEEb1OwjsO0Cbt7MLWj5lgmdTj+j7KVJihwz1Nep6JDq3MHaPaAnaZgdGNRKq4rKCqgQhqeG0gxLg3VqhFwANRCgm522tYgd7mJkg4bA4eg4tUCFnB2hnYuy9xa3dPL6RMUFw7LvdqajuOkfwzsq9TRF5Emf+VNOsKSm6076X222juFvEyvLWpZ3jndI5dmmJjBMtJmI2nQdHuJKZRpDdUFVG7CjOP3kWThICzQv8vw1tvWDw0Wv7ryfZrwv8TJm/YrERLioREQBERAKTj+krI5r4QvTGlVonrFA2lbWdR7PlW3lBPWyvnNhsPqq1Bp/s1Gk/K6jZ32nL4npKF/0WGZhxqVVQ/dVW+M4qp1ps7ma3tIi1KmqX6c28p0lqVXqU0FBHN+qVtNVJ26JsLC+u27dqmuMAeJ90xtGtNmM1BO/zHztUBcNWYKwsKdRjqYbkJ4jYOOzbt4dcnjfc98yLgF4eOudRXS9oip6lpk/UcSDt2zPpjiJDuS84cRRAXSFRBsV7kgcA23xvPX/AKbvb6Jb/wCYbeGjNCzSZ3hokSviQBqka57Zf60HDUmuh+kqA6j9RTvHE93GedlLL9esCrNoIdqJcA8idpnk2ld5trUlkYdd6NWnhANgmwtMCXxKNl5QCVlpaWs8gHv5tZd+TvouT1TEX36J9YcuMk7B41WUEEMpFwwIII4gyDGebmTcuV8Of0T+Tvpt5SHu3d1pdjy9PZ+Cm8XV3ROYrCY6mIAkXp0hVAPKooTxFRlHgVPxnnZRz2xNQFU0aIO9bs33js7hLnmkqWGjsM786FoqUQhq7DyV2hB67fwG+RU7kkkkkkkknaSdpMO5JJYlmOskkkk8STtlkz3bpmiIUoreWO1odrRQpFjc7PjOEjps6Xo1wRqY9HsdGitR2NtVypRQe97+zJukC5OxdbDtp0Ham+q+idTAbmU6mHaJ32QOkFGIp4wLRfYKwv1Z+1fWnvHMTTiqUtGfLFN7O9iWKwIuDcHWCOEvl5QIiIBSR1njnmwZsNhG0SpK1K42g7CiHcRsLeHGe3n9l04bD2Q2rVSUQjaot5TjsGoc2EiXDiwlGW9dkXYo33ZlSlvOsnWSdZJ3knfMgUQHi8y7NRW0WjSjSgFYlNKUvAL1W5sNs2Bgn5e+a1KvosG22OydtkqglRQyEEH/AJYy7FM15KctVPg5P5A/Ae+Pm9+A98kEZIHCPmflLuCSrmoj45PfgPf+UsOTqnLxP5SRPmflHzPyjgkc1EcnJlTl4n8pYclVfq+J/KST8z8o+Z+UcEjmojM5Hq/V8T+UtORqv1fE/lJO+Z+UockDhHBI5qIwbI9T6vifynnOhBKnURqIkj5ZRKSF3IAHiTuA4mRzia2m7OdWkSbcOAlOWZnwW46qvJZLWa0oW3DWZnoYW+tvCVJFuzFRoFjc7OHGepSpgS5KYEuJhsaKMZqVheZKlSa7tIJOgzSzxfBsKVUtUwh9Ha1PmnEcV8Ne2ZMPXWoqujBkYAqwNwQRcEGfOji87voszgKOcBUbyG0mo39Fh5T0xyIuw5huM0Ysn8sz5Y/pErxETSZyGekbH9Zjmp38iiiKBu0iNNz+8o9mc+rSuWaxbFYljtNav7nYAeAEwaUw290zbC1KRnDyunNfSldKcHZn6yOsmDTlNKAbHWSheYNKU0oBnLzcyVlh8O+lTN1PnIdh/I855elKaUlNp7RDSa0yYc385qVcWBs++m1gw/McxOjRlOyfPauQQVJBGwgkEHiDunSZKz0xNKwe1ZR62pvvDb3iaIzL+jPWF+iZNCOrnDYHpDoH6QPTP1l0h4rf4T16WeeFP65B9ptH4y1XL9lbil6Oi6uU6uc7Vz0wq/rkP2TpfCeNj+kOiNVMPUPJdEeLW+EO5XshTT9Hb1HVds5bOLOmlQBBOlU3U1I0u/1RzM4TKueuJq3CEUUPqa2+8dncBOdCsxvrJO1jck8+cqvN/ktnD/o3Mr5XfEPp1Dq9FB5qjlxPOaSU2bkJtUsJvOszcSmBKG/bL0tdka9DCgTZVbS6Ws1pGzoqTMFSpLalSa7vIBV3mJjBMtgCVwuKNGrTrLqam6P91gSO8XHfLZhxC3FhtOodp2SV5IZ9IfKl9YeIlZ5fzW3Ee+Js2zJpEQ564E0MdXUiyu3WqeKv5RP39MezPJDSXukHNk4ukKlIf2ilcqNmmp86nfjquOYtquTIbViCVYFWBIKkEEEaiCDrBB3TPlnTL8d7kzXi8tvEqLS68XlsQC68peUiAVvKRKXgFYlhaW6fDXA2ZJS8KjHlMyYXjrk6I2YNLhrmRaDHlN+nhwJmVBHYGpSwgE2kpgS+I2SUiWs4EwPVkAzPUmu9SYneY2aAVZ5YTKEyl4BWUlIgCermfk04jG0adrorCo/AIhDa+RbRX2p41RwBJi6Ns3DhqJrVV0cRW0SVI1pTGtUPAm5J7QPRluOd0VZK1J2sSsTXoyCclnVmTQxl6g/QYj9qgBDcA6el26jz3TrIhpPsyU2vBA2VczcbhydKka1MfrKF3FuagaY8Lc54PXWJU6mGoqdRB4Ebp9LzVxeApVRarTp1BwemrfESmsK9FqzP2j5zFQR1gk71czcA23C0R9lNH8Npj/oNk/8AwyeNT+ac8D+TvnRBhqiWHErxHjJ/o5q4FfNwuHvxNFGPiwM9OjhKafRoifZRV+AkrB9kPP8AR894bJWJqfR4eu994o1NH71rTcq5rY1fOw9f2aZb3reT/EnhRzzP4Pnr5jxA24bEd9Cr/LK/N9VdRo1RyNGoP4T6EiTxL5HM/g+e2pOouyOo4tTcD3iWjEqN4HfPoa0tZAdoBHZOXh+yVn+j5+XFLxHjL/lA4yd6mBpN51Om3ain4iazZAwh24bDntoUv5Y4Psnn+iD2xQmN8UJNrZq4E7cLh+6kg+AmF8zcAduGpDsBHwMjgfyTzr4ISfETG1aTY2Y2Tz/d07nqD4NMZzAyd/h/9av/ADyOBjnRChqSnWCTV/V9k79gf+9iP54/q+yd+w/1q/8APHCxzyQn1glDUEnJcxcnD+7Ke16p+LTYpZo4BdmEw5+1SRvxXk8D+SOdEBnEDZcX4Xnr5OzaxtcjqsPU0T6br1a9t2tfuvJ5w2ApU/oqdOn9imq/ATZnSwr2yHnfpHAZqdHiUGWviitesLFUUHqkbjr1uRuJAHK9jO/iJbMqVpFNU6e2ViInRAiIgFIiIAiViAUiViAUiIgFYiJAEREkCIiQCkSsSQIiIAiIgFIlYgCIiAIiIAiIgH//2Q==" doesn’t work

Tried it with the inspector on in Chrome and it’s an image/png binary that was sent for me. I copied the request as curl, which is sent to /api/v1/users/me/avatar/pick and it has this argument:

--data-raw $'------WebKitFormBoundarykvzARD2o9iW83dtj\r\nContent-Disposition: form-data; name="avatarfile"; filename="Screen Shot 2021-06-03 at 3.12.48 PM.png"\r\nContent-Type: image/png\r\n\r\n\r\n------WebKitFormBoundarykvzARD2o9iW83dtj--\r\n' \

1 « J'aime »

Thank you!

1 « J'aime »

I ended up giving up and just using the python library for peertube because all it needs is a path to the avatar file instead of whatever encoding of the file the api is looking for.

Unfortunately it doesn’t support the channel banner so I’ve been trying again. Multiple different libraries to generate the formdata, multiple different libraries to post the data, after slaying a gamut of 400,401,403, and 413 errors. 500 no multipart boundary seems unassailable.

Does anyone have a working sample of javascript code that can successfully update a user avatar, channel avatar, or channel banner? or advice on which libraries should work?

All the other API calls have been easy to get working in multiple languages, POST with image data has eaten more time than everything else combined.

Finally got it working with tiny-json-http

tiny.post({
    url: url,
    headers: {
        'Content-Type': 'multipart/form-data',
        'Authorization': 'Bearer ' + bearerToken
    },
    data: { bannerfile: fs.createReadStream('/tmp/banner.jpg') }
},
    function _post(err, form) {
        if (err) { console.log(err) }
        else { console.log(form) }
    })
1 « J'aime »