中学生にもわかる！音楽共有SNS「DailyBeat」の仕組み（後編）

前編に続いて、DailyBeatの主要な機能について説明していくよ。

### 3. 楽曲投稿機能

楽曲投稿機能は、こんな感じで作られているんだ：

1. ユーザーが曲名、アーティスト名、ジャンルなどを入力する
2. 入力された情報をデータベースに保存する
3. 保存された情報をタイムラインに表示する

例えば、こんなプログラムを書くんだ：

```python
@app.route('/post', methods=['POST'])
def post_song():
    title = request.form['title']
    artist = request.form['artist']
    new_song = DailySong(title=title, artist=artist, user_id=current_user.id)
    db.session.add(new_song)
    db.session.commit()
    return "投稿完了！"
```

この例では、`DailySong`というデータベースのテーブルに新しい曲の情報を追加しているんだ。

### 4. タイムライン機能

タイムライン機能は、こんな仕組みで作られているよ：

1. データベースから最新の投稿を取得する
2. 取得した投稿を時間順に並べ替える
3. Webページに表示する

例えば、こんなプログラムを書くんだ：

```python
@app.route('/timeline')
def timeline():
    songs = DailySong.query.order_by(DailySong.timestamp.desc()).limit(20).all()
    return render_template('timeline.html', songs=songs)
```

この例では、`DailySong.query`でデータベースから情報を取得し、`order_by`で並べ替え、`limit(20)`で最新20件に絞り込んでいるんだ。

#### IT用語解説

- **タイムライン**：SNSで、投稿を時間順に並べて表示する機能のこと。新しい投稿が上に来るようになっているよ。

- **クエリ**：データベースに対して、「こういう情報が欲しい」と要求すること。例えば、「最新の20件の投稿が欲しい」というクエリを送ることができるんだ。

### 5. フォロー機能

フォロー機能は、こんな感じで作られているんだ：

1. フォローしたいユーザーを選択する
2. 選択したユーザーとフォローする人の関係をデータベースに保存する
3. フォローしているユーザーの投稿をタイムラインに表示する

例えば、こんなプログラムを書くんだ：

```python
@app.route('/follow/<username>')
def follow(username):
    user_to_follow = User.query.filter_by(username=username).first()
    current_user.followed.append(user_to_follow)
    db.session.commit()
    return f"{username}さんをフォローしました！"
```

この例では、`current_user.followed.append`で、フォローする相手をリストに追加しているんだ。

### 6. 楽曲再生機能

楽曲再生機能は、Spotify Web Playback SDKという技術を使って作られているよ。これにより、DailyBeat内で直接音楽を再生できるんだ。

例えば、こんなプログラムを書くんだ：

```javascript
window.onSpotifyWebPlaybackSDKReady = () => {
    const player = new Spotify.Player({
        name: 'DailyBeat Player',
        getOAuthToken: callback => { callback(token); }
    });
    player.connect();
};
```

この例では、Spotify Web Playback SDKを使って音楽プレイヤーを初期化しているんだ。

#### IT用語解説

- **SDK（ソフトウェア開発キット）**：アプリケーションを開発するための道具箱のようなもの。Spotifyの音楽を再生するための特別な道具が入っているんだ。

### 7. 開発中に苦労した機能

DailyBeatを開発する中で、特に苦労したのが「タイムラインのページネーション」という機能だよ。これは、たくさんの投稿がある場合に、ページを分けて表示する機能なんだ。

例えば、こんなプログラムを書くんだ：

```python
@app.route('/timeline')
def timeline():
    page = request.args.get('page', 1, type=int)
    posts = DailySong.query.order_by(DailySong.timestamp.desc()).paginate(
        page=page, per_page=10, error_out=False)
    next_url = url_for('timeline', page=posts.next_num) if posts.has_next else None
    prev_url = url_for('timeline', page=posts.prev_num) if posts.has_prev else None
    return render_template('timeline.html', posts=posts.items,
                           next_url=next_url, prev_url=prev_url)
```

この機能を作るのに苦労した点は：
1. 1ページに表示する投稿数を決めること
2. 次のページ、前のページへのリンクを作ること
3. 速く動くようにすること

これらの問題を解決するために、いろいろな方法を学んだんだ。

#### IT用語解説

- **ページネーション**：たくさんの情報を複数のページに分けて表示する機能のこと。本のページをめくるように、Webページでも情報をページごとに見ることができるんだ。

## まとめ

DailyBeatは、音楽を好きな人たちをつなぐためのSNSだよ。Flask、SQLite、SQLAlchemyなどの技術を使って作られていて、ユーザー登録、楽曲投稿、タイムライン表示、フォロー機能、楽曲再生機能などの主要な機能を提供しているんだ。

開発中にはいろいろな難しいことがあったけど、それらを一つずつ解決していくことで、使いやすいサービスを作ることができたんだ。プログラミングは難しいこともあるけど、自分のアイデアを形にできる楽しさもあるんだよ。

みんなも、こういったWebサービスを作ってみたいと思わない？プログラミングを学べば、自分のアイデアを形にすることができるんだ。難しいこともあるかもしれないけど、それを乗り越えた先には大きな達成感が待っているよ。ぜひチャレンジしてみてね！