Chandler
diff --git a/Web/Presenters/templates/Admin/EditMusic.xml b/Web/Presenters/templates/Admin/EditMusic.xml
new file mode 100644
index 00000000..7ae856f1
--- /dev/null
+++ b/Web/Presenters/templates/Admin/EditMusic.xml
@@ -0,0 +1,65 @@
+{extends "@layout.xml"}
+
+{block title}
+ {_edit} {$audio->getName()}
+{/block}
+
+{block heading}
+ {$audio->getName()}
+{/block}
+
+{block content}
+
+{/block}
diff --git a/Web/Presenters/templates/Admin/EditPlaylist.xml b/Web/Presenters/templates/Admin/EditPlaylist.xml
new file mode 100644
index 00000000..7c6e21cd
--- /dev/null
+++ b/Web/Presenters/templates/Admin/EditPlaylist.xml
@@ -0,0 +1,54 @@
+{extends "@layout.xml"}
+
+{block title}
+ {_edit} {$playlist->getName()}
+{/block}
+
+{block heading}
+ {$playlist->getName()}
+{/block}
+
+{block content}
+
+{/block}
diff --git a/Web/Presenters/templates/Admin/Music.xml b/Web/Presenters/templates/Admin/Music.xml
new file mode 100644
index 00000000..a2b61a0d
--- /dev/null
+++ b/Web/Presenters/templates/Admin/Music.xml
@@ -0,0 +1,135 @@
+{extends "@layout.xml"}
+{var $search = $mode === "audios"}
+
+{block title}
+ Поиск музыки
+{/block}
+
+{block heading}
+ Музыка
+{/block}
+
+{block searchTitle}
+ {include title}
+{/block}
+
+{block content}
+
+
+
+ {if $mode === "audios"}
+ {var $audios = iterator_to_array($audios)}
+ {var $amount = sizeof($audios)}
+
+
+ ID |
+ {_admin_author} |
+ Исполнитель |
+ {_admin_title} |
+ Жанр |
+ Explicit |
+ Изъято |
+ Удалено |
+ Создан |
+ Действия |
+
+
+
+
+ {$audio->getId()} |
+
+ {var $owner = $audio->getOwner()}
+
+
+
+
+
+
+ {$owner->getCanonicalName()}
+
+ {_admin_banned}
+ |
+ {$audio->getPerformer()} |
+ {$audio->getTitle()} |
+ {$audio->getGenre()} |
+ {$audio->isExplicit() ? tr("yes") : tr("no")} |
+
+ {$audio->isWithdrawn() ? tr("yes") : tr("no")}
+ |
+
+ {$audio->isDeleted() ? tr("yes") : tr("no")}
+ |
+ {$audio->getPublicationTime()} |
+
+
+ Редактировать
+
+ |
+
+
+ {else}
+ {var $playlists = iterator_to_array($playlists)}
+ {var $amount = sizeof($playlists)}
+
+
+ ID |
+ {_admin_author} |
+ Название |
+ Создан |
+ Действия |
+
+
+
+
+ {$playlist->getId()} |
+
+ {var $owner = $playlist->getOwner()}
+
+
+
+
+
+
+ {$owner->getCanonicalName()}
+
+ {_admin_banned}
+ |
+
+
+
+
+
+
+ {$playlist->getName()}
+ |
+ {$playlist->getCreationTime()} |
+
+
+ Редактировать
+
+ |
+
+
+ {/if}
+
+
+
+ {var $isLast = ((10 * (($_GET['p'] ?? 1) - 1)) + $amount) < $count}
+
+
«
+
»
+
+{/block}
diff --git a/Web/Presenters/templates/Audio/List.xml b/Web/Presenters/templates/Audio/List.xml
new file mode 100644
index 00000000..e9b8a686
--- /dev/null
+++ b/Web/Presenters/templates/Audio/List.xml
@@ -0,0 +1,86 @@
+{extends "../@layout.xml"}
+
+{block title}Аудиозаписи{/block}
+
+{block header}
+
+{/block}
+
+{block content}
+ {include "tabs.xml", mode => "list", listText => ($isMy ? "Моя музыка" : $owner->getCanonicalName())}
+
+
+
+
+
Плейлисты
+
+
+
+
+ {include "../components/nothing.xml"}
+
+
+
+
+
+
{$playlist->getName()}
+
+
+
+
+
+
+
Музыка
+
+
+
+
+ {include "../components/nothing.xml"}
+
+
+ {foreach $audios as $audio}
+ {include "player.xml",
+ audio => $audio,
+ canAdd => !$isMy && !isMyClub,
+ canRemove => $isMy || !isMyClub,
+ canEdit => $audio->getOwner()->getId() === $thisUser->getId() || !isMyClub,
+ deleteOnClick => "removeAudio({$audio->getId()})",
+ editOnClick => "editAudio({$audio->getId()}, `{$audio->getTitle()}`, `{$audio->getPerformer()}`, `{$audio->getGenre()}`, `{$audio->getLyrics()}`)"
+ }
+ {/foreach}
+
+
+
+ {script "js/node_modules/umbrellajs/umbrella.min.js"}
+ {script "js/node_modules/dashjs/dist/dash.all.min.js"}
+
+ {include "player.js.xml", audios => $audios}
+
+
+
+
+ {include "../components/nothing.xml"}
+
+{/block}
diff --git a/Web/Presenters/templates/Audio/New.xml b/Web/Presenters/templates/Audio/New.xml
new file mode 100644
index 00000000..f4e54d69
--- /dev/null
+++ b/Web/Presenters/templates/Audio/New.xml
@@ -0,0 +1,29 @@
+{extends "../@layout.xml"}
+
+{block title}Аудиозаписи{/block}
+
+{block header}
+ Новое
+{/block}
+
+{block content}
+ {include "tabs.xml", mode => "new"}
+
+
+
+ {include "../components/nothing.xml"}
+
+
+ {foreach $audios as $audio}
+ {include "player.xml", audio => $audio, addOnClick => "addAudio({$audio->getId()})"}
+ {/foreach}
+
+
+
+ {script "js/node_modules/umbrellajs/umbrella.min.js"}
+ {script "js/node_modules/dashjs/dist/dash.all.min.js"}
+
+ {include "player.js.xml", audios => $audios}
+
+
+{/block}
diff --git a/Web/Presenters/templates/Audio/NewPlaylist.xml b/Web/Presenters/templates/Audio/NewPlaylist.xml
new file mode 100644
index 00000000..4c600406
--- /dev/null
+++ b/Web/Presenters/templates/Audio/NewPlaylist.xml
@@ -0,0 +1,81 @@
+{extends "../@layout.xml"}
+
+{block title}
+ Создать плейлист
+{/block}
+
+{block header}
+ {include title}
+{/block}
+
+{block content}
+ {include "tabs.xml", mode => "list"}
+
+
+
+
+
+
+
+{/block}
diff --git a/Web/Presenters/templates/Audio/Playlist.xml b/Web/Presenters/templates/Audio/Playlist.xml
new file mode 100644
index 00000000..ede4021d
--- /dev/null
+++ b/Web/Presenters/templates/Audio/Playlist.xml
@@ -0,0 +1,110 @@
+{extends "../@layout.xml"}
+
+{block title}Плейлист{/block}
+
+{block header}
+ {include title}
+{/block}
+
+{block content}
+ {include "tabs.xml"}
+
+
+
+ {if $edit}
+ {if $edit}{/if}
+
+{/block}
diff --git a/Web/Presenters/templates/Audio/Popular.xml b/Web/Presenters/templates/Audio/Popular.xml
new file mode 100644
index 00000000..fccb7139
--- /dev/null
+++ b/Web/Presenters/templates/Audio/Popular.xml
@@ -0,0 +1,29 @@
+{extends "../@layout.xml"}
+
+{block title}Аудиозаписи{/block}
+
+{block header}
+ Популярное
+{/block}
+
+{block content}
+ {include "tabs.xml", mode => "popular"}
+
+
+
+ {include "../components/nothing.xml"}
+
+
+ {foreach $audios as $audio}
+ {include "player.xml", audio => $audio, addOnClick => "addAudio({$audio->getId()})"}
+ {/foreach}
+
+
+
+ {script "js/node_modules/umbrellajs/umbrella.min.js"}
+ {script "js/node_modules/dashjs/dist/dash.all.min.js"}
+
+ {include "player.js.xml", audios => $audios}
+
+
+{/block}
diff --git a/Web/Presenters/templates/Audio/Search.xml b/Web/Presenters/templates/Audio/Search.xml
new file mode 100644
index 00000000..830c9698
--- /dev/null
+++ b/Web/Presenters/templates/Audio/Search.xml
@@ -0,0 +1,77 @@
+{extends "../@layout.xml"}
+
+{block title}Аудиозаписи{/block}
+
+{block header}
+ Поиск
+{/block}
+
+{block content}
+
+ {include "tabs.xml", mode => "search"}
+
+
+
+
+
+
+
Плейлисты
+
+
+ {include "../components/nothing.xml"}
+
+
+
+
+
Треки
+
+ {include "../components/nothing.xml"}
+
+
+ {include "player.xml", audio => $audio, addOnClick => "addAudio({$audio->getId()})"}
+
+
+
+
+ {script "js/node_modules/umbrellajs/umbrella.min.js"}
+ {script "js/node_modules/dashjs/dist/dash.all.min.js"}
+
+ {include "player.js.xml", audios => $audios}
+
+
+
+ {include "../components/nothing.xml"}
+
+
+{/block}
diff --git a/Web/Presenters/templates/Audio/player.js.xml b/Web/Presenters/templates/Audio/player.js.xml
new file mode 100644
index 00000000..2d0704fa
--- /dev/null
+++ b/Web/Presenters/templates/Audio/player.js.xml
@@ -0,0 +1,144 @@
+
diff --git a/Web/Presenters/templates/Audio/player.xml b/Web/Presenters/templates/Audio/player.xml
new file mode 100644
index 00000000..58910a51
--- /dev/null
+++ b/Web/Presenters/templates/Audio/player.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+ {$audio->getTitle()}
+
+
+
+
+
+ {$audio->getPerformer()}
+
+
+
+
+
+ {_audio_embed_withdrawn}
+
+
+
+
+
+
+
+ {$audio->getFormattedLength()}
+
+
+
+
+
+
diff --git a/Web/Presenters/templates/Audio/tabs.xml b/Web/Presenters/templates/Audio/tabs.xml
new file mode 100644
index 00000000..583c9297
--- /dev/null
+++ b/Web/Presenters/templates/Audio/tabs.xml
@@ -0,0 +1,73 @@
+
+
+
+
+
diff --git a/Web/Presenters/templates/User/Settings.xml b/Web/Presenters/templates/User/Settings.xml
index e61f900d..aab61ee2 100644
--- a/Web/Presenters/templates/User/Settings.xml
+++ b/Web/Presenters/templates/User/Settings.xml
@@ -597,6 +597,17 @@
{_my_photos}
|
+
+
+
+
+ |
+
+ Мои Аудиозаписи
+ |
diff --git a/Web/routes.yml b/Web/routes.yml
index 6de8826b..bcaeaeb9 100644
--- a/Web/routes.yml
+++ b/Web/routes.yml
@@ -195,6 +195,16 @@ routes:
handler: "Audio->view"
- url: "/audio{num}_{num}/embed.xhtml"
handler: "Audio->embed"
+ - url: "/audio{num}/listen"
+ handler: "Audio->listen"
+ - url: "/audios/search"
+ handler: "Audio->search"
+ - url: "/audios/newPlaylist"
+ handler: "Audio->newPlaylist"
+ - url: "/playlist{num}_{num}"
+ handler: "Audio->playlist"
+ - url: "/audio{num}/action"
+ handler: "Audio->action"
- url: "/{?!club}{num}"
handler: "Group->view"
placeholders:
@@ -335,6 +345,12 @@ routes:
handler: "Admin->bannedLink"
- url: "/admin/bannedLink/id{num}/unban"
handler: "Admin->unbanLink"
+ - url: "/admin/music"
+ handler: "Admin->music"
+ - url: "/admin/music/{num}/edit"
+ handler: "Admin->editMusic"
+ - url: "/admin/playlist/{num}/edit"
+ handler: "Admin->editPlaylist"
- url: "/upload/photo/{text}"
handler: "VKAPI->photoUpload"
- url: "/method/{text}.{text}"
diff --git a/Web/static/img/common.png b/Web/static/img/common.png
new file mode 100644
index 00000000..0c54bf0f
Binary files /dev/null and b/Web/static/img/common.png differ
diff --git a/Web/static/img/song.jpg b/Web/static/img/song.jpg
new file mode 100644
index 00000000..38305358
Binary files /dev/null and b/Web/static/img/song.jpg differ
diff --git a/install/sqls/gamma-00000-disco.sql b/install/sqls/gamma-00000-disco.sql
index 5039ce8c..1e0269ad 100644
--- a/install/sqls/gamma-00000-disco.sql
+++ b/install/sqls/gamma-00000-disco.sql
@@ -59,6 +59,7 @@ CREATE TABLE IF NOT EXISTS `playlists` (
`owner` bigint NOT NULL,
`name` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_520_ci NOT NULL,
`description` varchar(2048) DEFAULT NULL,
+ `cover_photo_id` bigint unsigned DEFAULT NULL,
`length` int unsigned NOT NULL DEFAULT '0',
`special_type` tinyint unsigned NOT NULL DEFAULT '0',
`created` bigint unsigned DEFAULT NULL,
|