尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證界隈曲の情報をまとめたwebアプリ
翻譯準備中
取自儲存庫 README
正在載入完整 README。 以下為已儲存的摘錄。
全て歌詞の所為です。とは 『全て歌詞の所為です。』とは「界隈曲」と呼ばれる音楽ジャンルに焦点を当てた界隈曲情報掲載サイトです。 以下のような機能があります。 1\. 前提条件 gitコマンドとpythonコマンドが使えることが前提です。 pythonコマンドが未定義の場合、python3等のコマンドを用いてください。 pythonのvenvを利用して仮想環境.envを作成します。 ※ cpコマンドを利用できない場合は、別のファイルをコピーするコマンドかエクスプローラーを利用してください。 9\. 鍵の生成 以下のpythonコードを実行して鍵を生成します。 鍵の値はコピーしてください。 quit()実行時にエラーが出力されることがありますが、気にしなくて大丈夫です。 10\. local_settings.pyの設定 config/local_settings.pyを開き、コピーした値をSECRET_KEYに代入します。 12\. データベースの初期値の設定 マイグレーションした直後はデータベースにデータが入っておらずエラーになる処理がある為、以下のコマンドを実行して初期値を追加します。 初期値には全てあなたの所為です。の全曲と『12』・『15』・『17』が登録されています。檢視完整 README ↗
『全て歌詞の所為です。』とは「界隈曲」と呼ばれる音楽ジャンルに焦点を当てた界隈曲情報掲載サイトです。
以下のような機能があります。
1. 前提条件
gitコマンドとpythonコマンドが使えることが前提です。
pythonコマンドが未定義の場合、python3等のコマンドを用いてください。
2. クローン
git clone https://github.com/izumin2000/subekashi.git --depth 1
3. カレントディレクトリの変更
cd subekashi
4. 仮想環境の作成(必要に応じて)
pythonのvenvを利用して仮想環境.envを作成します。
python -m venv .env
5. 仮想環境の起動(必要に応じて)
@REM Windows PowerShell用
.env/Scripts/activate.ps1;
@REM Windows CMD用
.env\Scripts\activate.bat
# Linux用
source .env/bin/activate
6. ライブラリのインストール
pip install -r requirements.txt
7. local_setting.pyの作成
@REM Windows用
copy config/local_settings_sample.py config/local_settings.py
# Linux用
cp config/local_settings_sample.py config/local_settings.py
※ cpコマンドを利用できない場合は、別のファイルをコピーするコマンドかエクスプローラーを利用してください。
8. シェルの起動
python manage.py shell
9. 鍵の生成
以下のpythonコードを実行して鍵を生成します。
鍵の値はコピーしてください。
from django.core.management.utils import get_random_secret_key
get_random_secret_key()
quit()
quit()実行時にエラーが出力されることがありますが、気にしなくて大丈夫です。
10. local_settings.pyの設定
config/local_settings.pyを開き、コピーした値をSECRET_KEYに代入します。
SECRET_KEY = "=*************************************************"
11. マイグレーション
python manage.py makemigrations
python manage.py migrate
12. データベースの初期値の設定
マイグレーションした直後はデータベースにデータが入っておらずエラーになる処理がある為、以下のコマンドを実行して初期値を追加します。
python manage.py loaddata data.json
初期値には全てあなたの所為です。の全曲と『12』・『15』・『17』が登録されています。
13. 定数ファイルの作成(必要に応じて)
全て歌詞の所為です。では高頻度で変わる定数ファイルを.gitignore対象でsubekashi/constants/dynamicに保存しております。
必要に応じて以下のコマンドを実行して定数ファイルを生成してください。
python manage.py const
1. 仮想環境の起動(venvを利用している場合)
仮想環境.envを起動します。
@REM Windows PowerShell用
.env/Scripts/activate.ps1;
@REM Windows CMD用
.env\Scripts\activate.bat
# Linux用
source .env/bin/activate
2. サーバー起動
python manage.py runserver
3. アクセス
http://subekashi.localhost:8000/ にアクセスとアプリの画面が表示されます。
エラーが発生した場合はissueで報告してください。
全て歌詞の所為です。上で登録された情報はRESTfulなAPIで提供しています。
APIは全てのオリジンから利用できます(Access-Control-Allow-Origin: *)。Cookie等の認証情報を付けたクロスオリジンリクエストには対応していません。
エンドポイント: https://lyrics.imicomweb.com/api/song メソッド: GET, HEAD, OPTIONS レート制限: 2リクエスト/秒
全て歌詞の所為です。に登録された曲の情報を取得できます。
ユーザーが削除した曲は含まれません(/api/song/{song_id}で取得した場合も404になります)。
テキスト検索(部分一致、大文字小文字を区別しない)
title: タイトルで検索(最大500文字)author: 作者名で検索(最大500文字)lyrics: 歌詞で検索(最大10000文字)url: URLで検索(最大500文字)
keyword: タイトル、作者、歌詞、URLを横断検索(最大500文字)
完全一致検索
title_exact: タイトルで完全一致検索(最大500文字)author_exact: 作者名で完全一致検索(最大500文字)数値範囲フィルタ(1以上の値のみ)
view_gte: 視聴回数の下限(1以上の整数)view_lte: 視聴回数の上限(1以上の整数)like_gte: いいね数の下限(1以上の整数)like_lte: いいね数の上限(1以上の整数)日時範囲フィルタ
upload_time_gte: アップロード日時の下限(ISO 8601形式)upload_time_lte: アップロード日時の上限(ISO 8601形式)真偽値フィルタ
is_subeana: すべあな曲かどうかis_joke: ネタ曲かどうかis_draft: 下書きかどうかis_original: オリジナル模倣曲かどうかis_inst: インスト曲かどうかis_deleted: 動画が非公開/削除済みかどうかis_limited: すべかし内で限定公開かどうかis_special: スペシャルデザインの曲かどうかis_collab: 合作の曲(作者が2人以上の曲)かどうかis_lack: 不完全な曲(情報が欠けている曲)
True で不完全な曲のみ、False で不完全な曲を除外します(以前は False を指定しても絞り込まれませんでした)特殊フィルタ
imitate: 模倣元の曲のsong ID(整数)imitated: 被模倣の曲のsong ID(整数)guesser: 候補(タイトル・チャンネル・URLを検索、最大500文字)mediatypes: メディアタイプ(正規表現対応、最大100文字)ページネーション
page: ページ番号(デフォルト: 1、最小: 1)size: 1ページあたりの件数(デフォルト: 50、最小: 1)ソート
sort: ソート順を指定
id, -id, title, -title, author, -author, upload_time, -upload_time, view, -view, like, -like, post_time, -post_time, imitate_count, -imitate_count, imitated_count, -imitated_count, random-を付けると降順、付けないと昇順idは登録日時順(登録が古い順)、-idは登録が新しい順imitate_countは模倣元の数(その曲が模倣している曲の数)、imitated_countは模倣曲の数(その曲を模倣している曲の数)の順。数が同じ曲は登録が新しい順randomを指定するとランダムソート注意事項
mediatypesを指定しない限り、自動的にYouTube動画のみに絞り込まれます一覧取得時
{
"count": 100,
"page": 1,
"size": 50,
"max_page": 2,
"result": [
{
"id": 1,
"title": "タイトル",
"authors": [
{
"id": 1,
"name": "作者"
},
...
],
"url": [
"https://youtu.be/VIDEO-00000",
"https://youtu.be/VIDEO-00001"
],
...
}
]
}
count: 検索条件に一致する曲の総数page: 現在のページ番号size: 1ページあたりの件数max_page: 最大ページ数result: 曲のリスト個別取得時(/api/song/{song_id})
{
"id": 1,
"title": "タイトル",
"authors": [
{
"id": 1,
"name": "作者"
},
...
],
"url": [
"https://youtu.be/VIDEO-00000",
"https://youtu.be/VIDEO-00001"
],
...
}
urlフィールドについて
urlは登録されたURLの配列です。複数のURLが登録されている場合はすべて含まれます。URLが未登録の場合は空配列[]が返されます。
imitates / imitatedsフィールドについて
imitatesはこの曲が模倣している曲のsong IDの整数配列です。imitatedsはこの曲を模倣している曲のsong IDの整数配列(imitatesの逆参照)です。いずれも模倣関係がない場合は空配列[]が返されます。
エンドポイント: https://lyrics.imicomweb.com/api/ad メソッド: GET, HEAD, OPTIONS, PUT, PATCH
全て歌詞の所為です。に登録された宣伝の情報を取得・更新できます。
view(閲覧数)とclick(クリック数)フィールドのみ更新可能
エンドポイント: https://lyrics.imicomweb.com/api/ai メソッド: GET, HEAD, OPTIONS, PUT, PATCH
全て蛇の目の所為です。が作成した歌詞の情報を取得・更新できます。
score(評価スコア)フィールドのみ更新可能
メソッド: GET, HEAD, OPTIONS レート制限: 2リクエスト/秒
作者・プレラ・編集履歴などの情報を取得できます。/api/<名前>で一覧を、/api/<名前>/{id}で1件を取得します。並び順に記載が無いものはID順です。
| エンドポイント | 内容 | 絞り込み(完全一致) |
|---|---|---|
| /api/author | 作者。aliases(作者に登録された別名のname・alias_type)とlinks(リンクのURLの配列)を含む | なし |
| /api/prush | プレラ(プレミアラッシュ) | なし |
| /api/history | 編集履歴(新しい順) | song(song ID)、author(作者のID)、editor(編集者のID) |
| /api/contact | 回答済みのお問い合わせ(新しい順) | なし |
| /api/word | 全て蛇の目の所為です。の単語の入れ替え候補 | word、hinshi、katsuyou |
| /api/stats | 月ごとの統計(年・月の順) | songrange(all、subeana、xx) |
| /api/article | 記事(公開日時の新しい順)。/api/article/{article_id}で1件を取得 | tag |
ページネーション
page: ページ番号(デフォルト: 1、最小: 1)size: 1ページあたりの件数(デフォルト: 50、最小: 1、最大: 1000。1000を超える値は1000になります)一覧はSong APIと同じくcount・page・size・max_page・resultを返します。
注意事項
editorは編集者のIDです。編集履歴を非公開にしている編集者の場合はnullになり、その編集者のIDで絞り込んだ結果は空になりますユーザーが曲の編集画面の「削除」から送信すると、曲は論理削除され(Song.is_removedがTrue)、DBには残ります。
削除した曲は、検索・作者のページ・API等に表示されません。曲のページには、曲名と直近の削除理由、「削除を取り消す」ボタンが表示されます。
ユーザーは曲のページの「削除を取り消す」ボタンで復元できます。ただし、ロックされた曲と、曲のURLが削除していない他の曲に登録されている曲(削除している間に、その曲だけに紐づいていたURLが別の曲に登録された場合)は、ボタンが表示されず復元できません。
管理サイトで復元する場合は、次の手順で行います。
/admin/subekashi/song/)で、「is removed」を「はい」で絞り込む作者・URL・模倣関係は、削除前のまま戻ります。
管理サイトで復元する場合は、URLが他の曲に登録されていても復元できてしまい、そのURLが2曲に紐づくため、管理サイトのSongLinkで確かめてください。
python manage.py delete <song_id>を実行します。曲のURLは「削除された曲のURL」(SongLink.is_removedがTrue)になり、再び登録できなくなります。URLを登録できるままにする場合は、--keep-linksを付けます。
全て歌詞の所為です。ではプルリクエストを積極的に受け入れています。
主に以下のことをやっていただけると嬉しいです。
その他、issueの起票だけでも助かります。
マージの場所はmainでお願いします。
PRにはClaude Code Actionsを使用しております。
全て歌詞の所為です。ではXSS等の対策として、Content Security Policy(CSP)を設定しています(subekashi/middleware/csp.py)。
コードや記事を追加する際は以下に注意してください。
onclick・oninput等のイベントハンドラ属性は実行されません。JSの文字列で組み立ててinnerHTMLに入れるHTMLも同様です。addEventListenerで登録してください
data-tutorial="キー"、入力の変更時のフォームの送信は<form data-auto-submit>で行えます<script>にはnonce="{{ csp_nonce }}"を付けてください。srcで読み込むスクリプトには不要ですeval・new Function・setTimeout("文字列")・javascript:で始まるURLは使えませんsubekashi/middleware/csp.pyのCSP_DIRECTIVESにドメインを追加してくださいintegrity属性とcrossorigin="anonymous"を付けてくださいcsrftokenクッキーはJSから読み取れません。JSからPOST・PUT等を送るページでは、テンプレートに{% csrf_token %}を置き、getCSRF()でトークンを取得してくださいinput要素をまとめて取得する処理では、{% csrf_token %}が出力するhiddenのinputも含まれるため、必要に応じて:not([type="hidden"])で除外してください{% csrf_token %}を入れないでください(トークンがURLに含まれてしまうため)/api/以下のレスポンスは全てのサイトから読み取れます(Cookieは送られません)。他のサイトに読み取られて困る情報を/api/以下で返さないでくださいdjango.utils.html.escape()、JSではescapeHtml()でエスケープしてください。テンプレートで|safeを使う値にユーザーの入力値を含めないでください<script>には表示時に自動でnonceが付与されるため、そのまま実行されます。記事のHTMLに書いたonclick等は実行されないため、<script>内でaddEventListenerを使ってくださいarticle/static/article/image/に置いてくださいCSP_DIRECTIVESへの追加が必要ですテンプレート・静的JSにイベントハンドラ属性が含まれていると、subekashi/tests/test_security.pyのテストが失敗します。
本ソフトでは表示フォントに「源全角ゴ改」(https://drive.google.com/drive/folders/19WidrJoCmI5qLJV-eR_ydURIwxB2-DS) を使用しています。 Licensed under SIL Open Font License 1.1 http://scripts.sil.org/OFL © 2021 全て語り手の所為です。
本ソフトでは表示フォントに「Noto Sans JP」(https://fonts.google.com/selection?query=noto) を使用しています。 Licensed under SIL Open Font License 1.1 http://scripts.sil.org/OFL © 2014-2021 Adobe (http://www.adobe.com/), with Reserved Font Name 'Source'