1717 left : 0 ;
1818 top : 0 ;
1919 }
20- .card {
21- break-inside : avoid;
22- page-break-inside : avoid;
23- }
2420 }
2521
2622 .card {
2723 width : 6cm ;
2824 height : 6cm ;
29- position : relative;
30- perspective : 1000px ;
31- }
32-
33- .card-inner {
34- position : relative;
35- width : 100% ;
36- height : 100% ;
37- text-align : center;
38- transition : transform 0.8s ;
39- transform-style : preserve-3d;
40- }
41-
42- .card : hover .card-inner {
43- transform : rotateY (180deg );
25+ border : 1px solid # e5e7eb ;
26+ border-radius : 8px ;
27+ background : white;
28+ padding : 10px ;
29+ margin : 10px ;
4430 }
4531
46- .card-front , .card-back {
47- position : absolute;
48- width : 100% ;
49- height : 100% ;
50- backface-visibility : hidden;
32+ .qr-container {
5133 display : flex;
52- align-items : center;
5334 justify-content : center;
54- border : 1px solid # e5e7eb ;
55- border-radius : 8px ;
56- background : white;
35+ margin-bottom : 10px ;
5736 }
5837
59- .card-back p .year {
38+ .metadata {
39+ text-align : center;
40+ }
41+
42+ .metadata .year {
6043 font-size : 24px ;
6144 margin-top : 8px ;
6245 }
6346
47+ # printArea {
48+ display : grid;
49+ grid-template-columns : repeat (3 , 1fr );
50+ gap : 20px ;
51+ padding : 20px ;
52+ }
53+
6454 .hidden {
6555 display : none;
6656 }
10393 < button id ="createQRButton " class ="fixed top-4 right-4 bg-green-500 text-white py-2 px-4 rounded "> Create QR codes from Playlist</ button >
10494</ div >
10595
106- < div id ="printArea " class =" grid grid-cols-3 gap-4 p-4 " > </ div >
96+ < div id ="printArea "> </ div >
10797
10898< script >
10999 let playerInstance = null ;
150140 if ( ! playlistId ) {
151141 throw new Error ( 'Could not extract playlist ID from URL' ) ;
152142 }
153-
154143 const response = await fetch ( `https://api.spotify.com/v1/playlists/${ playlistId } /tracks` , {
155144 headers : {
156145 'Authorization' : `Bearer ${ localStorage . getItem ( 'spotify_access_token' ) } `
157146 }
158147 } ) ;
159-
160148 if ( ! response . ok ) {
161149 throw new Error ( `API request failed with status ${ response . status } ` ) ;
162150 }
163-
164151 const data = await response . json ( ) ;
165-
166152 return data . items
167153 . filter ( item => item ?. track && item . track . album ?. release_date )
168154 . map ( item => ( {
177163 const card = document . createElement ( 'div' ) ;
178164 card . className = 'card' ;
179165
180- // Create a container for the QR code
181166 const qrContainer = document . createElement ( 'div' ) ;
182167 qrContainer . className = 'qr-container' ;
183168 qrContainer . id = `qr-${ track . id } ` ;
184169
185- // Create the metadata section
186170 const metadata = document . createElement ( 'div' ) ;
187171 metadata . className = 'metadata' ;
188172 metadata . innerHTML = `
189- <h3 class="title">${ track . name } </h3>
190- <p class="artist">${ track . artist } </p>
191- <p class="year">${ track . year } </p>
192- ` ;
173+ <h3 class="title">${ track . name } </h3>
174+ <p class="artist">${ track . artist } </p>
175+ <p class="year">${ track . year } </p>
176+ ` ;
193177
194178 card . appendChild ( qrContainer ) ;
195179 card . appendChild ( metadata ) ;
@@ -205,11 +189,8 @@ <h3 class="title">${track.name}</h3>
205189 return card ;
206190 }
207191
208-
209192 async function createQRCodesFromPlaylist ( ) {
210193 const input = prompt ( "Enter Spotify playlist URL:" ) ;
211- const maxTracks = 20 ; // Limit to 20 tracks
212-
213194 if ( ! input ) return ;
214195
215196 try {
@@ -221,15 +202,13 @@ <h3 class="title">${track.name}</h3>
221202 const printArea = document . getElementById ( 'printArea' ) ;
222203 printArea . innerHTML = '' ;
223204
224- // Take only the first 20 tracks
225- tracks . slice ( 0 , maxTracks ) . forEach ( track => {
205+ tracks . slice ( 0 , 21 ) . forEach ( track => {
226206 printArea . appendChild ( createQRCard ( track ) ) ;
227207 } ) ;
228208
229- // Add a small delay before printing to ensure QR codes are generated
230209 setTimeout ( ( ) => {
231210 window . print ( ) ;
232- } , 500 ) ;
211+ } , 1000 ) ;
233212
234213 } catch ( error ) {
235214 alert ( 'Error processing tracks: ' + error . message ) ;
@@ -240,12 +219,13 @@ <h3 class="title">${track.name}</h3>
240219 function initializePlayer ( token ) {
241220 document . getElementById ( 'setup' ) . classList . add ( 'hidden' ) ;
242221 document . getElementById ( 'player' ) . classList . remove ( 'hidden' ) ;
243-
244222 localStorage . setItem ( 'spotify_access_token' , token ) ;
245223
246224 playerInstance = new Spotify . Player ( {
247225 name : 'Development Player' ,
248- getOAuthToken : cb => { cb ( token ) ; }
226+ getOAuthToken : cb => {
227+ cb ( token ) ;
228+ }
249229 } ) ;
250230
251231 playerInstance . addListener ( 'ready' , async ( { device_id } ) => {
@@ -255,7 +235,10 @@ <h3 class="title">${track.name}</h3>
255235 'Authorization' : `Bearer ${ token } ` ,
256236 'Content-Type' : 'application/json'
257237 } ,
258- body : JSON . stringify ( { device_ids : [ device_id ] , play : true } )
238+ body : JSON . stringify ( {
239+ device_ids : [ device_id ] ,
240+ play : true
241+ } )
259242 } ) ;
260243
261244 const trackId = getUrlParameter ( 'track' ) ;
@@ -266,7 +249,9 @@ <h3 class="title">${track.name}</h3>
266249 'Authorization' : `Bearer ${ token } ` ,
267250 'Content-Type' : 'application/json'
268251 } ,
269- body : JSON . stringify ( { uris : [ `spotify:track:${ trackId } ` ] } )
252+ body : JSON . stringify ( {
253+ uris : [ `spotify:track:${ trackId } ` ]
254+ } )
270255 } ) ;
271256 }
272257 } ) ;
0 commit comments