Commit f55f44c8 authored by Andreas Heimann's avatar Andreas Heimann

added playlists for everyone, added frontpage refresh, removed popular, added api link

parent a25eabab
......@@ -57,6 +57,38 @@
line-height: 1.5em;
opacity: 0.7;
}
.section-playlist-detail .playlist-content .playlist-detail .playlist-actions {
margin-top: 25px;
transition: all 0.2s ease-in-out;
border-radius: 4px;
overflow: hidden;
background: #fff;
}
.section-playlist-detail .playlist-content .playlist-detail .playlist-actions .action-row {
display: flex;
}
.section-playlist-detail .playlist-content .playlist-detail .playlist-actions .action-row .action {
background: linear-gradient(135deg, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.3));
flex-grow: 1;
display: flex;
justify-content: center;
align-items: center;
color: #222;
text-decoration: none;
transition: all 0.2s ease-in-out;
cursor: pointer;
}
.section-playlist-detail .playlist-content .playlist-detail .playlist-actions .action-row .action .icon {
display: flex;
justify-content: center;
align-items: center;
height: 48px;
width: 48px;
font-size: 24px;
}
.section-playlist-detail .playlist-content .playlist-detail .playlist-actions .action-row .action:hover {
opacity: 0.6;
}
.section-playlist-detail .playlist-content .playlist-detail .playlist-uploader {
display: grid;
grid-template-columns: auto 1fr;
......
{"version":3,"sources":["playlistdetail.less"],"names":[],"mappings":"AACI,wBAAE;EACE,WAAA;EACA,aAAA;EACA,2CAAA;EACA,sBAAA;;AAEA,wBANF,OAMI;EACE,WAAA;EACA,YAAA;EACA,8BAAA;EACA,yBAAA;EACA,aAAA;EACA,uBAAA;EACA,mBAAA;;AAEA,wBAfN,OAMI,OASI;EACE,kBAAA;EACA,0CAAA;;AAEA,wBAnBV,OAMI,OASI,SAII;EACE,eAAA;EACA,kBAAA;EACA,aAAa,oBAAb;;AAEA,wBAxBd,OAMI,OASI,SAII,OAKI;EACE,qBAAA;EACA,aAAa,uBAAb;EACA,iBAAA;EACA,eAAA;EACA,iBAAA;EACA,kBAAA;EACA,gBAAA;EACA,WAAA;EACA,8BAAA;EACA,iBAAA;EACA,WAAW,iBAAX;;AAIR,wBAvCV,OAMI,OASI,SAwBI;EACE,eAAA;EACA,YAAA;;AAKhB,wBAAE;EACE,aAAA;EACA,aAAA;EACA,gCAAA;EACA,cAAA;;AAGI,wBAPN,kBAMI,iBACI;EACE,mBAAA;EACA,kBAAA;EACA,kBAAA;EACA,aAAA;EACA,cAAA;EACA,aAAA;;AAEA,wBAfV,kBAMI,iBACI,sBAQI;EACE,kBAAA;EACA,YAAA;;AAGR,wBApBN,kBAMI,iBAcI;EACE,aAAA;EACA,+BAAA;EACA,cAAA;EACA,gBAAA;;AAEA,wBA1BV,kBAMI,iBAcI,mBAMI;EACE,kBAAA;EACA,YAAA;;AAGR,wBA/BN,kBAMI,iBAyBI;EACE,aAAA;EACA,4BAAA;EACA,aAAA;EACA,gBAAA;;AAEA,wBArCV,kBAMI,iBAyBI,mBAMI;EACE,kBAAA;EACA,YAAA;;AAEJ,wBAzCV,kBAMI,iBAyBI,mBAUI;EACE,mBAAA;EACA,aAAA;EACA,kBAAA;EACA,kBAAA;;AAEJ,wBA/CV,kBAMI,iBAyBI,mBAgBI;EACE,UAAA;EACA,WAAA;EACA,qBAAA;EACA,oCAAA;;AAEA,wBArDd,kBAMI,iBAyBI,mBAgBI,UAMG;EACG,YAAA;;AAMZ,wBA5DN,kBA2DI,mBACI;EACE,uBAAuB,cAAvB","file":"playlistdetail.css"}
\ No newline at end of file
{"version":3,"sources":["playlistdetail.less"],"names":[],"mappings":"AACI,wBAAE;EACE,WAAA;EACA,aAAA;EACA,2CAAA;EACA,sBAAA;;AAEA,wBANF,OAMI;EACE,WAAA;EACA,YAAA;EACA,8BAAA;EACA,yBAAA;EACA,aAAA;EACA,uBAAA;EACA,mBAAA;;AAEA,wBAfN,OAMI,OASI;EACE,kBAAA;EACA,0CAAA;;AAEA,wBAnBV,OAMI,OASI,SAII;EACE,eAAA;EACA,kBAAA;EACA,aAAa,oBAAb;;AAEA,wBAxBd,OAMI,OASI,SAII,OAKI;EACE,qBAAA;EACA,aAAa,uBAAb;EACA,iBAAA;EACA,eAAA;EACA,iBAAA;EACA,kBAAA;EACA,gBAAA;EACA,WAAA;EACA,8BAAA;EACA,iBAAA;EACA,WAAW,iBAAX;;AAIR,wBAvCV,OAMI,OASI,SAwBI;EACE,eAAA;EACA,YAAA;;AAKhB,wBAAE;EACE,aAAA;EACA,aAAA;EACA,gCAAA;EACA,cAAA;;AAGI,wBAPN,kBAMI,iBACI;EACE,mBAAA;EACA,kBAAA;EACA,kBAAA;EACA,aAAA;EACA,cAAA;EACA,aAAA;;AAEA,wBAfV,kBAMI,iBACI,sBAQI;EACE,kBAAA;EACA,YAAA;;AAGR,wBApBN,kBAMI,iBAcI;EACE,gBAAA;EACA,gCAAA;EACA,kBAAA;EACA,gBAAA;EACA,gBAAA;;AAEA,wBA3BV,kBAMI,iBAcI,kBAOI;EACE,aAAA;;AAEA,wBA9Bd,kBAMI,iBAcI,kBAOI,YAGI;EACE,YAAY,+DAAZ;EACA,YAAA;EACA,aAAA;EACA,uBAAA;EACA,mBAAA;EACA,WAAA;EACA,qBAAA;EACA,gCAAA;EACA,eAAA;;AAEA,wBAzClB,kBAMI,iBAcI,kBAOI,YAGI,QAWI;EACE,aAAA;EACA,uBAAA;EACA,mBAAA;EACA,YAAA;EACA,WAAA;EACA,eAAA;;AAGJ,wBAlDlB,kBAMI,iBAcI,kBAOI,YAGI,QAoBG;EACG,YAAA;;AAKhB,wBAxDN,kBAMI,iBAkDI;EACE,aAAA;EACA,+BAAA;EACA,cAAA;EACA,gBAAA;;AAEA,wBA9DV,kBAMI,iBAkDI,mBAMI;EACE,kBAAA;EACA,YAAA;;AAGR,wBAnEN,kBAMI,iBA6DI;EACE,aAAA;EACA,4BAAA;EACA,aAAA;EACA,gBAAA;;AAEA,wBAzEV,kBAMI,iBA6DI,mBAMI;EACE,kBAAA;EACA,YAAA;;AAEJ,wBA7EV,kBAMI,iBA6DI,mBAUI;EACE,mBAAA;EACA,aAAA;EACA,kBAAA;EACA,kBAAA;;AAEJ,wBAnFV,kBAMI,iBA6DI,mBAgBI;EACE,UAAA;EACA,WAAA;EACA,qBAAA;EACA,oCAAA;;AAEA,wBAzFd,kBAMI,iBA6DI,mBAgBI,UAMG;EACG,YAAA;;AAMZ,wBAhGN,kBA+FI,mBACI;EACE,uBAAuB,cAAvB","file":"playlistdetail.css"}
\ No newline at end of file
......@@ -65,6 +65,42 @@
opacity: 0.7;
}
}
& .playlist-actions {
margin-top: 25px;
transition: all 0.2s ease-in-out;
border-radius: 4px;
overflow: hidden;
background: #fff;
& .action-row {
display: flex;
& .action {
background: linear-gradient(135deg, rgba(0, 0, 0, 0.1), rgba(0, 0, 0, 0.3));
flex-grow: 1;
display: flex;
justify-content: center;
align-items: center;
color: #222;
text-decoration: none;
transition: all 0.2s ease-in-out;
cursor: pointer;
& .icon {
display: flex;
justify-content: center;
align-items: center;
height: 48px;
width: 48px;
font-size: 24px;
}
&:hover {
opacity: 0.6;
}
}
}
}
& .playlist-uploader {
display: grid;
grid-template-columns: auto 1fr;
......
......@@ -240,3 +240,4 @@
width: 0%;
}
}
/*# sourceMappingURL=settings.css.map */
\ No newline at end of file
{"version":3,"sources":["settings.less"],"names":[],"mappings":"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","file":"settings.css"}
\ No newline at end of file
......@@ -29,33 +29,74 @@
color: #ffffff;
background: #212629;
}
.staff-promos {
.section-startup .frontpage {
width: 100%;
display: grid;
grid-template-columns: 1fr 1fr;
grid-gap: 25px;
width: 1114px;
margin: 0 auto;
margin-top: 50px;
grid-template-columns: 100px 1fr;
grid-gap: 50px;
padding: 50px;
}
.section-startup .frontpage .social-buttons {
display: grid;
grid-template-columns: 1fr;
grid-gap: 15px;
}
.section-startup .frontpage .social-buttons .item {
height: 75px;
display: flex;
color: #fff;
justify-content: center;
align-items: center;
font-size: 32px;
background: rgba(255, 255, 255, 0.2);
border-radius: 6px;
transition: 0.2s ease-in-out all;
}
.staff-promos:empty {
.section-startup .frontpage .social-buttons .item.item-discord {
background: linear-gradient(135deg, #99aab5, #7289da);
}
.section-startup .frontpage .social-buttons .item.item-twitter {
background: linear-gradient(135deg, #d0e6f7, #1da1f2);
}
.section-startup .frontpage .social-buttons .item.item-youtube {
background: linear-gradient(135deg, #ff0000, #c20000);
}
.section-startup .frontpage .social-buttons .item.item-twitch {
background: linear-gradient(135deg, #b9a3e3, #6441a5);
}
.section-startup .frontpage .social-buttons .item.item-patreon {
background: linear-gradient(135deg, #ff8575, #e75744);
}
.section-startup .frontpage .social-buttons .item:hover {
transform: scale(1.05);
box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.4);
cursor: pointer;
}
.section-startup .frontpage .staff-promos {
display: grid;
grid-template-columns: 545px 545px 1fr;
}
.section-startup .frontpage .staff-promos:empty {
display: none;
}
.staff-promos .staff-promo {
.section-startup .frontpage .staff-promos .staff-promo {
background: #fff;
background-position: center right;
background-size: cover;
border-radius: 6px;
padding: 50px;
height: 256px;
display: grid;
grid-template-rows: auto 100px auto;
}
.staff-promos .staff-promo .promo-type {
.section-startup .frontpage .staff-promos .staff-promo .promo-type {
color: #aaa;
justify-self: left;
font-size: 12px;
font-weight: bold;
letter-spacing: 0.3em;
}
.staff-promos .staff-promo .promo-title {
.section-startup .frontpage .staff-promos .staff-promo .promo-title {
font-weight: bold;
font-size: 34px;
justify-self: left;
......@@ -63,7 +104,7 @@
letter-spacing: -0.025em;
color: #222;
}
.staff-promos .staff-promo .promo-button {
.section-startup .frontpage .staff-promos .staff-promo .promo-button {
font-size: 14px;
font-weight: bold;
text-transform: uppercase;
......@@ -75,49 +116,11 @@
transition: 0.2s ease-in-out opacity;
text-decoration: none;
}
.staff-promos .staff-promo .promo-button:hover {
.section-startup .frontpage .staff-promos .staff-promo .promo-button:hover {
cursor: pointer;
opacity: 0.6;
}
.social-buttons {
display: grid;
width: 650px;
margin: 0 auto;
margin-top: 25px;
grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
grid-gap: 15px;
}
.social-buttons .item {
height: 75px;
display: flex;
color: #fff;
justify-content: center;
align-items: center;
font-size: 32px;
background: rgba(255, 255, 255, 0.2);
border-radius: 6px;
transition: 0.2s ease-in-out all;
}
.social-buttons .item.item-discord {
background: linear-gradient(135deg, #99aab5, #7289da);
}
.social-buttons .item.item-twitter {
background: linear-gradient(135deg, #d0e6f7, #1da1f2);
}
.social-buttons .item.item-youtube {
background: linear-gradient(135deg, #ff0000, #c20000);
}
.social-buttons .item.item-twitch {
background: linear-gradient(135deg, #b9a3e3, #6441a5);
}
.social-buttons .item.item-patreon {
background: linear-gradient(135deg, #ff8575, #e75744);
}
.social-buttons .item:hover {
transform: scale(1.1);
box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.4);
cursor: pointer;
}
.song-row {
padding: 50px;
}
/*# sourceMappingURL=startup.css.map */
\ No newline at end of file
{"version":3,"sources":["startup.less"],"names":[],"mappings":"AACI,gBAAE;EACE,8BAAA;EACA,kBAAA;EACA,mBAAA;;AAEA,gBALF,OAKI;EACE,aAAA;;AAEA,gBARN,OAKI,MAGI;EACE,eAAA;EACA,iBAAA;EACA,yBAAA;EACA,sBAAA;EACA,kBAAA;EACA,2BAAA;EACA,4BAAA;EACA,8BAAA;EACA,+BAAA;EACA,gCAAA;EACA,qBAAA;;AAEA,gBArBV,OAKI,MAGI,KAaG,IAAI,SAAS;EACV,eAAA;EACA,mBAAA;EACA,gCAAA;;AAEJ,gBA1BV,OAKI,MAGI,KAkBG;EACG,UAAA;EACA,cAAA;EACA,mBAAA;;AAMhB,gBAAE;EACE,WAAA;EACA,aAAA;EACA,gCAAA;EACA,cAAA;EACA,aAAA;;AAEA,gBAPF,WAOI;EACE,aAAA;EACA,0BAAA;EACA,cAAA;;AAEA,gBAZN,WAOI,gBAKI;EACE,YAAA;EACA,aAAA;EACA,WAAA;EACA,uBAAA;EACA,mBAAA;EACA,eAAA;EACA,oCAAA;EACA,kBAAA;EACA,gCAAA;;AAEA,gBAvBV,WAOI,gBAKI,MAWG;EACG,YAAY,yCAAZ;;AAEJ,gBA1BV,WAOI,gBAKI,MAcG;EACG,YAAY,yCAAZ;;AAEJ,gBA7BV,WAOI,gBAKI,MAiBG;EACG,YAAY,yCAAZ;;AAEJ,gBAhCV,WAOI,gBAKI,MAoBG;EACG,YAAY,yCAAZ;;AAEJ,gBAnCV,WAOI,gBAKI,MAuBG;EACG,YAAY,yCAAZ;;AAGJ,gBAvCV,WAOI,gBAKI,MA2BG;EACG,WAAW,WAAX;EACA,2CAAA;EACA,eAAA;;AAIZ,gBA9CF,WA8CI;EACE,aAAA;EACA,sCAAA;;AAEA,gBAlDN,WA8CI,cAIG;EACG,aAAA;;AAGJ,gBAtDN,WA8CI,cAQI;EACE,gBAAA;EACA,iCAAA;EACA,sBAAA;EACA,kBAAA;EACA,aAAA;EACA,aAAA;EACA,aAAA;EACA,mCAAA;;AAEA,gBAhEV,WA8CI,cAQI,aAUI;EACE,WAAA;EACA,kBAAA;EACA,eAAA;EACA,iBAAA;EACA,qBAAA;;AAEJ,gBAvEV,WA8CI,cAQI,aAiBI;EACE,iBAAA;EACA,eAAA;EACA,kBAAA;EACA,sBAAA;EACA,wBAAA;EACA,WAAA;;AAEJ,gBA/EV,WA8CI,cAQI,aAyBI;EACE,eAAA;EACA,iBAAA;EACA,yBAAA;EACA,kBAAA;EACA,WAAA;EACA,gBAAA;EACA,kBAAA;EACA,kBAAA;EACA,oCAAA;EACA,qBAAA;;AAEA,gBA3Fd,WA8CI,cAQI,aAyBI,cAYG;EACG,eAAA;EACA,YAAA;;AAOxB;EACI,aAAA","file":"startup.css"}
\ No newline at end of file
......@@ -33,101 +33,104 @@
}
}
}
}
.staff-promos {
display: grid;
grid-template-columns: 1fr 1fr;
grid-gap: 25px;
width: 1114px;
margin: 0 auto;
margin-top: 50px;
& .frontpage {
width: 100%;
display: grid;
grid-template-columns: 100px 1fr;
grid-gap: 50px;
padding: 50px;
&:empty {
display: none;
}
& .social-buttons {
display: grid;
grid-template-columns: 1fr;
grid-gap: 15px;
& .staff-promo {
background: #fff;
border-radius: 6px;
padding: 50px;
height: 256px;
display: grid;
grid-template-rows: auto 100px auto;
& .item {
height: 75px;
display: flex;
color: #fff;
justify-content: center;
align-items: center;
font-size: 32px;
background: rgba(255,255,255,0.2);
border-radius: 6px;
transition: 0.2s ease-in-out all;
& .promo-type {
color: #aaa;
justify-self: left;
font-size: 12px;
font-weight: bold;
letter-spacing: 0.3em;
}
& .promo-title {
font-weight: bold;
font-size: 34px;
justify-self: left;
align-self: flex-start;
letter-spacing: -0.025em;
color: #222;
}
& .promo-button {
font-size: 14px;
font-weight: bold;
text-transform: uppercase;
padding: 10px 25px;
color: #fff;
background: #aaa;
justify-self: left;
border-radius: 6px;
transition: 0.2s ease-in-out opacity;
text-decoration: none;
&.item-discord {
background: linear-gradient(135deg, #99aab5, #7289da);
}
&.item-twitter {
background: linear-gradient(135deg, #d0e6f7, #1da1f2);
}
&.item-youtube {
background: linear-gradient(135deg, #ff0000, #c20000);
}
&.item-twitch {
background: linear-gradient(135deg, #b9a3e3, #6441a5);
}
&.item-patreon {
background: linear-gradient(135deg, #ff8575, #e75744);
}
&:hover {
cursor: pointer;
opacity: 0.6;
&:hover {
transform: scale(1.05);
box-shadow: 0px 4px 16px rgba(0,0,0,0.4);
cursor: pointer;
}
}
}
}
}
.social-buttons {
display: grid;
width: 650px;
margin: 0 auto;
margin-top: 25px;
grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
grid-gap: 15px;
& .staff-promos {
display: grid;
grid-template-columns: 545px 545px 1fr;
& .item {
height: 75px;
display: flex;
color: #fff;
justify-content: center;
align-items: center;
font-size: 32px;
background: rgba(255,255,255,0.2);
border-radius: 6px;
transition: 0.2s ease-in-out all;
&:empty {
display: none;
}
&.item-discord {
background: linear-gradient(135deg, #99aab5, #7289da);
}
&.item-twitter {
background: linear-gradient(135deg, #d0e6f7, #1da1f2);
}
&.item-youtube {
background: linear-gradient(135deg, #ff0000, #c20000);
}
&.item-twitch {
background: linear-gradient(135deg, #b9a3e3, #6441a5);
}
&.item-patreon {
background: linear-gradient(135deg, #ff8575, #e75744);
}
& .staff-promo {
background: #fff;
background-position: center right;
background-size: cover;
border-radius: 6px;
padding: 50px;
height: 256px;
display: grid;
grid-template-rows: auto 100px auto;
&:hover {
transform: scale(1.1);
box-shadow: 0px 4px 16px rgba(0,0,0,0.4);
cursor: pointer;
& .promo-type {
color: #aaa;
justify-self: left;
font-size: 12px;
font-weight: bold;
letter-spacing: 0.3em;
}
& .promo-title {
font-weight: bold;
font-size: 34px;
justify-self: left;
align-self: flex-start;
letter-spacing: -0.025em;
color: #222;
}
& .promo-button {
font-size: 14px;
font-weight: bold;
text-transform: uppercase;
padding: 10px 25px;
color: #fff;
background: #aaa;
justify-self: left;
border-radius: 6px;
transition: 0.2s ease-in-out opacity;
text-decoration: none;
&:hover {
cursor: pointer;
opacity: 0.6;
}
}
}
}
}
}
......
......@@ -276,3 +276,4 @@
.card-overlay .overlay-content .button {
display: inline-block;
}
/*# sourceMappingURL=userdetail.css.map */
\ No newline at end of file
{"version":3,"sources":["userdetail.less"],"names":[],"mappings":"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","file":"userdetail.css"}
\ No newline at end of file
{"version":3,"sources":["userdetail.less"],"names":[],"mappings":"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","file":"userdetail.css"}
\ No newline at end of file
......@@ -94,32 +94,11 @@ class APIDiscoveryController extends AbstractController
*/
public function songsPopular(Request $request, int $offset = 0)
{
// TODO: Remove this later on
$em = $this->getDoctrine()->getManager();
$data = [];
$results = $em->getRepository(Song::class)->getPopular($offset);
$baseUrl = $request->getScheme() . '://' . $request->getHttpHost() . $request->getBasePath();
foreach($results as $result) {
$oneResult = [];
$oneResult['id'] = $result->getId();
$oneResult['title'] = $result->getTitle();
$oneResult['subtitle'] = $result->getSubtitle();
$oneResult['artist'] = $result->getArtist();
$oneResult['charter'] = $result->getCharter();
$oneResult['hasEasyDifficulty'] = $result->getHasEasyDifficulty();
$oneResult['hasNormalDifficulty'] = $result->getHasNormalDifficulty();
$oneResult['hasHardDifficulty'] = $result->getHasHardDifficulty();
$oneResult['hasExtremeDifficulty'] = $result->getHasExtremeDifficulty();
$oneResult['hasXDDifficulty'] = $result->getHasXDDifficulty();
$oneResult['cover'] = $baseUrl."/uploads/thumbnail/".$result->getFileReference().".jpg";
$oneResult['zip'] = $this->generateUrl('api.songs.download', array('id' => $result->getId()), UrlGeneratorInterface::ABSOLUTE_URL);
$data[] = $oneResult;
}
$response = new JsonResponse(['version' => $this->getParameter('api_version'), 'status' => 200, 'data' => $data]);
$response = new JsonResponse(['version' => $this->getParameter('api_version'), 'status' => 200, 'data' => []]);
$response->headers->set('Access-Control-Allow-Origin', '*');
return $response;
}
......
......@@ -63,23 +63,6 @@ class IndexController extends AbstractController
return $this->render('index/hot.html.twig', $data);
}
/**
* @Route("/popular", name="index.popular")
*/
public function popular(Request $request)
{
$em = $this->getDoctrine()->getManager();
$data = [];
$popularOffset = $request->query->get('popularOffset') ? $request->query->get('popularOffset') : 0;
$resultsPopularSongs = $em->getRepository(Song::class)->getPopular($popularOffset);
$data['popularSongs'] = $resultsPopularSongs;
$data['popularOffset'] = $popularOffset;
return $this->render('index/popular.html.twig', $data);
}
/**
* @Route("/support", name="index.support")
*/
......
......@@ -14,6 +14,7 @@ use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use App\Entity\ClientRelease;
use App\Entity\Song;
use App\Entity\SongPlaylist;
use App\Entity\User;
use App\Entity\SongReport;
use App\Entity\UserReport;
......@@ -337,4 +338,41 @@ class ModactionsController extends AbstractController
return $this->redirectToRoute('song.detail', array('songId' => $songId));
}
/**
* @Route("/moderation/playlist/{playlistId}/remove", name="moderation.playlist.remove")
*/
public function playlistRemove(Request $request, int $playlistId, \Swift_Mailer $mailer)
{
$em = $this->getDoctrine()->getManager();
$data = [];
$playlistToRemove = $em->getRepository(SongPlaylist::class)->findOneBy(array('id' => $playlistId));
$uploader = $em->getRepository(User::class)->findOneBy(array('id' => $playlistToRemove->getUser()));
try {
$message = (new \Swift_Message('Your playlist '.$playlistToRemove->getTitle().' was removed!'))
->setFrom('legal@spinsha.re')
->setTo($uploader->getEmail())
->setBody(
$this->renderView(
'emails/moderation/playlistRemoved.txt.twig',
['playlist' => $playlistToRemove]
), 'text/plain');
$mailer->send($message);
} catch ( \Exception $e ) { }
// Remove cover
try {
@unlink($this->getParameter('cover_path').DIRECTORY_SEPARATOR.$playlistToRemove->getFileReference().".png");
} catch(FileNotFoundException $e) {
}
$em->remove($playlistToRemove);
$em->flush();
return $this->redirectToRoute('user.detail', array('userId' => $uploader->getId()));
}
}
......@@ -108,6 +108,66 @@ class PlaylistController extends AbstractController
return $this->render('playlist/detail.html.twig', $data);
}
/**
* @Route("/playlist/edit/{playlistId}", name="playlist.edit")
* @param Request $request
* @param int $playlistId
* @return RedirectResponse|Response
*/
public function playlistEdit(Request $request, $playlistId)
{
$user = $this->getUser();
$em = $this->getDoctrine()->getManager();
$data = [];
$data['formData'] = "";
$playlist = $em->getRepository(SongPlaylist::class)->findOneBy(array('id' => $playlistId, 'user' => $user->getId()));
$form = $this->createFormBuilder()
->add('title', TextType::class, ['label' => 'Title', 'data' => $playlist->getTitle(), 'row_attr' => array('class' => 'tags-field'), 'required' => true])
->add('description', TextareaType::class, ['label' => 'Description', 'data' => $playlist->getDescription(), 'attr' => array('rows' => 5), 'row_attr' => array('class' => 'tags-field'), 'required' => false])
->add('coverPath', FileType::class, ['label' => 'Cover Image', 'row_attr' => array('class' => 'upload-field'), 'attr' => array('accept' => '.png, .jpg, .jpeg')])
->add('save', SubmitType::class, ['label' => 'Save'])
->getForm();
$form->handleRequest($request);
$data['form'] = $form->createView();
if($form->isSubmitted() && $form->isValid()) {
$formData = $form->getData();
try {
$playlist->setTitle($formData['title']);
$playlist->setDescription($formData['description']);
if($formData['coverPath']) {
// Remove old Cover
try {
@unlink($this->getParameter('cover_path').DIRECTORY_SEPARATOR.$playlist->getFileReference().".png");
} catch(FileNotFoundException $e) {
}
// Upload new Cover
$playlist->setFileReference("playlist_" . uniqid());
rename($formData['coverPath'], $this->getParameter('cover_path') . DIRECTORY_SEPARATOR . $playlist->getFileReference() . ".png");
}
$em->persist($playlist);
$em->flush();
return $this->redirectToRoute('playlist.detail', ['playlistId' => $playlist->getId()]);
} catch(Exception $e) {
$this->addFlash('error', 'Editing failed. Please report back to our development team!');
var_dump($e);
return $this->render('playlist/edit.html.twig', $data);
}
}
return $this->render('playlist/edit.html.twig', $data);
}
/**
* @Route("/playlist/{playlistId}/delete", name="playlist.delete")
......
......@@ -11,29 +11,33 @@
<title>{% block title %}{% endblock %} ~ SpinShare API</title>
<!-- Style -->
<link href="https://cdn.jsdelivr.net/gh/halfmoonui/halfmoon@1.0.3/css/halfmoon.min.css" rel="stylesheet" />
<link href="https://cdn.jsdelivr.net/gh/halfmoonui/halfmoon@1.1.1/css/halfmoon.min.css" rel="stylesheet" />
<link rel="stylesheet" href="https://cdn.materialdesignicons.com/5.4.55/css/materialdesignicons.min.css" />
<link rel="stylesheet" href="{{ asset('assets/css/apidocs.css?v=' ~ date().timestamp) }}" />
</head>
<body class="with-custom-webkit-scrollbars with-custom-css-scrollbars dark-mode" data-dm-shortcut-enabled="true" data-set-preferred-theme-onload="true">
<div class="page-wrapper with-navbar with-sidebar">
<nav class="navbar">
<nav class="navbar justify-content-between">
<div class="navbar-content">
<button class="btn btn-action" type="button" onclick="halfmoon.toggleSidebar()">
<i class="mdi mdi-menu" aria-hidden="true"></i>
<span class="sr-only">Toggle sidebar</span>
</button>
<a href="#" class="navbar-brand">
<img class="hidden-lm" src="https://spinsha.re/assets/img/logo_colored_ondark.svg" />
<img class="hidden-dm" src="https://spinsha.re/assets/img/logo_colored_onwhite.svg" />
<span>API Documentation</span>
</a>
</div>
<div class="navbar-content">
<a href="{{ path('index.index') }}" class="btn btn-danger btn-sm">Back to SpinSha.re</a>
</div>
<a href="#" class="navbar-brand">
<img class="hidden-lm" src="https://spinsha.re/assets/img/logo_colored_ondark.svg" />
<img class="hidden-dm" src="https://spinsha.re/assets/img/logo_colored_onwhite.svg" />
<span>API Documentation</span>
</a>
</nav>
<div class="sidebar">
<div class="sidebar-group">
<h5 class="sidebar-title">Getting started</h5>
<div class="sidebar-divider"></div>
<a href="{{ path('api.docs.introduction') }}" class="sidebar-link sidebar-link-with-icon {% if app.request.attributes.get('_route') == 'api.docs.introduction' %}active{% endif %}">
......
......@@ -26,36 +26,29 @@
<div class="alert alert-primary" role="alert">
<h4 class="alert-heading">Last Update</h4>
This documentation was last updated on 11/02/2020 at 17:59 CEST
This documentation was last updated on 11/28/2020 at 15:05 CEST
</div>
<div class="card">
<h2 class="card-title">11/02/2020</h2>
<h2 class="card-title">11/28/2020</h2>
<ul>
<li>Added preferred pronouns for user profiles</li>
<li>Deprecated the Open Discovery->Popular endpoint</li>
<li>Added a link to the main website</li>
</ul>
</div>
<div class="card">
<h2 class="card-title">10/14/2020</h2>
<h2 class="card-title">11/02/2020</h2>
<ul>
<li>Updated Tournament output</li>
<lI>Added Playlists</lI>
<li>Added preferred pronouns for user profiles</li>
</ul>
</div>
<div class="card">
<h2 class="card-title">09/09/2020</h2>
<h2 class="card-title">10/14/2020</h2>
<ul>
<li>Removed Charts, Reviews and SpinPlays from the UserDetail endpoint</li>
<li>Renamed the UserDetail endpoint to UserOverview</li>
<li>Added an endpoint for UserCharts, UserReviews and UserSpinPlays</li>
<li>Added song reference to the UserReviews endpoint</li>
<li>Added counts of charts, reviews and spinplays to the UserOverview endpoint</li>
<li>Ported the documentation to the main codebase</li>
<li>Added a deprecation warning to the PopularSongs endpoint</li>
<li>Added ConnectReview endpoint documentation</li>
<li>Added ConnectProfile endpoint documentation</li>
<li>Updated Tournament output</li>
<lI>Added Playlists</lI>
</ul>
</div>
</div>
......
......@@ -248,45 +248,8 @@
<br />
<div class="alert alert-secondary" role="alert">
<h4 class="alert-heading">Deprecated</h4>
This API-Endpoint will soon be removed and shouldn't been used anymore.
This API-Endpoint was deprecated and should not be used anymore.
</div>
<br />
<strong>Output Body (Success)</strong>
<pre class="code">
{
"version":1,
"status":200,
"data":[
{
"id": 3,
"title": "Isabelle Singing",
"subtitle": "K.K. Bubblegum",
"artist": "K.K. Slider",
"charter": "Ellite",
"hasEasyDifficulty": false,
"hasNormalDifficulty": false,
"hasHardDifficulty": true,
"hasExtremeDifficulty": false,
"hasXDDifficulty": false,
"cover":"https:\/\/spinsha.re\/uploads\/thumbnail\/spinshare_5e8df6fb90bd7.jpg",
"zip":"https:\/\/spinsha.re\/api\/song\/3\/download"
},
...
]
}
</pre>
<br />
<strong>Output Body (Not Found)</strong>
<pre class="code">
{
"version":1,
"status":404,
"data":[]
}
</pre>
</div>
</div>
</div>
......
......@@ -42,6 +42,7 @@
<a class="item {% if app.request.attributes.get('_route') == 'index.index' or app.request.attributes.get('_route') == 'index.new' or app.request.attributes.get('_route') == 'index.hot' or app.request.attributes.get('_route') == 'index.popular' %}active{% endif %}" href="{{ path('index.index') }}"><i class="mdi mdi-home-outline"></i></a>
<a class="item {% if app.request.attributes.get('_route') == 'index.client' %}active{% endif %}" href="{{ path('index.client') }}" title="Download Client"><i class="mdi mdi-desktop-tower-monitor"></i></a>
<a class="item {% if app.request.attributes.get('_route') == 'index.support' %}active{% endif %}" href="{{ path('index.support') }}" title="Support"><i class="mdi mdi-hand-heart"></i></a>
<a class="item" href="{{ path('api.docs.introduction') }}" title="API Documentation"><i class="mdi mdi-api"></i></a>
<a class="item {% if app.request.attributes.get('_route') == 'index.legal' %}active{% endif %}" href="{{ path('index.legal') }}" title="Legal"><i class="mdi mdi-gavel"></i></a>
</nav>
......
Hey there!
We are sorry to inform you that your playlist "{{ playlist.title }}" was removed by a moderator of our team.
This action is permanent and cannot be undone.
------------------
spinsha.re
\ No newline at end of file
......@@ -9,7 +9,6 @@
<a href="{{ path('index.index') }}" class="tab {% if app.request.attributes.get('_route') == 'index.index' %}active{% endif %}">Frontpage</a>
<a href="{{ path('index.new') }}" class="tab {% if app.request.attributes.get('_route') == 'index.new' %}active{% endif %}">New</a>
<a href="{{ path('index.hot') }}" class="tab {% if app.request.attributes.get('_route') == 'index.hot' %}active{% endif %}">Hot</a>
<a href="{{ path('index.popular') }}" class="tab {% if app.request.attributes.get('_route') == 'index.popular' %}active{% endif %}">Popular</a>
</div>
</header>
......
{% extends 'index/base.html.twig' %}
{% block indexContent %}
{#
<div class="srxd-birthday">
<div class="ceiling"></div>
<div class="cake"></div>
<div class="balloons">
<div class="frontpage">
<div class="social-buttons">
<a href="https://spinsha.re/discord" class="item item-discord"><i class="mdi mdi-discord"></i></a>
<a href="https://twitter.com/WeAreSpinShare" class="item item-twitter"><i class="mdi mdi-twitter"></i></a>
<a href="https://www.youtube.com/channel/UCh7ftpzIqlHw5p_-HXHwMBw" class="item item-youtube"><i class="mdi mdi-youtube"></i></a>
<a href="https://twitch.tv/SpinShare" class="item item-twitch"><i class="mdi mdi-twitch"></i></a>
<a href="https://patreon.com/spinshare" class="item item-patreon"><i class="mdi mdi-patreon"></i></a>
</div>
<div class="text">
<h1>Happy Birthday, Spin Rhythm XD!</h1>
<p>On this day, one year ago, Spin Rhythm XD was released on Steam!<br />Ever since that faithful day, the galaxy has not been the same!<br />We're so happy for the community Super Spin Digital gave us<br />and we wish them well for the future!</p>
<div class="staff-promos">
{% for promo in promos %}
<div class="staff-promo" style="background-image: url({{ asset('uploads/promo/' ~ promo.imagePath) }});">
<div class="promo-type" style="color: {{ promo.color }};">{{ promo.type }}</div>
<div class="promo-title" style="color: {{ promo.textColor }};">{{ promo.title|raw }}</div>
{% if promo.buttonType == 0 %}
{# Song #}
<a href="{{ path('song.detail', {songId: promo.buttonData}) }}" class="promo-button" style="background-color: {{ promo.color }};">CHECK IT OUT</a>
{% endif %}
{% if promo.buttonType == 2 %}
{# Search Query #}
<a href="{{ path('search.index', {q: promo.buttonData}) }}" class="promo-button" style="background-color: {{ promo.color }};">CHECK IT OUT</a>
{% endif %}
{% if promo.buttonType == 3 %}
{# External Link #}
<a href="{{ promo.buttonData }}" target="_blank" class="promo-button" style="background-color: {{ promo.color }};">CHECK IT OUT</a>
{% endif %}
</div>
{% endfor %}
</div>
</div>
<script>
let DOMBalloons = document.querySelector(".balloons");
for(let i = 0; i < 6; i++) {
createBalloon(i);
createBalloon(i);
createBalloon(i);
}
function createBalloon(delayIndex) {
// Create DOM Element
let DOMBalloon = document.createElement("div");
DOMBalloon.classList.add("balloon");
DOMBalloon.style.animationDelay = -delayIndex * 0.8 + "s";
DOMBalloon.style.left = (Math.random() * 100) + "%";
let randomColor = Math.random() * 100;
if(randomColor > 66) {
DOMBalloon.classList.add("balloonRed");
} else if(randomColor > 33 && randomColor < 66) {
DOMBalloon.classList.add("balloonBlue");
} else {
DOMBalloon.classList.add("balloonGreen");
}
// Random Placement
DOMBalloons.appendChild(DOMBalloon);
}
</script>
<style>
.srxd-birthday {
background: #251333;
max-width: 1114px;
width: 90%;
margin: 0 auto;
border-radius: 10px;
margin-top: 50px;
padding: 25px;
padding-top: 100px;
position: relative;
overflow: hidden;
}
.srxd-birthday .balloons {
position: absolute;
top: 0px;
left: 0px;
right: 0px;
bottom: 0px;
}
.srxd-birthday .balloons .balloon {
width: 65px;
height: 125px;
opacity: 0;
background-size: contain;
background-position: center;
background-repeat: no-repeat;
position: absolute;
animation: balloonAnim 5s linear infinite;
}
.srxd-birthday .balloons .balloonRed {
background-image: url('{{ asset('assets/img/birthday-balloonRed.svg') }}');
}
.srxd-birthday .balloons .balloonGreen {
background-image: url('{{ asset('assets/img/birthday-balloonGreen.svg') }}');
}
.srxd-birthday .balloons .balloonBlue {
background-image: url('{{ asset('assets/img/birthday-balloonBlue.svg') }}');
}
.srxd-birthday .text {
text-align: center;
}
.srxd-birthday .text h1 {
margin: 0;
font-size: 32px;
line-height: 1.1;
letter-spacing: 0.05em;
text-transform: uppercase;
font-family: 'Oswald', sans-serif;
}
.srxd-birthday .text p {
font-size: 1.15em;
}
.srxd-birthday .ceiling {
position: absolute;
left: 0px;
right: 0px;
top: 0px;
height: 70px;
background: url('{{ asset('assets/img/birthday-ceiling.svg') }}');
background-position: center;
background-size: contain;
}
.srxd-birthday .cake {
height: 100px;
background: url('{{ asset('assets/img/birthday-cake.svg') }}');
background-size: contain;
background-position: center;
background-repeat: no-repeat;
width: 90%;
margin: 0 auto;
margin-bottom: 50px;
}
@keyframes balloonAnim {
0% {
transform: translate(20px, 450px);
}
25% {
transform: translate(-20px, 307px);
}
50% {
transform: translate(20px, 164px);
opacity: 1;
}
75% {
transform: translate(-20px, 21px);
}
100% {
transform: translate(20px, -125px);
}
}
</style> #}
<div class="staff-promos">
{% for promo in promos %}
<div class="staff-promo" style="background-image: url({{ asset('uploads/promo/' ~ promo.imagePath) }});">
<div class="promo-type" style="color: {{ promo.color }};">{{ promo.type }}</div>
<div class="promo-title" style="color: {{ promo.textColor }};">{{ promo.title|raw }}</div>
{% if promo.buttonType == 0 %}
{# Song #}
<a href="{{ path('song.detail', {songId: promo.buttonData}) }}" class="promo-button" style="background-color: {{ promo.color }};">CHECK IT OUT</a>
{% endif %}
{% if promo.buttonType == 2 %}
{# Search Query #}
<a href="{{ path('search.index', {q: promo.buttonData}) }}" class="promo-button" style="background-color: {{ promo.color }};">CHECK IT OUT</a>
{% endif %}
{% if promo.buttonType == 3 %}
{# External Link #}
<a href="{{ promo.buttonData }}" target="_blank" class="promo-button" style="background-color: {{ promo.color }};">CHECK IT OUT</a>
{% endif %}
</div>
{% endfor %}
</div>
<div class="social-buttons">
<a href="https://spinsha.re/discord" class="item item-discord"><i class="mdi mdi-discord"></i></a>
<a href="https://twitter.com/WeAreSpinShare" class="item item-twitter"><i class="mdi mdi-twitter"></i></a>
<a href="https://www.youtube.com/channel/UCh7ftpzIqlHw5p_-HXHwMBw" class="item item-youtube"><i class="mdi mdi-youtube"></i></a>
<a href="https://twitch.tv/SpinShare" class="item item-twitch"><i class="mdi mdi-twitch"></i></a>
<a href="https://patreon.com/spinshare" class="item item-patreon"><i class="mdi mdi-patreon"></i></a>
</div>
{% endblock %}
\ No newline at end of file
{% extends 'index/base.html.twig' %}
{% block indexContent %}
<div class="song-row song-row-popular">
<div class="song-list">
{% for song in popularSongs %}
{{ include('components/song-item.html.twig', {song: song}) }}
{% endfor %}
</div>
<div class="pagination">
{% if popularOffset > 0 %}
<a href="{{ path('index.popular', {popularOffset: popularOffset - 1}) }}" class="button"><i class="mdi mdi-chevron-left"></i> PREVIOUS</a>
{% else %}
<a class="button button-disabled"><i class="mdi mdi-chevron-left"></i> PREVIOUS</a>
{% endif %}
{% if popularSongs|length < 12 %}
<a class="button button-disabled">NEXT <i class="mdi mdi-chevron-right"></i></a>
{% else %}
<a href="{{ path('index.popular', {popularOffset: popularOffset + 1}) }}" class="button">NEXT <i class="mdi mdi-chevron-right"></i></a>
{% endif %}
</div>
</div>
{% endblock %}
\ No newline at end of file
......@@ -27,6 +27,32 @@
<div class="playlist-description">
{{ playlist.description|nl2br }}
</div>
{% if app.user == user %}
<div class="playlist-actions">
<div class="action-row">
<a href="{{ path('playlist.edit', {playlistId: playlist.id}) }}" class="action">
<div class="icon">
<i class="mdi mdi-pencil"></i>
</div>
</a>
<a href="{{ path('playlist.delete', {playlistId: playlist.id}) }}" class="action">
<div class="icon">
<i class="mdi mdi-delete"></i>
</div>
</a>
</div>
</div>
{% elseif is_granted('ROLE_MODERATOR') %}
<div class="playlist-actions">
<div class="action-row">
<a href="{{ path('moderation.playlist.remove', {playlistId: playlist.id}) }}" class="action">
<div class="icon">
<i class="mdi mdi-delete"></i>
</div>
</a>
</div>
</div>
{% endif %}
{% if not playlist.isOfficial %}
<div class="playlist-uploader">
<div class="label">Created by</div>
......
{% extends 'base.html.twig' %}
{% block title %}Edit a Playlist{% endblock %}
{% block content %}
<section class="section-upload">
{{ form_start(form) }}
{% for label, messages in app.flashes %}
{% for message in messages %}
<div class="flashbang flashbang-{{ label }}">
{{ message }}
</div>
{% endfor %}
{% endfor %}
<div class="box">
<div class="title">Edit Playlist</div>
<div class="tags-input">
{{ form_row(form.title) }}
</div>
<div class="tags-input">
{{ form_row(form.description) }}
</div>
<div class="upload-input">
{{ form_row(form.coverPath) }}
<div class="upload-input-select active">
<i class="mdi mdi-folder-upload"></i>
<div>SELECT A COVER<br />FOR YOUR PLAYLIST</div>
</div>
<div class="upload-input-selected">
<i class="mdi mdi-folder-image"></i>
<div></div>
</div>
</div>
<div class="actions">
{{ form_row(form.save) }}
</div>
</div>
{{ form_end(form) }}
</section>
{% endblock %}
{% block scripts %}
<script src="{{ asset('assets/js/upload.js') }}"></script>
{% endblock %}
{% block styles %}
<link rel="stylesheet" href="{{ asset('assets/css/upload.css?v=' ~ date().timestamp) }}" />
{% endblock %}
......@@ -19,15 +19,12 @@
</div>
{% else %}
<div class="list-noresults">
<!-- <div class="noresults-text">This user did not create any playlists yet.</div> -->
<div class="noresults-text">Coming Soon!</div>
<div class="noresults-text">This user did not create any playlists yet.</div>
</div>
{% endif %}
</div>
{% if(is_granted('ROLE_MODERATOR') and user.id == app.user.id) %}
<div class="playlist-action">
<a href="{{ path('playlist.create') }}" class="button">Add New</a>
</div>
{% endif %}
{% endblock %}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment