Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Headphones: Albums added as None #1184

Closed
goku-son opened this issue Feb 24, 2017 · 33 comments
Closed

Headphones: Albums added as None #1184

goku-son opened this issue Feb 24, 2017 · 33 comments

Comments

@goku-son
Copy link

Ombi Version:

2.1.1336

Update Branch:

Stable

Media Sever:

Plex

Media Server Version:

Not applicable

Operating System:

Windows 7 x64

Mono Version (only if your not on windows)

(Place text here)

Applicable Logs (from /logs/ directory or the Admin page):


Ombi Log:
System.Xml.XmlException: '>' is an unexpected token. The expected token is '"' or '''. Line 1, position 55. at System.Xml.XmlTextReaderImpl.Throw(Exception e) at System.Xml.XmlTextReaderImpl.DtdParserProxy.System.Xml.IDtdParserAdapter.Throw(Exception e) at System.Xml.DtdParser.Throw(Int32 curPos, String res, String[] args) at System.Xml.DtdParser.ThrowUnexpectedToken(Int32 pos, String expectedToken1, String expectedToken2) at System.Xml.DtdParser.ParseExternalId(Token idTokenType, Token declType, String& publicId, String& systemId) at System.Xml.DtdParser.ParseInDocumentDtd(Boolean saveInternalSubset) at System.Xml.DtdParser.Parse(Boolean saveInternalSubset) at System.Xml.DtdParser.System.Xml.IDtdParser.ParseInternalDtd(IDtdParserAdapter adapter, Boolean saveInternalSubset) at System.Xml.XmlTextReaderImpl.ParseDtd() at System.Xml.XmlTextReaderImpl.ParseDoctypeDecl() at System.Xml.XmlTextReaderImpl.ParseDocumentContent() at System.Xml.XmlTextReaderImpl.Read() at System.Xml.Linq.XDocument.Load(XmlReader reader, LoadOptions options) at System.Xml.Linq.XDocument.Parse(String text, LoadOptions options) at RestSharp.Deserializers.XmlDeserializer.Deserialize[T](IRestResponse response) at RestSharp.RestClient.Deserialize[T](IRestRequest request, IRestResponse raw)
Ombi.Api.ApiRequest	Error

Headphones log:
2017-02-23 23:18:47	INFO	Searching for "None - None" since it was marked as wanted
2017-02-23 23:18:47	INFO	Searching for wanted albums
2017-02-23 23:18:47	INFO	Recieved API command: queueAlbum

Problem Description:

When requesting an album, it says it is successful, but produces the above error in the Ombi log and searches for an album called "none - none" as shown in the Headphone log. I am left with an album in the wanted list that has none for all the fields.

Reproduction Steps:

Request an album.

@Ombi-robot
Copy link

Hi!
Thanks for the issue report. Before a real human comes by, please make sure you used our bug report format.
Before posting make sure you also read our FAQ and known issues.
Make the title describe your issue. Having "not working" or "I get this bug" for 100 issues, isn't really helpful.
If we need more information or there is some progress we tag the issue or update the tag and keep you updated.
Cheers!
Ombi Support Team

@goku-son
Copy link
Author

Thanks @smcpeck. Pardon my ignorance in these matters but does this mean I can pull down the latest code from git and this fix is included? Thanks in advance.

@smcpeck
Copy link
Contributor

smcpeck commented Feb 25, 2017

@almontef - It hasn't been merged into actual dev or EAP branch yet. If you're really itching for it, you could grab the build from my personal fork and upgrade manually. It is basically the latest EAP + this change.

https://ci.appveyor.com/api/buildjobs/e9c5769a33x33n20/artifacts/Ombi.zip

@smcpeck
Copy link
Contributor

smcpeck commented Feb 26, 2017

In EAP now.

@goku-son
Copy link
Author

Thanks!!! I'll pull down your fork until it is merged. As this is my first time updating, I was wondering what files I need to keep to preserve my configuration and previous requests? Or will I have to start from the beginning again? Not a big deal if I do, but would rather save myself from having to reconfigure if I could avoid it.

Thanks in advance.

@smcpeck
Copy link
Contributor

smcpeck commented Feb 26, 2017

If you set your Code Branch to "Early Access Preview" and update you installation, you should get the change in your upgrade.

@smcpeck
Copy link
Contributor

smcpeck commented Feb 26, 2017

This is now in EAP.

@goku-son
Copy link
Author

Great, the EAP fixed the issue. Not sure if this should be logged as a separate issue, but I noticed that when a album is requested, it takes a while to process (headphones side) and the request in Ombi generates an error (request failed). However, the request does get logged as successful in Ombi and the album gets searched and snatched in headphones. I am by no means a coder, but it could be that since headphones is taking so long to process the request Ombi times out thinking it must have failed when indeed it has not. Maybe increasing how long Ombi waits to deem the request failed would workaround the longer processing time of headphones when a request is made. Thanks in advance for any ideas or comments.

@smcpeck
Copy link
Contributor

smcpeck commented Feb 27, 2017

@almontef Can you create a new issue and provide Ombi logs that shows the error?

@goku-son
Copy link
Author

I will open up a separate issue for the timeout stuff thanks. I thought this original issue resolved itself but when I tried requesting an album, I see the same issue with an album getting placed on the wanted page with none for all fields. I am running 2.1.1469 of Ombi now. Here are the logs from the latest album request.

Headphones log:*****************
2017-02-26 16:35:07 INFO Recieved API command: queueAlbum
2017-02-26 16:35:05 INFO Searching for "None - None" since it was marked as wanted
2017-02-26 16:35:05 INFO Searching for wanted albums
2017-02-26 16:35:05 INFO Recieved API command: queueAlbum
2017-02-26 16:35:03 INFO Searching for "None - None" since it was marked as wanted
2017-02-26 16:35:03 INFO Searching for wanted albums
2017-02-26 16:35:03 INFO Recieved API command: queueAlbum
2017-02-26 16:35:01 INFO Searching for "None - None" since it was marked as wanted
2017-02-26 16:35:01 INFO Searching for wanted albums
2017-02-26 16:35:01 INFO Recieved API command: queueAlbum
2017-02-26 16:34:59 INFO Searching for "None - None" since it was marked as wanted
2017-02-26 16:34:59 INFO Searching for wanted albums
2017-02-26 16:34:59 INFO Recieved API command: queueAlbum
2017-02-26 16:34:57 INFO Searching for "None - None" since it was marked as wanted
2017-02-26 16:34:57 INFO Searching for wanted albums
2017-02-26 16:34:57 INFO Recieved API command: queueAlbum
2017-02-26 16:34:55 INFO Searching for "None - None" since it was marked as wanted
2017-02-26 16:34:55 INFO Searching for wanted albums
2017-02-26 16:34:55 INFO Recieved API command: queueAlbum
2017-02-26 16:34:53 INFO Searching for "None - None" since it was marked as wanted
2017-02-26 16:34:53 INFO Searching for wanted albums
2017-02-26 16:34:53 INFO Recieved API command: queueAlbum
2017-02-26 16:34:51 INFO Searching for "None - None" since it was marked as wanted
2017-02-26 16:34:51 INFO Searching for wanted albums
2017-02-26 16:34:51 INFO Recieved API command: queueAlbum


Ombi log:******************************

System.Xml.XmlException: '&' is an unexpected token. The expected token is ';'. Line 1, position 246. at System.Xml.XmlTextReaderImpl.Throw(Exception e) at System.Xml.XmlTextReaderImpl.Throw(String res, String[] args) at System.Xml.XmlTextReaderImpl.ThrowUnexpectedToken(String expectedToken1, String expectedToken2) at System.Xml.XmlTextReaderImpl.ThrowUnexpectedToken(Int32 pos, String expectedToken1, String expectedToken2) at System.Xml.XmlTextReaderImpl.HandleEntityReference(Boolean isInAttributeValue, EntityExpandType expandType, Int32& charRefEndPos) at System.Xml.XmlTextReaderImpl.ParseText(Int32& startPos, Int32& endPos, Int32& outOrChars) at System.Xml.XmlTextReaderImpl.FinishPartialValue() at System.Xml.XmlTextReaderImpl.get_Value() at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r) at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r, LoadOptions o) at System.Xml.Linq.XDocument.Load(XmlReader reader, LoadOptions options) at System.Xml.Linq.XDocument.Parse(String text, LoadOptions options) at RestSharp.Deserializers.XmlDeserializer.Deserialize[T](IRestResponse response) at RestSharp.RestClient.Deserialize[T](IRestRequest request, IRestResponse raw) Ombi.Api.ApiRequest Error 2/26/2017 4:32:03 PM
Analytics tracking failed Ombi.Helpers.Analytics.Analytics Error 2/26/2017 4:32:02 PM
System.Xml.XmlException: '&' is an unexpected token. The expected token is ';'. Line 1, position 246. at System.Xml.XmlTextReaderImpl.Throw(Exception e) at System.Xml.XmlTextReaderImpl.Throw(String res, String[] args) at System.Xml.XmlTextReaderImpl.ThrowUnexpectedToken(String expectedToken1, String expectedToken2) at System.Xml.XmlTextReaderImpl.ThrowUnexpectedToken(Int32 pos, String expectedToken1, String expectedToken2) at System.Xml.XmlTextReaderImpl.HandleEntityReference(Boolean isInAttributeValue, EntityExpandType expandType, Int32& charRefEndPos) at System.Xml.XmlTextReaderImpl.ParseText(Int32& startPos, Int32& endPos, Int32& outOrChars) at System.Xml.XmlTextReaderImpl.FinishPartialValue() at System.Xml.XmlTextReaderImpl.get_Value() at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r) at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r, LoadOptions o) at System.Xml.Linq.XDocument.Load(XmlReader reader, LoadOptions options) at System.Xml.Linq.XDocument.Parse(String text, LoadOptions options) at RestSharp.Deserializers.XmlDeserializer.Deserialize[T](IRestResponse response) at RestSharp.RestClient.Deserialize[T](IRestRequest request, IRestResponse raw) Ombi.Api.ApiRequest Error 2/26/2017 4:31:29 PM
System.Xml.XmlException: '&' is an unexpected token. The expected token is ';'. Line 1, position 246. at System.Xml.XmlTextReaderImpl.Throw(Exception e) at System.Xml.XmlTextReaderImpl.Throw(String res, String[] args) at System.Xml.XmlTextReaderImpl.ThrowUnexpectedToken(String expectedToken1, String expectedToken2) at System.Xml.XmlTextReaderImpl.ThrowUnexpectedToken(Int32 pos, String expectedToken1, String expectedToken2) at System.Xml.XmlTextReaderImpl.HandleEntityReference(Boolean isInAttributeValue, EntityExpandType expandType, Int32& charRefEndPos) at System.Xml.XmlTextReaderImpl.ParseText(Int32& startPos, Int32& endPos, Int32& outOrChars) at System.Xml.XmlTextReaderImpl.FinishPartialValue() at System.Xml.XmlTextReaderImpl.get_Value() at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r) at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r, LoadOptions o) at System.Xml.Linq.XDocument.Load(XmlReader reader, LoadOptions options) at System.Xml.Linq.XDocument.Parse(String text, LoadOptions options) at RestSharp.Deserializers.XmlDeserializer.Deserialize[T](IRestResponse response) at RestSharp.RestClient.Deserialize[T](IRestRequest request, IRestResponse raw) Ombi.Api.ApiRequest Error 2/26/2017 4:31:29 PM
System.Xml.XmlException: '&' is an unexpected token. The expected token is ';'. Line 1, position 246. at System.Xml.XmlTextReaderImpl.Throw(Exception e) at System.Xml.XmlTextReaderImpl.Throw(String res, String[] args) at System.Xml.XmlTextReaderImpl.ThrowUnexpectedToken(String expectedToken1, String expectedToken2) at System.Xml.XmlTextReaderImpl.ThrowUnexpectedToken(Int32 pos, String expectedToken1, String expectedToken2) at System.Xml.XmlTextReaderImpl.HandleEntityReference(Boolean isInAttributeValue, EntityExpandType expandType, Int32& charRefEndPos) at System.Xml.XmlTextReaderImpl.ParseText(Int32& startPos, Int32& endPos, Int32& outOrChars) at System.Xml.XmlTextReaderImpl.FinishPartialValue() at System.Xml.XmlTextReaderImpl.get_Value() at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r) at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r, LoadOptions o) at System.Xml.Linq.XDocument.Load(XmlReader reader, LoadOptions options) at System.Xml.Linq.XDocument.Parse(String text, LoadOptions options) at RestSharp.Deserializers.XmlDeserializer.Deserialize[T](IRestResponse response) at RestSharp.RestClient.Deserialize[T](IRestRequest request, IRestResponse raw) Ombi.Api.ApiRequest Error 2/26/2017 4:31:29 PM
System.Xml.XmlException: '>' is an unexpected token. The expected token is '"' or '''. Line 1, position 55. at System.Xml.XmlTextReaderImpl.Throw(Exception e) at System.Xml.XmlTextReaderImpl.DtdParserProxy.System.Xml.IDtdParserAdapter.Throw(Exception e) at System.Xml.DtdParser.Throw(Int32 curPos, String res, String[] args) at System.Xml.DtdParser.ThrowUnexpectedToken(Int32 pos, String expectedToken1, String expectedToken2) at System.Xml.DtdParser.ParseExternalId(Token idTokenType, Token declType, String& publicId, String& systemId) at System.Xml.DtdParser.ParseInDocumentDtd(Boolean saveInternalSubset) at System.Xml.DtdParser.Parse(Boolean saveInternalSubset) at System.Xml.DtdParser.System.Xml.IDtdParser.ParseInternalDtd(IDtdParserAdapter adapter, Boolean saveInternalSubset) at System.Xml.XmlTextReaderImpl.ParseDtd() at System.Xml.XmlTextReaderImpl.ParseDoctypeDecl() at System.Xml.XmlTextReaderImpl.ParseDocumentContent() at System.Xml.XmlTextReaderImpl.Read() at System.Xml.Linq.XDocument.Load(XmlReader reader, LoadOptions options) at System.Xml.Linq.XDocument.Parse(String text, LoadOptions options) at RestSharp.Deserializers.XmlDeserializer.Deserialize[T](IRestResponse response) at RestSharp.RestClient.Deserialize[T](IRestRequest request, IRestResponse raw) Ombi.Api.ApiRequest Error 2/26/2017 4:31:29 PM
System.Xml.XmlException: '&' is an unexpected token. The expected token is ';'. Line 1, position 246. at System.Xml.XmlTextReaderImpl.Throw(Exception e) at System.Xml.XmlTextReaderImpl.Throw(String res, String[] args) at System.Xml.XmlTextReaderImpl.ThrowUnexpectedToken(String expectedToken1, String expectedToken2) at System.Xml.XmlTextReaderImpl.ThrowUnexpectedToken(Int32 pos, String expectedToken1, String expectedToken2) at System.Xml.XmlTextReaderImpl.HandleEntityReference(Boolean isInAttributeValue, EntityExpandType expandType, Int32& charRefEndPos) at System.Xml.XmlTextReaderImpl.ParseText(Int32& startPos, Int32& endPos, Int32& outOrChars) at System.Xml.XmlTextReaderImpl.FinishPartialValue() at System.Xml.XmlTextReaderImpl.get_Value() at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r) at System.Xml.Linq.XContainer.ReadContentFrom(XmlReader r, LoadOptions o) at System.Xml.Linq.XDocument.Load(XmlReader reader, LoadOptions options) at System.Xml.Linq.XDocument.Parse(String text, LoadOptions options) at RestSharp.Deserializers.XmlDeserializer.Deserialize[T](IRestResponse response) at RestSharp.RestClient.Deserialize[T](IRestRequest request, IRestResponse raw)

@smcpeck
Copy link
Contributor

smcpeck commented Feb 27, 2017

What version of Headphones are you on? I'll poke around a bit more tonight and try to reproduce this locally and get some better error handling around things.

@goku-son
Copy link
Author

Thanks @smcpeck the headphones log says I am up to date and the footer on web interface says: version: a0fa658956d82c59f5336e38cfd444c96728faa4
I could not locate a reference to the installed version elsewhere. Hope this helps.

@smcpeck
Copy link
Contributor

smcpeck commented Mar 1, 2017

@almontef I have a pull request [ #1199 ] out there that fixes this once & for all. I suspect that Jamie will merge it into EAP at some point in the morning.

Album requests for new artists take a while because HeadPhones pulls down a bunch of album information for the artists before notifying us that the artist is available.

Adding an album for an artist who already exists in your library is just as fast as requesting movies and TV shows.

@Magikarplvl4
Copy link
Contributor

The Pull request has been merged into the EAP branch. Can you upgrade to the last EAP branch and check it out?

@goku-son
Copy link
Author

goku-son commented Mar 1, 2017

So I went ahead and updated to the EAP, so now running Ombi 2.1.1482. When I request an album, it does come back much quicker than before. However, I still see the same end results in that albums are getting added as "None" within HeadPhones.

The Ombi logs now show a different error when I recreate:

Analytics tracking failed Ombi.Helpers.Analytics.Analytics Error 3/1/2017 12:39:26 PM
Analytics tracking failed Ombi.Helpers.Analytics.Analytics Error 3/1/2017 12:39:16 PM

The Headphones log show the following:

2017-03-01 12:40:47 ERROR Last.FM returned an error: Album not found
2017-03-01 12:40:47 ERROR Last.FM returned an error: Album not found
2017-03-01 12:40:46 ERROR Last.FM returned an error: Album not found
2017-03-01 12:40:45 ERROR Last.FM returned an error: Album not found
2017-03-01 12:40:44 ERROR Last.FM returned an error: Album not found
2017-03-01 12:40:43 ERROR Last.FM returned an error: Album not found
2017-03-01 12:40:42 ERROR Last.FM returned an error: Album not found
2017-03-01 12:40:42 ERROR Last.FM returned an error: Album not found
2017-03-01 12:39:45 INFO Searching for "None - None" since it was marked as wanted
2017-03-01 12:39:45 INFO Searching for wanted albums
2017-03-01 12:39:45 INFO Recieved API command: queueAlbum
2017-03-01 12:39:45 INFO Release 4c6f6712-1ca0-46c9-9484-f24bc1ef83f5 already exists in the database!
2017-03-01 12:39:45 INFO Recieved API command: addAlbum
2017-03-01 12:39:45 INFO Updating complete for: Norah Jones

Note the message in the headphones logs about the item already existing in the database. I deleted the headphones DB and just kept my settings, but I still get the same messages no matter what I add through Ombi and the end result is a item on the wanted list with "None" for all the fields.

I am running headphones Version: a0fa658956d82c59f5336e38cfd444c96728faa4.

If there is anything else I could provide please let me know.

@smcpeck
Copy link
Contributor

smcpeck commented Mar 1, 2017

@almontef Are you sure there are no other "None - None" albums left hanging around? I had to go into HP, ignore all of those, and then I deleted them so they would stop getting triggered by HP.

It looks, to me, like HP piggybacks off of queueAlbum command that we send and starts a search for other "wanted albums."

If you look in the log you posted, it looks like that is happening here:

2017-03-01 12:39:45	INFO	Searching for "None - None" since it was marked as wanted
2017-03-01 12:39:45	INFO	Searching for wanted albums

The "searching for wanted albums" thing makes me think this isn't related to the specific album request you sent via Ombi.

@goku-son
Copy link
Author

goku-son commented Mar 1, 2017

@smcpeck I thought that removing the HP db should have removed them but appears not to be the case. Right now, I got 5 of these "None - None" albums setting in the "Wanted Albums" view from my Ombi tests. I can select them and choose ignore, which removes them from the wanted list, but how do I actually delete them? I don't see an option to delete them from the drop-down menu.

As long as I can keep my configuration, I am happy to blow away anything within HP that will reset me back to a "clean" state. I thought only the headphones.db would need to be deleted but it appears that maybe there is album information stored somewhere else.

Thanks for all your help with this!

@smcpeck
Copy link
Contributor

smcpeck commented Mar 1, 2017

The HP interface leaves some things to be desired for album deletion. If you go to "manage albums" and then select your ignored albums (now that you moved them there), you can then click into each album and there is a delete button available from the view of the individual album.

@tidusjar
Copy link
Member

tidusjar commented Mar 1, 2017

@smcpeck it seems that users are reporting that when searching for an album they are just getting a spinning circle now, any idea why?

@smcpeck
Copy link
Contributor

smcpeck commented Mar 1, 2017

@tidusjar If the artist does not exist in HP yet, it will take about 10 seconds for that happen. If it is an existing artist, it should add quickly like movies and tv shows do.

@goku-son
Copy link
Author

goku-son commented Mar 1, 2017

I went ahead and removed all the artist and albums since this is a pretty new install. Nothing shows up in the wanted list, etc. I then went ahead and requested another search from Ombi for a specific album and it basically triggered a search for all albums by the artist. In managed albums I see 10 entries. One of them is the album I requested with a status of skipped. Another 7 are legit albums which show skipped as I would expect, but then the last two are again "none - none" with one of them showing as wanted.

Same string of messages in HP logs:
2017-03-01 14:51:42 INFO Searching for "None - None" since it was marked as wanted
2017-03-01 14:51:42 INFO Searching for wanted albums
2017-03-01 14:51:42 INFO Recieved API command: queueAlbum
2017-03-01 14:51:42 INFO Release 4c6f6712-1ca0-46c9-9484-f24bc1ef83f5 already exists in the database!
2017-03-01 14:51:42 INFO Recieved API command: addAlbum

Note the object ID is the previous one I posted so even though I deleted both the album and artist this ID is being referenced elsewhere.

Some questions or things to consider based on this run:

Why is it searching for multiple albums?

Why is it placing the album (the one with none - none) as wanted but the actual album as skipped?

Besides deleting the headphones.db is there anywhere else where album references may reside?

@smcpeck
Copy link
Contributor

smcpeck commented Mar 1, 2017

Thanks for this. I will take this info and look at some more things.

Currently, we add the artist first. On the HP side, it queries for everything about the artist -- that's why it loads all albums. Once that is done, we queue the album up.

The issue in your specific use case is that the album you added from Ombi is a "2012 Digital Remaster" version of the album. HP doesn't grab all the alternate releases for every album when loading up information about an artist. So this album didn't exist for HP and resulted in a "None - None." Situation.

Honestly, this really feels like an HP issue. I may try to go fix the issue on their end instead of working around it in Ombi.

@goku-son
Copy link
Author

goku-son commented Mar 1, 2017

I too think that it seems more like an HP issue. I'll keep using HP natively for now, but if you need me to test anything on HP or Ombi going forward, do let me know.

Thanks again for all your efforts on this issue.

@Magikarplvl4
Copy link
Contributor

Guys @smcpeck @almontef are you agree that i close this one?

@ghost
Copy link

ghost commented Mar 14, 2017

I am still having this issue running ombi Version: 2.1.1527 and HP Version: debc65db5de0ba0cea9f67381c7a7732ddc7d70b. Anytime I request an album it shows listed in HP wanted as "None". Is there a way to fix this?

@Magikarplvl4
Copy link
Contributor

Nope, its a hp issue and not a Ombi issue.

@AdeHub
Copy link

AdeHub commented Mar 29, 2017

Don't know what's being passed but the queueAlbum needs the MusicBrainz Release Group ID and not the Release ID

@Magikarplvl4
Copy link
Contributor

@smcpeck Do you have time to at this one?

@JohanPotgieter
Copy link

I have the same issue. Please can we try and sort this out between Ombi and HP.

@tidusjar
Copy link
Member

Hi @JohanPotgieter I'm very busy at the moment. But feel free to submit a pull request.

@Magikarplvl4
Copy link
Contributor

Can we consider to drop hp support?

@tidusjar
Copy link
Member

@PotatoQuality it will not be in the initial release of the rewrite. If enough people request it then I'll add it back. But Headphones has been a massive pain.

@Magikarplvl4
Copy link
Contributor

@tidusjar, I know :( that is why I'm asking :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

7 participants