Mass Repost / Like - Every User a different track

Discussions to do with Soundcloud Manager. Do not use for support, use the dedicated support forum for help requests
Post Reply
BrianS
Posts: 5
Joined: Tue Feb 27, 2018 8:58 pm

Mass Repost / Like - Every User a different track

Post by BrianS »

Hello guys,

it's my first post but I'm using SCM for a while now :)

I'm having some troubles finding the best way to manage natural looking repost / likes for 40 accounts.

The plan is, that every single account of the 40 should repost and like a different track with the same filter applied. Mostly I'm aiming on new tracks of big artists.

My idea was first to use the "Search and Repost" function, select the 40 accounts, set the filter to "min 10.000 plays / 100 likes / active the last 10 days / pro account) leave the "Track search [opt]" blank and set the "Share Accros Accs" to 1, so only one thread will work on all the 40 accounts (Yes, will take some time but I didn't found a other way that every account will repost a different track until now...)

But I was always getting this error message:
FAILED active filter as no logged actions of profile can be found
FAILED: User active filter

The result, no track was reposted or liked...

Then I've cleared the filter and tried to use the "Build Custom Search" function with the setting "Followings of" -> "Latest track of" with my own test user who is following all the important big channels. That worked for the reposts, but I've also checked "Like track" but that didn't work. So the users only reposted the tracks but not liked them.

I hope you understand my problem and maybe someone can help me out or show me an easier way :P

Cheers
support@rootjazz
Posts: 2317
Joined: Tue Feb 02, 2016 1:58 pm

Re: Mass Repost / Like - Every User a different track

Post by support@rootjazz »

The plan is, that every single account of the 40 should repost and like a different track with the same filter applied. Mostly I'm aiming on new tracks of big artists.
I am not sure, if this is possible. Same filter applied but different tracks? Can you please rephrase easily what you want?
Yes, will take some time but I didn't found a other way that every account will repost a different track until now...)
This is obvious. Same filter will return same data for every account. You could try global processed log but that will not help i guess if your aim is to use 1 filter for all 40 accounts. You should use different filter to reach different users.
But I was always getting this error message:
FAILED active filter as no logged actions of profile can be found
FAILED: User active filter
Can you please send me step by step guide on how you are creating the filter?
Step bys tep instruction or screenshot perhaps.....
Also, atatch the real time log that can be found if you double click in the processing action in processor tab

Actually these much log is not helpful to understand all of your workaround.

Then I've cleared the filter and tried to use the "Build Custom Search" function with the setting "Followings of" -> "Latest track of" with my own test user who is following all the important big channels. That worked for the reposts,
Glad that helped and YES. It should work that way. The build was correct.
but I've also checked "Like track" but that didn't work. So the users only reposted the tracks but not liked them.


Code: Select all

Get user details: https://soundcloud.com/akulanski52: a k ulanski52
Like track: https://soundcloud.com/savvybleu/i-fall-apart
Like before: https://soundcloud.com/savvybleu/i-fall-apart
Made: 0 of limit: 80: action: Like: using: a k ulanski52
Get page: https://soundcloud.com/savvybleu/i-fall-apart
Search: mytracklikesids un: a k ulanski52
Auth required
Auth from headers
Search: mytracklikesids: https://api.soundcloud.com/e1/me/track_likes/ids?linked_partitioning=1&limit=5000&client_id=t1bENsvPdW8kenrvrhDawQN2M1kJgN6V&app_version=1519724940
Get track ID: https://soundcloud.com/savvybleu/i-fall-apart
Scraping track details :https://soundcloud.com/savvybleu/i-fall-apart
Extract JSON:https://soundcloud.com/savvybleu/i-fall-apart
Parse JSON:https://soundcloud.com/savvybleu/i-fall-apart
Get track ID: https://soundcloud.com/savvybleu/i-fall-apart
Scraping track details :https://soundcloud.com/savvybleu/i-fall-apart
Extract JSON:https://soundcloud.com/savvybleu/i-fall-apart
Parse JSON:https://soundcloud.com/savvybleu/i-fall-apart
Track ID: 406395339
Get User ID: https://soundcloud.com/akulanski52
Resolve Url: 'https://soundcloud.com/akulanski52' to ID
Got ID: 387762896for: https://soundcloud.com/akulanski52
* SUCCESS: Like: https://soundcloud.com/savvybleu/i-fall-apart with: a k ulanski52
* SUCCESS: Like before: https://soundcloud.com/savvybleu/i-fall-apart
Attempt to Repost: https://soundcloud.com/savvybleu/i-fall-apart with: a k ulanski52
Reposting: https://soundcloud.com/savvybleu/i-fall-apart with: a k ulanski52
Made: 0 of limit: 80: action: Repost: using: a k ulanski52
Get track ID: https://soundcloud.com/savvybleu/i-fall-apart
Scraping track details :https://soundcloud.com/savvybleu/i-fall-apart
Extract JSON:https://soundcloud.com/savvybleu/i-fall-apart
Parse JSON:https://soundcloud.com/savvybleu/i-fall-apart
Auth from storage
* SUCCESS: Total Reposted: 1: a k ulanski52
a k ulanski52: That's enough, we can stop now...
Processed: a k ulanski52: 1
Started: 28/02/2018 01:25 AM
Finished: 28/02/2018 01:26 AM
ID: 5dec2a73-9378-4766-86ec-297c2b2542fd
Action ran for: 0hr:1min:22s

After replicating the issue, i found the bot liked before the repost in repost track tab in SCM.

Did you check the like before repost in SCM repost track tab? I did so.

I hope you understand my problem and maybe someone can help me out or show me an easier way :P

Cheers
We're here to help you always. Please continue the discussion accordingly that we can sort things out. :)
BrianS
Posts: 5
Joined: Tue Feb 27, 2018 8:58 pm

Re: Mass Repost / Like - Every User a different track

Post by BrianS »

I am not sure, if this is possible. Same filter applied but different tracks? Can you please rephrase easily what you want?
Yes, I thought the filter on the Repost tab will be a "global" filter for all reposts.
Here is how I've set it up:

1.) I've opened the repost tab in SCM
Image

2.) The I've opened the Filter option and set it up like this:
Image

3.) Now I set up the other options, "Max 30 reposts" because each of the 30 accounts should repost 1 track (It should be a different track for each account, not the same), therefore I'v also set "Share Across Accs" to 1, so not every of the 30 account's will repost 30 tracks. I also want that every user should like the track it's reposting. To don't overdo it I've set up the time between 100 and 200 seconds. And to start the repost job, I've set the Date added to "last week" and the track length to "2-10 min"
Image

That should be the final result:
30 different User Accounts, 1 User Account should repost 1 track (It should be a different track for every user), it should be a track that was added last week, 2-10 minutes long, min. 10.000 plays, 100 likes, pro account and the user should also like the reposted track.


Here is a summary of the log file:

Code: Select all

12:08:17: Starting: 28.02.2018 12:08 
12:08:17: Get accounts: 30
12:08:17: Randomise account order: 
12:08:17: Max items for action: 30
12:08:17: Login: Anna:A*********
12:08:17: loaded: 16 cookies
12:08:17: Attempting automatic cookie login: Anna Proxy: 10********
12:08:18: Cookie login successful: Anna Proxy: 10********* 
12:08:18: Setup auth
12:08:18: * SUCCESS: Setup auth
12:08:18: Reloaded from cookies: Anna
12:08:18: Get user details: https://soundcloud.com/user*********: Anna
12:08:19: Search: ::last_week
12:08:19: Filter set
12:08:19: Searching: , , last_week, medium
12:08:21: Process:  Proxy: 10*********  https://api-v2.soundcloud.com/search/tracks?q=&user_id=944407-333250-542430-418341&offset=#OFFSET#&facet=genre&limit=20linked_partitioning=1&client_id=t1bENsvPdW8kenrvrhDawQN2M1kJgN6V&app_version=1519814616&filter.created_at=last_week&filter.duration=medium
12:08:21: Scraping: https://api-v2.soundcloud.com/search/tracks?q=&user_id=944407-333250-542430-418341&offset=0&facet=genre&limit=20linked_partitioning=1&client_id=t1bENsvPdW8kenrvrhDawQN2M1kJgN6V&app_version=1519814616&filter.created_at=last_week&filter.duration=medium Proxy: 10********* 
12:08:22: Got page: https://api-v2.soundcloud.com/search/tracks?q=&user_id=944407-333250-542430-418341&offset=0&facet=genre&limit=20linked_partitioning=1&client_id=t1bENsvPdW8kenrvrhDawQN2M1kJgN6V&app_version=1519814616&filter.created_at=last_week&filter.duration=medium
12:08:23: Checking filter: https://soundcloud.com/scumgang6ix9ine/rondo-feat-tory-lanez-young-thug
12:08:23: Num plays total: 2370534 (10000-0)
12:08:23: Num comments total: 270 (0-0)
12:08:23: Num favs total: 75226 (100-0)
12:08:23: Num days posted ago: 5 (0-0)
12:08:24: Check is active: https://soundcloud.com/scumgang6ix9ine/
12:08:24: Scrape stream: https://soundcloud.com/scumgang6ix9ine/
12:08:26: No more items found
12:08:26: Got stream items :0
12:08:26: Search: V2TracksLikedByUser un: 
12:08:26: Get User ID: https://soundcloud.com/scumgang6ix9ine/
12:08:26: Resolve Url: 'https://soundcloud.com/scumgang6ix9ine/' to ID
12:08:27: Got ID: 307809061for: https://soundcloud.com/scumgang6ix9ine/
12:08:27: Search: V2TracksLikedByUser: https://api-v2.soundcloud.com/users/307809061/likes?limit=50&linked_partitioning=1&client_id=t1bENsvPdW8kenrvrhDawQN2M1kJgN6V&app_version=1519814616
12:08:27: Got liked items
12:08:27: Auth from headers
12:08:29: Found: Commented on: 0
12:08:29: Got commented items
12:08:29: Search: V2TracksRepostedByAUser un: 
12:08:29: Get User ID: https://soundcloud.com/scumgang6ix9ine/
12:08:29: Resolve Url: 'https://soundcloud.com/scumgang6ix9ine/' to ID
12:08:30: Got ID: 307809061for: https://soundcloud.com/scumgang6ix9ine/
12:08:30: Search: V2TracksRepostedByAUser: https://api-v2.soundcloud.com/stream/users/307809061/reposts?limit=50&client_id=t1bENsvPdW8kenrvrhDawQN2M1kJgN6V&app_version=1519814616
12:08:30: Got reposted items
12:08:30: * FAILED active filter as no logged actions of profile can be found
12:08:30: * FAILED: User active filter
12:08:30: * IGNORE: Failed Filter: https://soundcloud.com/scumgang6ix9ine/rondo-feat-tory-lanez-young-thug
After replicating the issue, i found the bot liked before the repost in repost track tab in SCM.

Did you check the like before repost in SCM repost track tab? I did so.
I don't have a "like before repost" function in the tab, only "Like track" and yes, that's checked.

Here is a screenshot how I've set up the Custom Build Search: (I've set it to 5 Max Repost this time because it's a test)

Image

Image

With the build the random repost of different tracks pro user works, but the user don't like the track he reposted, here is the log file:

Code: Select all

12:24:20: Starting: 28.02.2018 12:24 
12:24:20: Get accounts: 5
12:24:20: Randomise account order: 
12:24:20: Max items for action: 5
12:24:20: Login: THO************** :Tho************
12:24:20: loaded: 16 cookies
12:24:20: Attempting automatic cookie login: THO*********** Proxy: 10************
12:24:21: Cookie login successful: THO**************** Proxy: 10**************
12:24:21: Setup auth
12:24:22: * SUCCESS: Setup auth
12:24:22: Reloaded from cookies: THO**********
12:24:22: Get user details: https://soundcloud.com/tho***: THO**********
12:24:23: Max Results Wanted: 5
12:24:23: Setup custom search controller
12:24:23: Two search stages detected that can  be completed in one stage, setting default per item per stage value to max: 5
12:24:23: Custom search run: search: https://soundcloud.com/spinninrecords
12:24:23: Perform custom search: #chain/total: 1/2 using: THO*********
12:24:23: Next search step returns single item, can return from this step
12:24:23: Start search: Followings Of with: https://soundcloud.com/spinninrecords using: THO******
12:24:24: Get User ID: https://soundcloud.com/spinninrecords
12:24:24: Resolve Url: 'https://soundcloud.com/spinninrecords' to ID
12:24:25: Got ID: 175766for: https://soundcloud.com/spinninrecords
12:24:25: profile reports followings: 118
12:24:25: Scrape process url :https://api.soundcloud.com/users/175766/followings?app_version=1519814616&offset=0&client_id=t1bENsvPdW8kenrvrhDawQN2M1kJgN6V&limit=25&linked_partitioning=1
12:24:26: Checking filter on: 25 items
12:24:26: Adding: http://soundcloud.com/cheatcodesmusic
12:24:26: Adding: http://soundcloud.com/breathecarolina
12:24:26: Adding: http://soundcloud.com/curtiscold
12:24:26: Adding: http://soundcloud.com/mikewilliamsdj
12:24:26: Adding: http://soundcloud.com/edxmusic
12:24:26: Adding: http://soundcloud.com/lucasandsteve
12:24:26: Adding: http://soundcloud.com/michaelcalfan
12:24:26: Adding: http://soundcloud.com/tonyjuniorofficial
12:24:26: Adding: http://soundcloud.com/djlafuente
12:24:26: Adding: http://soundcloud.com/theavalanches
12:24:26: Adding: http://soundcloud.com/sanholobeats
12:24:26: Adding: http://soundcloud.com/outsoononspinninrecords
12:24:26: Adding: http://soundcloud.com/maxximizerecords
12:24:26: Adding: http://soundcloud.com/spinnincopyrightfreemusic
12:24:26: Adding: http://soundcloud.com/cademusicofficial
12:24:26: Adding: http://soundcloud.com/matrodamusic
12:24:26: Adding: http://soundcloud.com/housemusic
12:24:26: Adding: http://soundcloud.com/glamouratz
12:24:26: Adding: http://soundcloud.com/livealok
12:24:26: Adding: http://soundcloud.com/deependmusic
12:24:26: Adding: http://soundcloud.com/lvndscape
12:24:26: Adding: http://soundcloud.com/matt-and-kendo
12:24:26: Adding: http://soundcloud.com/heartfeldt
12:24:26: Adding: http://soundcloud.com/tiga
12:24:26: Adding: http://soundcloud.com/aftrhrsrecords
12:24:26: Total items: 25
12:24:26: Scraped enough, dropping out
12:24:26: Results of search: Followings Of with: https://soundcloud.com/spinninrecords
12:24:26: Handle results: 5 nextstep: 1/2
12:24:26: Got results from chain: 5 feed into next chained custom search item
12:24:26: Perform chained search: [1] http://soundcloud.com/cheatcodesmusic
12:24:26: Perform custom search: #chain/total: 2/2 using: THO******
12:24:26: Start search: Latest track of with: http://soundcloud.com/cheatcodesmusic using: THO******
12:24:26: Scraping all track details: http://soundcloud.com/cheatcodesmusic
12:24:26: get track: http://soundcloud.com/cheatcodesmusic
12:24:26: Get User ID: http://soundcloud.com/cheatcodesmusic
12:24:26: Resolve Url: 'http://soundcloud.com/cheatcodesmusic' to ID
12:24:28: Got ID: 130526858for: http://soundcloud.com/cheatcodesmusic
12:24:28: http://soundcloud.com/cheatcodesmusic: userId: 130526858
12:24:32: tracks: 35
12:24:32: Results of search: Latest track of with: http://soundcloud.com/cheatcodesmusic
12:24:32: Pausing for 5secs
12:24:37: Paused for 5secs
12:24:37: Handle results: 1 nextstep: 2/2
12:24:37: End of chain: Store results: 1
12:24:37: Perform chained search: [1] http://soundcloud.com/breathecarolina
12:24:37: Perform custom search: #chain/total: 2/2 using: THO******
12:24:37: Start search: Latest track of with: http://soundcloud.com/breathecarolina using: THO******
12:24:37: Scraping all track details: http://soundcloud.com/breathecarolina
12:24:37: get track: http://soundcloud.com/breathecarolina
12:24:37: Get User ID: http://soundcloud.com/breathecarolina
12:24:37: Resolve Url: 'http://soundcloud.com/breathecarolina' to ID
12:24:39: Got ID: 1694605for: http://soundcloud.com/breathecarolina
12:24:39: http://soundcloud.com/breathecarolina: userId: 1694605
12:24:46: tracks: 74
12:24:46: Results of search: Latest track of with: http://soundcloud.com/breathecarolina
12:24:46: Pausing for 1secs
12:24:47: Paused for 1secs
12:24:47: Handle results: 1 nextstep: 2/2
12:24:47: End of chain: Store results: 1
12:24:47: Perform chained search: [1] http://soundcloud.com/curtiscold
12:24:47: Perform custom search: #chain/total: 2/2 using: THO*******
12:24:47: Start search: Latest track of with: http://soundcloud.com/curtiscold using: THO******
12:24:47: Scraping all track details: http://soundcloud.com/curtiscold
12:24:47: get track: http://soundcloud.com/curtiscold
12:24:47: Get User ID: http://soundcloud.com/curtiscold
12:24:47: Resolve Url: 'http://soundcloud.com/curtiscold' to ID
12:24:49: Got ID: 293314999for: http://soundcloud.com/curtiscold
12:24:49: http://soundcloud.com/curtiscold: userId: 293314999
12:24:50: tracks: 5
12:24:50: Results of search: Latest track of with: http://soundcloud.com/curtiscold
12:24:50: Pausing for 1secs
12:24:51: Paused for 1secs
12:24:51: Handle results: 1 nextstep: 2/2
12:24:51: End of chain: Store results: 1
12:24:51: Perform chained search: [1] http://soundcloud.com/mikewilliamsdj
12:24:51: Perform custom search: #chain/total: 2/2 using: THO*******
12:24:51: Start search: Latest track of with: http://soundcloud.com/mikewilliamsdj using: THO******
12:24:51: Scraping all track details: http://soundcloud.com/mikewilliamsdj
12:24:51: get track: http://soundcloud.com/mikewilliamsdj
12:24:51: Get User ID: http://soundcloud.com/mikewilliamsdj
12:24:51: Resolve Url: 'http://soundcloud.com/mikewilliamsdj' to ID
12:24:52: Got ID: 8681825for: http://soundcloud.com/mikewilliamsdj
12:24:52: http://soundcloud.com/mikewilliamsdj: userId: 8681825
12:24:56: tracks: 5
12:24:56: Results of search: Latest track of with: http://soundcloud.com/mikewilliamsdj
12:24:56: Handle results: 1 nextstep: 2/2
12:24:56: End of chain: Store results: 1
12:24:56: Perform chained search: [1] http://soundcloud.com/edxmusic
12:24:56: Perform custom search: #chain/total: 2/2 using: THO*****
12:24:56: Start search: Latest track of with: http://soundcloud.com/edxmusic using: THO******
12:24:56: Scraping all track details: http://soundcloud.com/edxmusic
12:24:56: get track: http://soundcloud.com/edxmusic
12:24:56: Get User ID: http://soundcloud.com/edxmusic
12:24:56: Resolve Url: 'http://soundcloud.com/edxmusic' to ID
12:24:57: Got ID: 2768949for: http://soundcloud.com/edxmusic
12:24:57: http://soundcloud.com/edxmusic: userId: 2768949
12:25:16: tracks: 354
12:25:16: Results of search: Latest track of with: http://soundcloud.com/edxmusic
12:25:16: Pausing for 2secs
12:25:18: Paused for 2secs
12:25:18: Handle results: 1 nextstep: 2/2
12:25:18: End of chain: Store results: 1
12:25:18: Got items to process: 5
12:25:18: Merging existing processed items
12:25:18: setup Combined processed IDs: 9
12:25:18: Running: 1 threads
12:25:18: Made: 0 of limit: 80: action: Repost: using: B.V.P
12:25:18: Loaded account: B.V.P
12:25:18: Login: B.V.P:Bas*******
12:25:18: loaded: 16 cookies
12:25:18: Attempting automatic cookie login: B.V.P Proxy: 13****** 
12:25:20: Cookie login successful: B.V.P Proxy: 13****** 
12:25:20: Setup auth
12:25:20: * SUCCESS: Setup auth
12:25:20: Reloaded from cookies: B.V.P
12:25:20: Get user details: https://soundcloud.com/bas*****: B.V.P
12:25:21: Account selected: B.V.P 12:25
12:25:21: Processing: 1/5
12:25:21: Checking is already processed: pre lock: 12:25
12:25:21: Checked is already processed: false12:25
12:25:21: Process: https://soundcloud.com/cheatcodesmusic/feels-great-feat-fetty-wap-cvbz-bkaye-remix with: B.V.P
12:25:21: Reposting: https://soundcloud.com/cheatcodesmusic/feels-great-feat-fetty-wap-cvbz-bkaye-remix with: B.V.P
12:25:21: Made: 0 of limit: 80: action: Repost: using: B.V.P
12:25:21: Get track ID: https://soundcloud.com/cheatcodesmusic/feels-great-feat-fetty-wap-cvbz-bkaye-remix
12:25:21: Scraping track details :https://soundcloud.com/cheatcodesmusic/feels-great-feat-fetty-wap-cvbz-bkaye-remix
12:25:22: Extract JSON:https://soundcloud.com/cheatcodesmusic/feels-great-feat-fetty-wap-cvbz-bkaye-remix
12:25:22: Parse JSON:https://soundcloud.com/cheatcodesmusic/feels-great-feat-fetty-wap-cvbz-bkaye-remix
12:25:23: * SUCCESS: https://soundcloud.com/cheatcodesmusic/feels-great-feat-fetty-wap-cvbz-bkaye-remix: using: B.V.P
12:25:23: Save processed item: https://soundcloud.com/cheatcodesmusic/feels-great-feat-fetty-wap-cvbz-bkaye-remix to all accounts 12:25
12:25:23: Finished saving processed item: https://soundcloud.com/cheatcodesmusic/feels-great-feat-fetty-wap-cvbz-bkaye-remix to all accounts 12:25
12:25:23: Processed so far: 1
12:25:23: Pausing for: 195
And he always starts with the same track from cheat codes, every time I start the action again.

Thanks,
Brian
User avatar
martin@rootjazz
Site Admin
Posts: 34375
Joined: Fri Jan 25, 2013 10:06 pm
Location: The Funk
Contact:

Re: Mass Repost / Like - Every User a different track

Post by martin@rootjazz »

firstly, your filter may cause the majority of items to be ignored.

LATEST TRACK OF
must have > 10,000 plays

If the latest track is new (days) then this is going to fail a lot, meaning LOTS of requests to basically ignore most results after lots of tests.

As you are running a FOLLOWERS_OF scrape first, the majority of followers aren't going to be accounts that can generate 10k plays on their latest track.

Just something to keep in mind
User avatar
martin@rootjazz
Site Admin
Posts: 34375
Joined: Fri Jan 25, 2013 10:06 pm
Location: The Funk
Contact:

Re: Mass Repost / Like - Every User a different track

Post by martin@rootjazz »

anyway, everything seems ok with your idea and setup, it "should" work.

I think something may be going wrong with your filter, so I will check that now, but if you removed the "active in last 10 days" option, it should work correctly.
User avatar
martin@rootjazz
Site Admin
Posts: 34375
Joined: Fri Jan 25, 2013 10:06 pm
Location: The Funk
Contact:

Re: Mass Repost / Like - Every User a different track

Post by martin@rootjazz »

also you may be causing to ignore big accounts due to the IS ACTIVE WITHIN 10 DAYS.

To work this out, SCM will scrape likes made / comments given etc and check the most recent. Major accounts are unlikely to like / comment - typically they don't even use the account themself and is just someone at the record label / promo company they use that manage it.
User avatar
martin@rootjazz
Site Admin
Posts: 34375
Joined: Fri Jan 25, 2013 10:06 pm
Location: The Funk
Contact:

Re: Mass Repost / Like - Every User a different track

Post by martin@rootjazz »

I am finding no issue in the LastActive filter option, it all appears to be working
User avatar
martin@rootjazz
Site Admin
Posts: 34375
Joined: Fri Jan 25, 2013 10:06 pm
Location: The Funk
Contact:

Re: Mass Repost / Like - Every User a different track

Post by martin@rootjazz »

Found the issue no pre-actions, it was caused by the SHARE ACTION option. The next update will fix this. I shall let you know when it is ready.



Regards,
Martin
BrianS
Posts: 5
Joined: Tue Feb 27, 2018 8:58 pm

Re: Mass Repost / Like - Every User a different track

Post by BrianS »

martin@rootjazz wrote: Sat Mar 03, 2018 3:57 pm Found the issue no pre-actions, it was caused by the SHARE ACTION option. The next update will fix this. I shall let you know when it is ready.



Regards,
Martin
Great thank you, will test it today :)
Post Reply