-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathFilteringScriptURL.py
More file actions
135 lines (111 loc) · 4.29 KB
/
FilteringScriptURL.py
File metadata and controls
135 lines (111 loc) · 4.29 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
import spotipy
from spotipy.oauth2 import SpotifyOAuth
from spotipy.exceptions import SpotifyException
import time
import os
# Connection details
CLIENT_ID = '796b5d9f1aee4442809aa268982ed067'
CLIENT_SECRET = 'de2724f4849246a8a9b1ae595e95d7dd'
REDIRECT_URI = 'http://127.0.0.1:8888/callback'
SCOPE = 'playlist-modify-public playlist-modify-private'
# File path to load artist IDs that bypass all filters
FILE_PATH = r'C:\Aum.MusicRepo\venv\Scripts\ExclusionArtists.txt'
NO_FILTER_ARTISTS = []
def load_no_filter_artists(file_path):
if not os.path.exists(file_path):
raise FileNotFoundError(f"File not found at {file_path}")
with open(file_path, 'r', encoding='utf-8') as f:
return [line.strip() for line in f if line.strip()]
try:
NO_FILTER_ARTISTS = load_no_filter_artists(FILE_PATH)
except FileNotFoundError as e:
print(e)
NO_FILTER_ARTISTS = []
def get_spotify_client():
return spotipy.Spotify(
auth_manager=SpotifyOAuth(
client_id=CLIENT_ID,
client_secret=CLIENT_SECRET,
redirect_uri=REDIRECT_URI,
scope=SCOPE
)
)
def extract_playlist_id(playlist_link):
# Basic extraction from typical playlist URL format
return playlist_link.split("playlist/")[-1].split("?")[0]
def filter_tracks(tracks):
filtered_tracks = []
excluded_tracks = []
# Collect all track names for checking "clean" vs "explicit"
track_names = [t['track']['name'].lower() for t in tracks if t['track']]
for item in tracks:
if not item['track']:
continue
track = item['track']
name = track['name'].lower()
duration_ms = track['duration_ms']
track_uri = track['uri']
artist_id = track['artists'][0]['id'] if track['artists'] else None
is_explicit = track.get('explicit', False)
# Skip filters if artist is in NO_FILTER_ARTISTS
if artist_id in NO_FILTER_ARTISTS:
filtered_tracks.append(track_uri)
continue
# Name-based filters
if any(bad_word in name for bad_word in [
"live", "session", "לייב", "קאבר", "a capella", "FSOE",
"techno", "extended", "sped up", "speed up",
"intro", "slow", "remaster", "instrumental"
]):
excluded_tracks.append(track_uri)
continue
# Duration-based filter
if duration_ms < 90000 or duration_ms > 270000:
excluded_tracks.append(track_uri)
continue
# **Updated explicit filtering logic**
if not is_explicit:
if any(n == name.replace("clean", "").strip() for n in track_names if n != name):
excluded_tracks.append(track_uri)
continue
filtered_tracks.append(track_uri)
return filtered_tracks, excluded_tracks
def remove_excluded_tracks(sp, playlist_id, excluded_tracks):
chunk_size = 100
for i in range(0, len(excluded_tracks), chunk_size):
try:
sp.playlist_remove_all_occurrences_of_items(
playlist_id=playlist_id,
items=excluded_tracks[i:i+chunk_size]
)
except SpotifyException as e:
if e.http_status == 429:
retry_after = int(e.headers.get('Retry-After', 0))
print(f"Rate-limited. Retrying after {retry_after} seconds.")
time.sleep(retry_after)
else:
print(f"SpotifyException: {e}")
def filter_playlist(playlist_link):
sp = get_spotify_client()
playlist_id = extract_playlist_id(playlist_link)
# Get playlist tracks
all_tracks = []
results = sp.playlist_tracks(playlist_id, limit=100, offset=0)
while results:
all_tracks.extend(results['items'])
if results['next']:
results = sp.next(results)
else:
break
# Apply filters
filtered_tracks, excluded_tracks = filter_tracks(all_tracks)
# Remove excluded tracks
if excluded_tracks:
remove_excluded_tracks(sp, playlist_id, excluded_tracks)
print(f"Removed {len(excluded_tracks)} tracks from the playlist.")
else:
print("No tracks to remove.")
print(f"Final kept tracks: {len(filtered_tracks)}")
if __name__ == "__main__":
link = input("Enter a Spotify playlist link: ")
filter_playlist(link)