From d521001dd497fb71fc2c8a670ebc5e78c7f542c6 Mon Sep 17 00:00:00 2001 From: P Date: Fri, 31 Jan 2025 14:15:48 +0100 Subject: [PATCH] Initial commit --- build.xml | 73 ++ build/built-jar.properties | 4 + build/classes/Artista.class | Bin 0 -> 849 bytes build/classes/Brano.class | Bin 0 -> 2403 bytes build/classes/Main.class | Bin 0 -> 4945 bytes build/classes/Playlist$Nodo.class | Bin 0 -> 695 bytes build/classes/Playlist.class | Bin 0 -> 3874 bytes manifest.mf | 3 + nbproject/build-impl.xml | 1771 ++++++++++++++++++++++++++ nbproject/genfiles.properties | 8 + nbproject/private/private.properties | 2 + nbproject/private/private.xml | 12 + nbproject/project.properties | 95 ++ nbproject/project.xml | 15 + src/Artista.java | 17 + src/Brano.java | 40 + src/Main.java | 95 ++ src/Playlist.java | 147 +++ 18 files changed, 2282 insertions(+) create mode 100644 build.xml create mode 100644 build/built-jar.properties create mode 100644 build/classes/Artista.class create mode 100644 build/classes/Brano.class create mode 100644 build/classes/Main.class create mode 100644 build/classes/Playlist$Nodo.class create mode 100644 build/classes/Playlist.class create mode 100644 manifest.mf create mode 100644 nbproject/build-impl.xml create mode 100644 nbproject/genfiles.properties create mode 100644 nbproject/private/private.properties create mode 100644 nbproject/private/private.xml create mode 100644 nbproject/project.properties create mode 100644 nbproject/project.xml create mode 100644 src/Artista.java create mode 100644 src/Brano.java create mode 100644 src/Main.java create mode 100644 src/Playlist.java diff --git a/build.xml b/build.xml new file mode 100644 index 0000000..1021cae --- /dev/null +++ b/build.xml @@ -0,0 +1,73 @@ + + + + + + + + + + + Builds, tests, and runs the project Playlist. + + + diff --git a/build/built-jar.properties b/build/built-jar.properties new file mode 100644 index 0000000..7b12114 --- /dev/null +++ b/build/built-jar.properties @@ -0,0 +1,4 @@ +#Fri, 31 Jan 2025 01:21:27 +0100 + + +/home/blackilykat/NetbeansProjects/school/Playlist= diff --git a/build/classes/Artista.class b/build/classes/Artista.class new file mode 100644 index 0000000000000000000000000000000000000000..b8c17e3859f21401b1427cf426cca6f73bbbe477 GIT binary patch literal 849 zcmZuvO>fgc5PfSqcH%gsPDA)=A%O;L_akQ%goGj?MGEb~C{o0Qjq3&%$40i(Lw^f* zt{@RnA;AyeM z`d-GMJ`18Cd(I$R_PByFDjIYHRTvD~izExuj58=vJogzIqbmS6OM+n|6{*t(2Ac-e& zGUufAsdb(I&01*HQ{P?-6)MZvCJ8y?@m@P;eSo%xj)8}G#9&_aHHSNuZ(qPy`T@%)#8pfL)h1JNluG#QCjM20Cw zO*d1FFt;==vJx2W%nqGh@rdbM}`ozvS7E>1HbeZ#+U}OlPY7SY?g&8aOLf9U?YLGf_HCjuCeR3rn`~m$a BtJMGi literal 0 HcmV?d00001 diff --git a/build/classes/Brano.class b/build/classes/Brano.class new file mode 100644 index 0000000000000000000000000000000000000000..acf20af07c5a622fc9f34bb011249acadbf5bac2 GIT binary patch literal 2403 zcma)8TXz#x6#h;woiv@=G_=Jag`qZ(ghH@@5>k;8L89TJDb*F) z#IM=hv>3)#bW?Y)Ff8Y4TYQHX4Q_Udb=TI-PI;75y^#h3Q`Zwk3M5ZkY*8G34)=T2ms^Ov}`I z{TIJzd`H+q>*+6^YHeM+sBzD~o`i~N={e0X`wHy&^#o=ZPQA`xyKi%sYbIfF^&LJ= z>6ue;7;jQeT-~({N=|w-0aEUWinlzujxY(EWX-EMhU28_n`K~C$v&ZC0dF%X0ceKg zAb|;F84l;N&XSgGU(TLeZs)ayth1n<(Xvhwr;t;SS5d%ehUrlLOjmS-O-6UP(HD0% z80K=-d#`*m^^=10nwFU1ooXy=28S=|m z4s3fGzMyOnk}s#Jw=Sx97w=I=@m|k(%y2vxmfz@`Em_^-jesampoGf`$|_dyJ|)15 zY}7V2PnY)?E(NvqBu1@;eGOxiem+of6|1tMR*jmLDmnyC^2$k?jt>=FS8)R$?Pn)6 z1q`t*OE(#=hP$k?$?dv$)E8z;gy*E{3Y#|#v7fY%A;x0a=b_fQOA>mrSA%>a#c*BYe=U?G8RQCWzb!gft4;8B|7^Z5v zDQ@?>O<}LeQ01IhEpDuHTbK8M8FM#vYAvPaZJIKL+|^C0BC#CNvdlJ7lXaK3wr}yC zr=!SGnKpR0+2)J;F)W^An9mKi&L~VW=#Lj?7(WoCQL9^hyCrVu5@OOraaJ}P)%coa zxzsJZcT2dNR@+IT&2TcDl;PI*vKO$X#;_rmX-CCZc#y&aVr(U`4MRa!g$Y_5p>?O5 zJJz-+*1V|59pB(B*Rp9)Cc5F<%dq!A$wzmSn{7ili#5yI?)SpY7St(}k|D*l$GxH6 z{Qn<)mtj|Hp z1x`>M610P2n3k)XsA;*Hy_5E_chUm(B)+4!;xjPR>DH5vAf2hg>81J9%I0kBVJ7|r z>}TRdutvYK!k{N+3X`};)D>SI>-d~*r0Mx%9wj|W=@h;opHYu$5Eb(%=|2wXeJt?) zl4RoatyFjdB@=s|_z{!8Lv5trc!JcQ^FIW)L-JNQy^Gnx(k?QE`CS|>WMaF}B+RG> zvp_&WAYR*XHI ztT*ERrRQD7=rUVxDCs34v^|`Ch6}(`T#C>S{a3PwYxO9Kmb+VakhHhq- z*-6?&Md}N|2fh(}fr<~r2PzwB1Qit#LGg)-iinEhTT!6LhVT9?!^GT(2hhZp+L%Eq$izI<^_b zT8eKstd?%0rQghvr-Lyawel^aPCklt6zH`wMhjuJTa_>;lgPj74$=z*^7~?rFnR5!}Zu)3=G$IggrDg>wGF3W| z&dcOV8I#U9Pv;`kNOika^xex*MLjui}-tX)h_dLgrf{LPjF4Mvqb7C;CNn@pFRgA(CXf!f1 zhRnVZhbcqe{=jHC3j#Hrso6a5^x>DuelRLAnG*!rvDH_bVqKUv<0$POP?5u!Kofnd zCJUTa;pw~zWHmZW*gn_Hn8PyG8U(TmT;^nz+sRQgbD+yP6a{;gk{%r&8OgB_{ zY-Y!z*~1SG&-M&UMkk6_vp#k?t~V<4^tCEphu5>v^W##y;JIX@Gkv8X`Q5nGIfGoP z&V_lp>3nQ5q;Ft{-{H8{6j2(vq>L;3+;v2gX3?;@youGd%_w+LyoIa1rtEVY@m3XY z!`pcrETRFcU=8KyT)1_gtk`$rT?*c<;s(5jjmb}S39mAQ+hmHcRu~?daWfRIE{kB) zFl(;FO)B1t_tBJ9NSiqhAep0_Jo{t;en74uvnfAc(K#;QD*I38G3 zvoldZ&CB6entgPp)P5*3F*~{FInUJ}TkAHm8{|tPi}#O}H3c%WLyB65i^R^kGWdj@@gfoIW{s$X^;e%%BlDK6tX#{lXtAj7EeQm|{$kDtcwl zCYRez^@mPi&+3?KSUdP5zrMlD*skN!hIonKFt4@B3jnFJL49=u# z;c|muU6xpbs%Jnll{Frq^XH(feV#choI*KcY-re6DU)C&NA{NIZ$Lf(U(s>J!@(pV z7~Q2OVxrZwXJiia8u?OAR-srw2Nj1{9e#+f%Dj{F5{3Se07#gmb{`Ncl%dIK~La zrsGb^VyN6bSlOXVLIL_6hCQ4!3oBEOb6`9l%+TPmx~h@;t-VUHe==`YvcGU*VDiMW zmCqt2%}FDdOIx1FoK<^lCT}ul6bfcR!M_F0I4&mhxu@V+f#oM=m5tGl1$*}G9L(|) z;YjCO2Y)}!T?em%*V?veh l;WH&BU;#eMwHh$s4t$QgI(!~q2!zASAfLYwIy?hq zP^)WF9@Z92qdw(t;~`DsrgsJl2en1o;@Ws)?cL<7S)CpXuSrkydDwT)y`nWVB~J4}JM`phQfPOX*36N=Fpcp^?L2F-Vk5U-{vA-!|gSCLk)jQyTf`s zzEHbXVwc1>>hUUKV+{p~NYdV{b4P|?cUafrF$$Kp*XUZ6V3SWIlE7qBnW%<~xc*q; z9zi>kv>uIUz*7EhKpbf_!9g>w!%4Uai*OrG#{F1~$D!jWmIyX@5ydjmh*QNWeE(d7 z6=FS37oAusx^SjQ<1DeCZdiLo-VG-Tq7T!pY9v=evX2p@yfp?1u06^0Yi@FlKl`BeD~?#4Z=@0-Mv z_%bCF+$J8uSGbDeesLGRO1?TgE^fxXT*YuyT!XK1wLqLAviLf_!M_wb#dh3>Z=znL zMLT2lEi{M`u>=p`+x&OoT0Dyfxr)>CAK@WWA+o*%Rd zzM1eJ4|=4nDdHV%w<3JU>b4?oEaLt0>}vd`)8KP#C%OxHVmthJv;6HAO&>W{-$=vnCQA_saYs=mh@!g<(~ErW^Jw~fKSvkxaeo;SK7?}vO@4$Wgym(Am-{CnyZCb7_ZrGJ z;%7X&upfmwgzEl-W(5lw3l8QJf&0Ysfm=;*Yp8xL6SAG)&aMI{6XE{_#}oZIWkdJ{ ne#vVa(f^tE9%DT|R$Be0yn3>{dWx&3$seOz|H3nP4*LH913(Yk literal 0 HcmV?d00001 diff --git a/build/classes/Playlist$Nodo.class b/build/classes/Playlist$Nodo.class new file mode 100644 index 0000000000000000000000000000000000000000..9c6fa0051fd739b69c51959adfb534fb1f116a8a GIT binary patch literal 695 zcmZWn(QXn!6g{(Sfn6!kTB%lB+Uf&sjD5F+7ZOtw#3m)Y4=`z`S$4?m(4=3Xeu@vq z#0NjXk20QFED2>FX70V`+r}eA zClm$)M#?j5vP@5zTI;RUBDk{}X)~k4a6GeWtR^aTEYoZ)N$2Y=Plf_v*Gx#P^>nKG z^XW+0fgB~dL^GDjP+IN%|H07R=uDu|Tfy#U4|x5PayMpjDXp9;r!2X}7KQmvt@hyk zx`xhri2rb9=60+;XfI?r#CLvX97`1B{l>DwPDeb1{t<5|s-F9`7! z5x$|pSR?NmW0y7k7w6prJYT`KmRObi7xW^EtuIm*Libp9VZFpF5(4bwAitY9;vG|X J8BH7`_y@6?jfMaK literal 0 HcmV?d00001 diff --git a/build/classes/Playlist.class b/build/classes/Playlist.class new file mode 100644 index 0000000000000000000000000000000000000000..517522b15a0e75881cd428f13718ee5d2a069e96 GIT binary patch literal 3874 zcmaJ^OH&-z75;i2Gz<-lhL@xP1P&5RgM~pdRzSis*ov?LV3X_Jw3$4 zNvzn4qu5C*Ro=u|WZ_hWt&@^al~d*NN~+4=$U2)OiLJ3~?0+4N24}NMAFyjG=;IuMNGta?Q+p3Tn<;w&hJIi1+6f>rjh2 z6)6q%&=l0p7mV$KRiapJ-f>;i_Dls$GkeRubIz(WE{7U5G|7piXO=ueRt{;%$Vwvb ztojQr8d}k&KrOA8uU;)sk+Lj;hcz6*Q99xp_Nud~AT#58S@x{L&?SG(H_@S?QxrB9 zt%5P{nt5}T{#c^on1*iI(t<6gRI)bxjVCmG54{RftJbDzmn_E?v(qV_IiaBs{ZwbH ztyyJz&6>8S=qY9UXC~>2GcIuG7*H{&;Ym^7P!%^ZDZ0KXCq=m-f%qu}$NDSqj0b^4 z;0|?;XgDPbQ^mb7OchV>r6&@23a1g5=8T5#V~pV0=6l|>&4eWTr>Ap%Bxg080~46p zk7Pb@%;Ms{J3+RBsLpG64wD3Z%P2T5K?y;R`l{l2n(?s^z%FR`0WK2c6+vgpD3uLK z;-UUrCE&n<2*0S|CGn{x>eGJ8W-+JYWexLqWiM*q^1^n>Gf9ECQ)Y;*0e+Smva&LdDgPm##49=ud7(n zu#77Tnth^G>nFxVu~x7}$+uPH7Bf(=prCHSTC)wWEa)AshTv?-powt>2hchDU6LYO z-+!gTJ>DGhk-D2^EZdwbZ?2f`Wn)Dk&&)V^qp)bWmdwM&q@NagA8O!vZ`~pisftBf z@TEwL+C4*L^@3;QH)f5ZuSf-V)qL44`Lt-OHnm;cGpA52UUaDc=s^NRqp#y;aGU6l z&1yk=cG=l-LWXjlJ;2cYc3YKSh)RkIr%5L7g zU>v~esOmyd1n`TV`l5VFb9mgwqu2Gydy>(}`REwWd*(G23ShrG(>!L5HRh&1~ z;KLL?!VMKa7xsOupm)ETTK1N+VGac}3kZ3^$a{{vt>AZ27KMU=&5NvV1+&yU<2W1T zVzgX@e2vhr>fmK2;t}FkBJx3fACF#wP{ou{C@ff>NjhlLwr#po1*23liAh50xr$E| z9RF5mkMdZ>uM~7WUX%$7!b1=1LX4MJT0SqlMQ?Hz!(060<54x|(@{0&%i+uNrSN;c z1eN`_d7kCJYR;-pxfFiJqWlhb49@;Rxf=Gb>UW^%%5A99G)R-y>)CPv1RN0RqYvx7SQNOBj)ZzPnRhkySw700o{b_|Vd8<5~n z9nCk=XfsqCX5gJ%d4g{B5r9GNoM+${k;WXym-$}id9s^&&U3yBlc(t}u40Y7jMiZ> zm}?w&Bk_>$LQ+MoiVglM3h)5UDyHru`5&HC84w;tJ7b$%Yv=?f1~gFitPs!KfsiD{(eG zyLjeYe4?}C3p5Te-kBS5Cih9)SJo^oFVS6xR60?C^y>w*yFniS(n-UGppOgEt zpDBOxY;&vUp=s@&w)>}Po1$5#+!)FG;ZS1oGlMpHd$g^2K5D9rjFnFqnY zufo?^I@)y?&4bcck(>8@pSefrtY9FR`@7uT-9G5nKa=_wna?0H=K01FsOy zOA%OFBCy1v)KSrsdx{^;7y`1#m}$v-R~2J8BV)P(;Dj+X3Tb$&e9~kOkS2SOG!Dy9k+=I@7B`nS+(QoK2x;^RY4ngZ z4J1bS0BK}TNE7T;k*2qrG+X!~{rAOyI9 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set src.dir + Must set test.src.dir + Must set build.dir + Must set dist.dir + Must set build.classes.dir + Must set dist.javadoc.dir + Must set build.test.classes.dir + Must set build.test.results.dir + Must set build.classes.excludes + Must set dist.jar + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + No tests executed. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must set JVM to use for profiling in profiler.info.jvm + Must set profiler agent JVM arguments in profiler.info.jvmargs.agent + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + To run this application from the command line without Ant, try: + + java -jar "${dist.jar.resolved}" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + Must select one file in the IDE or set run.class + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set debug.class + + + + + Must select one file in the IDE or set debug.class + + + + + Must set fix.includes + + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + Must select one file in the IDE or set profile.class + This target only works when run from inside the NetBeans IDE. + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + + + + + This target only works when run from inside the NetBeans IDE. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select one file in the IDE or set run.class + + + + + + Must select some files in the IDE or set test.includes + + + + + Must select one file in the IDE or set run.class + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + Must select some files in the IDE or set javac.includes + + + + + + + + + + + + + + + + + + + + + + + + Some tests failed; see details above. + + + + + + + + + Must select some files in the IDE or set test.includes + + + + Some tests failed; see details above. + + + + Must select some files in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + Some tests failed; see details above. + + + + + Must select one file in the IDE or set test.class + + + + Must select one file in the IDE or set test.class + Must select some method in the IDE or set test.method + + + + + + + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + Must select one file in the IDE or set applet.url + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/nbproject/genfiles.properties b/nbproject/genfiles.properties new file mode 100644 index 0000000..5c402db --- /dev/null +++ b/nbproject/genfiles.properties @@ -0,0 +1,8 @@ +build.xml.data.CRC32=e8bcf82c +build.xml.script.CRC32=63f50820 +build.xml.stylesheet.CRC32=f85dc8f2@1.111.0.48 +# This file is used by a NetBeans-based IDE to track changes in generated files such as build-impl.xml. +# Do not edit this file. You may delete it but then the IDE will never regenerate such files for you. +nbproject/build-impl.xml.data.CRC32=e8bcf82c +nbproject/build-impl.xml.script.CRC32=f108b4e2 +nbproject/build-impl.xml.stylesheet.CRC32=12e0a6c2@1.111.0.48 diff --git a/nbproject/private/private.properties b/nbproject/private/private.properties new file mode 100644 index 0000000..82b5a19 --- /dev/null +++ b/nbproject/private/private.properties @@ -0,0 +1,2 @@ +compile.on.save=true +user.properties.file=/home/blackilykat/.netbeans/dev/build.properties diff --git a/nbproject/private/private.xml b/nbproject/private/private.xml new file mode 100644 index 0000000..9fb03d7 --- /dev/null +++ b/nbproject/private/private.xml @@ -0,0 +1,12 @@ + + + + + + file:/home/blackilykat/NetbeansProjects/school/Playlist/src/Playlist.java + file:/home/blackilykat/NetbeansProjects/school/Playlist/src/Brano.java + file:/home/blackilykat/NetbeansProjects/school/Playlist/src/Main.java + file:/home/blackilykat/NetbeansProjects/school/Playlist/src/Artista.java + + + diff --git a/nbproject/project.properties b/nbproject/project.properties new file mode 100644 index 0000000..d68c046 --- /dev/null +++ b/nbproject/project.properties @@ -0,0 +1,95 @@ +annotation.processing.enabled=true +annotation.processing.enabled.in.editor=false +annotation.processing.processor.options= +annotation.processing.processors.list= +annotation.processing.run.all.processors=true +annotation.processing.source.output=${build.generated.sources.dir}/ap-source-output +build.classes.dir=${build.dir}/classes +build.classes.excludes=**/*.java,**/*.form +# This directory is removed when the project is cleaned: +build.dir=build +build.generated.dir=${build.dir}/generated +build.generated.sources.dir=${build.dir}/generated-sources +# Only compile against the classpath explicitly listed here: +build.sysclasspath=ignore +build.test.classes.dir=${build.dir}/test/classes +build.test.results.dir=${build.dir}/test/results +# Uncomment to specify the preferred debugger connection transport: +#debug.transport=dt_socket +debug.classpath=\ + ${run.classpath} +debug.modulepath=\ + ${run.modulepath} +debug.test.classpath=\ + ${run.test.classpath} +debug.test.modulepath=\ + ${run.test.modulepath} +# Files in build.classes.dir which should be excluded from distribution jar +dist.archive.excludes= +# This directory is removed when the project is cleaned: +dist.dir=dist +dist.jar=${dist.dir}/Playlist.jar +dist.javadoc.dir=${dist.dir}/javadoc +dist.jlink.dir=${dist.dir}/jlink +dist.jlink.output=${dist.jlink.dir}/Playlist +excludes= +includes=** +jar.compress=false +javac.classpath= +# Space-separated list of extra javac options +javac.compilerargs= +javac.deprecation=false +javac.external.vm=true +javac.modulepath= +javac.processormodulepath= +javac.processorpath=\ + ${javac.classpath} +javac.source=23 +javac.target=23 +javac.test.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +javac.test.modulepath=\ + ${javac.modulepath} +javac.test.processorpath=\ + ${javac.test.classpath} +javadoc.additionalparam= +javadoc.author=false +javadoc.encoding=${source.encoding} +javadoc.html5=false +javadoc.noindex=false +javadoc.nonavbar=false +javadoc.notree=false +javadoc.private=false +javadoc.splitindex=true +javadoc.use=true +javadoc.version=false +javadoc.windowtitle= +# The jlink additional root modules to resolve +jlink.additionalmodules= +# The jlink additional command line parameters +jlink.additionalparam= +jlink.launcher=true +jlink.launcher.name=Playlist +main.class=Main +manifest.file=manifest.mf +meta.inf.dir=${src.dir}/META-INF +mkdist.disabled=false +platform.active=default_platform +run.classpath=\ + ${javac.classpath}:\ + ${build.classes.dir} +# Space-separated list of JVM arguments used when running the project. +# You may also define separate properties like run-sys-prop.name=value instead of -Dname=value. +# To set system properties for unit tests define test-sys-prop.name=value: +run.jvmargs= +run.modulepath=\ + ${javac.modulepath} +run.test.classpath=\ + ${javac.test.classpath}:\ + ${build.test.classes.dir} +run.test.modulepath=\ + ${javac.test.modulepath} +source.encoding=UTF-8 +src.dir=src +test.src.dir=test diff --git a/nbproject/project.xml b/nbproject/project.xml new file mode 100644 index 0000000..1eaea94 --- /dev/null +++ b/nbproject/project.xml @@ -0,0 +1,15 @@ + + + org.netbeans.modules.java.j2seproject + + + Playlist + + + + + + + + + diff --git a/src/Artista.java b/src/Artista.java new file mode 100644 index 0000000..fb48dc1 --- /dev/null +++ b/src/Artista.java @@ -0,0 +1,17 @@ +public class Artista { + public final String nome; + public final int annoNascita; + public final String nazionalita; + + public Artista(String nome, int annoNascita, String nazionalita) { + this.nome = nome; + this.annoNascita = annoNascita; + this.nazionalita = nazionalita; + } + + @Override + public String toString() { + // anno di nascita negativo se non si sa + return annoNascita < 0 ? String.format("%s (%s)", nome, nazionalita) : String.format("%s (%d, %s)", nome, annoNascita, nazionalita); + } +} diff --git a/src/Brano.java b/src/Brano.java new file mode 100644 index 0000000..403f724 --- /dev/null +++ b/src/Brano.java @@ -0,0 +1,40 @@ + +import java.util.Arrays; + +public class Brano { + public final String titolo; + public final String genere; + // Durata in secondi + public final int durata; + public final Artista[] artisti; + + public Brano(String titolo, String genere, int minuti, int secondi, Artista... artisti) { + this(titolo, genere, minuti * 60 + secondi, artisti); + } + + public Brano(String titolo, String genere, int durata, Artista... artisti) { + if(artisti.length > 5) { + throw new IllegalArgumentException("Un brano non può avere più di 5 artisti"); + } + if(durata < 0) { + throw new IllegalArgumentException("Un brano non può avere durata negativa"); + } + this.titolo = titolo; + this.genere = genere; + this.durata = durata; + this.artisti = artisti; + } + + @Override + public String toString() { + return String.format( + "(%s, %d:%02d) \"%s\" - %s", + genere, + durata / 60, + durata % 60, + titolo, + String.join(", ", Arrays.stream(artisti).map(artista -> artista.toString()).toList()) + ); + } + +} diff --git a/src/Main.java b/src/Main.java new file mode 100644 index 0000000..5b1b5f3 --- /dev/null +++ b/src/Main.java @@ -0,0 +1,95 @@ +import javax.swing.JButton; +import javax.swing.JCheckBox; +import javax.swing.JFrame; +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.SpringLayout; + +import java.awt.Container; +import java.awt.Dimension; + +public class Main { + public static void main(String[] args) { + Artista ivycomb = new Artista("ivycomb", 2000, "Canada"); + Artista stephanafro = new Artista("Stephanafro", -1, "USA"); + Brano pennyPinched = new Brano("Penny Pinched", "pop", 2, 15, ivycomb, stephanafro); + Brano vancouver = new Brano("Vancouver", "pop", 3, 42, ivycomb, stephanafro); + Brano terminal18 = new Brano("Terminal 18", "pop", 3, 49, ivycomb, stephanafro); + + Playlist playlist = new Playlist(pennyPinched, vancouver, terminal18); + + Artista caparezza = new Artista("Caparezza", 1973, "Italia"); + Artista diegoPerrone = new Artista("Diego Perrone", 1975, "Italia"); + Brano faiDaTela = new Brano("Fai Da Tela", "hip hop", 3, 59, caparezza, diegoPerrone); + Brano micaVanGogh = new Brano("Mica Van Gogh", "hip hop", 3, 55, caparezza); + Brano nonMeLoPossoPermettere = new Brano("Non me lo posso permettere", "hip hop", 3, 46, caparezza); + + playlist.aggiungiInCoda(faiDaTela); + playlist.aggiungiInCoda(micaVanGogh); + playlist.aggiungiInCoda(nonMeLoPossoPermettere); + + JFrame frame = new JFrame("Playlist"); + frame.setSize(new Dimension(500, 250)); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + + SpringLayout layout = new SpringLayout(); + frame.setLayout(layout); + + JLabel testoBranoCorrente = new JLabel(playlist.corrente().toString()); + frame.add(testoBranoCorrente); + + JButton bottoneProssimo = new JButton("Prossimo"); + bottoneProssimo.addActionListener(e -> { + if(e.getSource() != bottoneProssimo) return; + Brano nuovoBrano = playlist.prossimo(); + if(nuovoBrano != null) { + testoBranoCorrente.setText(nuovoBrano.toString()); + } + }); + frame.add(bottoneProssimo); + + JButton bottonePrecedente = new JButton("Precedente"); + bottonePrecedente.addActionListener(e -> { + if(e.getSource() != bottonePrecedente) return; + Brano nuovoBrano = playlist.precedente(); + if(nuovoBrano != null) { + testoBranoCorrente.setText(nuovoBrano.toString()); + } + }); + frame.add(bottonePrecedente); + + JCheckBox opzioneShuffle = new JCheckBox("Shuffle"); + opzioneShuffle.addActionListener(e -> { + if(e.getSource() != opzioneShuffle) return; + playlist.shuffle(opzioneShuffle.isSelected()); + }); + frame.add(opzioneShuffle); + + JCheckBox opzioneRepeat = new JCheckBox("Repeat"); + opzioneRepeat.addActionListener(e -> { + if(e.getSource() != opzioneRepeat) return; + playlist.repeat(opzioneRepeat.isSelected()); + }); + frame.add(opzioneRepeat); + + Container contentPane = frame.getContentPane(); + + layout.putConstraint(SpringLayout.NORTH, testoBranoCorrente, 50, SpringLayout.NORTH, contentPane); + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, testoBranoCorrente, 0, SpringLayout.HORIZONTAL_CENTER, contentPane); + + layout.putConstraint(SpringLayout.NORTH, bottonePrecedente, 20, SpringLayout.SOUTH, testoBranoCorrente); + layout.putConstraint(SpringLayout.EAST, bottonePrecedente, 0, SpringLayout.HORIZONTAL_CENTER, contentPane); + + layout.putConstraint(SpringLayout.NORTH, bottoneProssimo, 0, SpringLayout.NORTH, bottonePrecedente); + layout.putConstraint(SpringLayout.WEST, bottoneProssimo, 0, SpringLayout.EAST, bottonePrecedente); + + layout.putConstraint(SpringLayout.NORTH, opzioneRepeat, 10, SpringLayout.SOUTH, bottonePrecedente); + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, opzioneRepeat, 0, SpringLayout.HORIZONTAL_CENTER, contentPane); + + layout.putConstraint(SpringLayout.NORTH, opzioneShuffle, 10, SpringLayout.SOUTH, opzioneRepeat); + layout.putConstraint(SpringLayout.HORIZONTAL_CENTER, opzioneShuffle, 0, SpringLayout.HORIZONTAL_CENTER, contentPane); + + frame.setVisible(true); + } + +} diff --git a/src/Playlist.java b/src/Playlist.java new file mode 100644 index 0000000..bd8ed9e --- /dev/null +++ b/src/Playlist.java @@ -0,0 +1,147 @@ +import java.util.Random; + +public class Playlist { + private Nodo corrente = null; + private Nodo testa = null; + private Nodo coda = null; + private boolean shuffle = false; + private Random random = null; + private Nodo> pilaPrecedenti = null; + private Nodo> pilaProssimi = null; + private int dimensione = 0; + + public Playlist(Brano... brani) { + for(Brano brano : brani) { + if(brano == null) continue; + aggiungiInCoda(brano); + } + } + + public void aggiungiInCoda(Brano brano) { + dimensione++; + if(corrente != null) { + Nodo cursore = corrente; + while(cursore.prossimo != null) cursore = cursore.prossimo; + cursore.prossimo = new Nodo(brano); + cursore.prossimo.precedente = cursore; + coda = cursore.prossimo; + } else { + corrente = new Nodo(brano); + testa = corrente; + coda = corrente; + } + } + + private Nodo branoCasuale() { + Nodo cursore = testa; + if(random == null) random = new Random(); + int pos = random.nextInt(0, dimensione); + for(int i = 0; i < pos; i++) { + cursore = cursore.prossimo; + } + return cursore; + } + + public Brano precedente() { + if(dimensione == 0) return null; + + + if(pilaPrecedenti != null) { + aggiungiInProssimi(corrente); + corrente = pilaPrecedenti.valore; + pilaPrecedenti = pilaPrecedenti.prossimo; + if(pilaPrecedenti != null) { + pilaPrecedenti.precedente = null; + } + return corrente.valore; + } + + if(shuffle) { + aggiungiInProssimi(corrente); + corrente = branoCasuale(); + return corrente.valore; + } + + if(corrente == null || corrente.precedente == null) return null; + aggiungiInProssimi(corrente); + corrente = corrente.precedente; + return corrente.valore; + } + + private void aggiungiInProssimi(Nodo nodo) { + Nodo> nuovoProssimo = new Nodo>(nodo); + if(pilaProssimi != null) { + nuovoProssimo.prossimo = pilaProssimi; + nuovoProssimo.prossimo.precedente = nuovoProssimo; + } + pilaProssimi = nuovoProssimo; + } + + public Brano corrente() { + if(corrente == null) return null; + return corrente.valore; + } + + public Brano prossimo() { + if(dimensione == 0) return null; + + if(pilaProssimi != null) { + aggiungiInPrecedenti(corrente); + corrente = pilaProssimi.valore; + pilaProssimi = pilaProssimi.prossimo; + if(pilaProssimi != null) { + pilaProssimi.precedente = null; + } + return corrente.valore; + } + + if(shuffle) { + aggiungiInPrecedenti(corrente); + corrente = branoCasuale(); + return corrente.valore; + } + + if(corrente == null || corrente.prossimo == null) return null; + aggiungiInPrecedenti(corrente); + corrente = corrente.prossimo; + return corrente.valore; + } + + private void aggiungiInPrecedenti(Nodo nodo) { + Nodo> nuovoPrecedente = new Nodo>(corrente); + if(pilaPrecedenti != null) { + nuovoPrecedente.prossimo = pilaPrecedenti; + nuovoPrecedente.prossimo.precedente = nuovoPrecedente; + } + pilaPrecedenti = nuovoPrecedente; + } + + public void repeat(boolean abilitato) { + // In un contesto reale non modificherei la lista in se ma cambierei la logica solo + // quando devo selezionare la traccia successiva o precedente. Per scopi didattici, + // rendo la lista una lista circolare. + if(abilitato) { + testa.precedente = coda; + coda.prossimo = testa; + } else { + testa.precedente = null; + coda.prossimo = null; + } + System.out.println("Repeat: " + abilitato); + } + + public void shuffle(boolean abilitato) { + shuffle = abilitato; + System.out.println("Shuffle: " + abilitato); + } + + private class Nodo { + public T valore; + public Nodo prossimo; + public Nodo precedente; + + public Nodo(T valore) { + this.valore = valore; + } + } +}