Skip to content

Commit

Permalink
Feat:はなモード / ノートインポート (taiyme#23)
Browse files Browse the repository at this point in the history
* add: Importing of Posts

- Supports Instagram, Mastodon/Pleroma/Akkoma, Twitter and *key

* upd: update limit

* upd: pass full thinuser

* fix: cleanup not available on development env

* upd: remove unused function, fix logger message

* fix: broken unicode in strings on IG imports

* fix: use a proper function

* any→string

Co-Authored-By: Marie <[email protected]>

* fix: prevent *key renotes/boosts from being imported

Stop renotes/boosts from *key from being imported due to missing functionality of getting the related posts

* upd: import replies to own posts on *key

* fix: type

* upd: import own replies to own tweets

* chore: remove type in DbNoteImportToDbJobData

* merge: improve recreateChain

Resolves taiyme#159

* upd: remove event stream calls on import

* upd: lower max uses per hour on `import notes`

* upd: add `Facebook` to note importing

* fix: attachments not working on FB import

* upd: create Folders for imported media

* prepare to import more notes

`recreateChain` converts a list of notes into a forest of notes, using
notes that are not replies as roots, and replies as child nodes,
recursively.

Previously, notes that are replies to notes not included in the
export, and their children, were never put in the forest, and
therefore wheren't imported.

This can be fine when importing from Twitter, since we can't really
link a note to a tweet.

And, for the moment, it's acceptable when importing from *key, because
the export doesn't contain the instance URL, so we can't resolve ids
to remote notes.

It's less fine when importing from Mastodon / Pleroma / Akkoma,
because in those cases we _can_ link to the remote note that the user
was replying to.

This commit makes `recreateChain` optionally return "orphaned" note
trees, so in the (near) future we can use it to properly thread
imported notes from those services.

* properly thread Mastodon imports

* fix chaining for Mastodon notes

the id / replyId are not at the top level, so now `recreateChain`
takes a list of keys to walk, not just a single key

* thread Pleroma imports as well

I have _not_ tested this, but it should work fine, those exports are
the same shape as Mastodon's

* Use hashed filename for exists check

* upd: prevent vanilla mastodon imports from importing DMs

Also adds the visibility function to mastodon imports

* fix: correct followers visibility on import

* fix: if condition

* upd: add home as a visibility for mastodon imports

* Use hex digest

* Use base64url digest

* Simplify hash steps

* fix: visibility check on masto import

Originally from PR taiyme#288

* link twitter names to twitter, not nitter misskey-dev#382

nitter seems very dead

* Fixed code injection from twitter import

* simpler json-isation

thanks Alina for the suggestion

* simpler mapping

thanks Alina

* make almost all fs ops async

there's no `fs.promises.exists`

* simpler logic

thanks Alina

* decode entity references from tweets

apparently *some* tweets have those ☹

* lint

* import fs/promises the right way

thanks Marie

* fix: keep alt text of file if present

* allow setting separate timeout / max size for imports - fixes misskey-dev#479

* Update index.d.ts

* lint

* os.api→misskeyApi

* Update QueueProcessorService.ts

Co-Authored-By: Marie <[email protected]>

* Chore: remove sharkey specific elements

* Add check for prohibited words when importing notes

Co-Authored-By: Marie <[email protected]>

* Update ImportNotesProcessorService.ts

Co-Authored-By: Marie <[email protected]>

* Fix: DragonflyDB error during note import

Production環境はこれをPushしても治らないので注意

* Fix: チャートにダイレクト投稿が反映されないように

* isSensitive→isKeyWordIncluded

* Enhance: pushしないTLを指定できるように

* Chore: Prevent FTT issues from invalid note time

* Chore: Add note import info and disclaimer

* Refactor: NoteCreateService

* Feat: isInHanaModeというユーザー概念を追加

* Enhance: Featuredで連合先のノートも扱うように、規模に合わせてすべてのノートを考慮

* Feat: はなみタイムライン

* Feat(backend):はなモード中にするノートはローカルタイムラインに流れないように

* autogen

* autogen

* Update misskey-js.api.md

* Fix: test

* fix: e2e test

* add csp

* fix csp

* add icon font

* enhance: 設定画面を独立させる

* fix tl behavior

* remove unused locale string

* add english translation

* fix

* lint

* PostFormまわりの公開範囲の表示をはなモードで切り分ける

* lint

* tweak design

* lint

* add missing property

* specify hanamode preference when invoking notes/create

* add hanamode visibility icon to note header

* Revert "specify hanamode preference when invoking notes/create"

This reverts commit d253d62.

* (backend) dont explicitly specify that the note is in hanamode

* Chore: Follow API changes in commit 6e10704

* add missing schema

* remove official support for some platform

* lint

* Fix: Type Error

* refactor

* lint

Co-authored-by: かっこかり <[email protected]>

---------

Co-authored-by: Mar0xy <[email protected]>
Co-authored-by: Gianni Ceccarelli <[email protected]>
Co-authored-by: dakkar <[email protected]>
Co-authored-by: smitten <[email protected]>
Co-authored-by: KevinWh0 <[email protected]>
Co-authored-by: kakkokari-gtyih <[email protected]>
  • Loading branch information
7 people authored and nanasina8 committed Sep 6, 2024
1 parent e5894a5 commit 22f9d3d
Show file tree
Hide file tree
Showing 71 changed files with 2,832 additions and 105 deletions.
5 changes: 5 additions & 0 deletions .config/example.yml
Original file line number Diff line number Diff line change
Expand Up @@ -295,5 +295,10 @@ signToActivityPubGet: true
# Upload or download file size limits (bytes)
# maxFileSize: 262144000

# timeout and maximum size for imports (e.g. note imports)
#import:
# downloadTimeout: 30
# maxFileSize: 262144000

# PID File of master process
# pidFile: /tmp/misskey.pid
48 changes: 48 additions & 0 deletions locales/en-US.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,10 @@ mentions: "Mentions"
directNotes: "Direct notes"
importAndExport: "Import / Export"
import: "Import"
importOrigin: "Import Source"
importNoteInfo: "You can import notes exported from other services."
importNoteDisclaimer: "Not all notes can be imported. In cases where Misskey has been modified, or the export is from a completely different platform, import may not be possible at all."
importNoteWarm: "Imported notes may only be visible on your user page."
export: "Export"
files: "Files"
download: "Download"
Expand Down Expand Up @@ -1533,6 +1537,9 @@ _achievements:
title: "I Am a Cat"
description: "Mark your account as a cat"
flavor: "I'll give you a name later."
_markedAsHanaModeUser:
title: "Wish I were born a small person like a violet"
description: "Unlocked Hana Mode to take the first step of your tiny, comfy fedi experience"
_following1:
title: "Following your first user"
description: "Follow a user"
Expand Down Expand Up @@ -1707,6 +1714,7 @@ _role:
ltlAvailable: "Can view the local timeline"
canPublicNote: "Can send public notes"
mentionMax: "Maximum number of mentions in a note"
canImportNotes: "Can import notes"
canInvite: "Can create instance invite codes"
inviteLimit: "Invite limit"
inviteLimitCycle: "Invite limit cooldown"
Expand Down Expand Up @@ -2263,6 +2271,7 @@ _instanceCharts:
filesTotal: "Cumulative number of files"
_timelines:
home: "Home"
hanami: "Hanami"
local: "Local"
social: "Social"
global: "Global"
Expand Down Expand Up @@ -2635,3 +2644,42 @@ _contextMenu:
app: "Application"
appWithShift: "Application with shift key"
native: "Native"
_hana:
hanaSettings: "HanaMisskey Settings"
hanaMode: "Hana Mode"
_inDevelopment:
title: "This feature is under development"
description: "HanaMisskey is packed with new features currently in development! Stay tuned to see what exciting features will be implemented."
_welcome:
whatAboutX: "What is '{x}'?"
_aboutHana:
title: "HanaMisskey"
description: "HanaMisskey is a decentralized social networking service (SNS) based on Misskey. It offers a variety of unique features to enhance your social experience."
_aboutDecentralized:
title: "Decentralized SNS"
description: "Traditional SNS services (such as X, Instagram, YouTube) are self-contained within their own networks. However, decentralized SNS services connect with each other through a common protocol, allowing you to view and follow posts from users on other services. HanaMisskey supports the decentralized technology ActivityPub by default, enabling communication with other services using Misskey, Mastodon or Threads."
_features:
inDevelopment: "Coming Soon"
_hanaMode:
title: "Enjoy a personalized SNS experience with Hana Mode"
description: "When you enable HanaMisskey's unique 'Hana Mode,' your posts won't appear in the Local Timeline (LTL). However, unlike 'Home' posts, they can still be re-noted to LTL and will be delivered as standard public posts to external servers. This feature allows you to create a decentralized SNS experience similar to a private server with just one click."
_easyMigration:
title: "Easy Migration from Other Services"
description: "We offer a feature that makes it easy to migrate from other Misskey servers! You can even carry over your past posts to HanaMisskey."
_preciseSearching:
title: "High-Precision Search Powered by the Latest Technology"
description: "You can take advantage of high-precision, fast search capabilities, fine-tuned for HanaMisskey based on machine learning and the latest academic research. As HanaMisskey's search function is itself a part of a research project, its accuracy is expected to continuously improve."
_cta:
title: "Let Your SNS Experience Blossom with HanaMisskey!"
_hanaModeSwitcher:
recommendedFor: "Recommended for"
normal: "Normal"
normal1: "You can use the LTL (Local Timeline)"
normal2: "Posts set to 'Public' will appear on the LTL"
normalRecommend: "For those who want to prioritize interaction with users on the same server"
hana1: "LTL is not available"
hana2: "Posts set to 'Public' will not appear on the LTL"
hana3: "You can use the 'Hana Timeline,' which allows you to browse the latest notes from users you follow and popular posts from the Fediverse"
hanaRecommend: "For those who want a decentralized SNS experience similar to a private server, while still emphasizing interaction with external servers as well"
saveConfirmDescription: "There is a limit on how many times you can switch modes within a certain period."

107 changes: 106 additions & 1 deletion locales/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -308,6 +308,22 @@ export interface Locale extends ILocale {
* インポート
*/
readonly "import": string;
/**
* インポート元
*/
"importOrigin": string;
/**
* 他サービスでエクスポートしたノートなどをインポートすることができます。
*/
"importNoteInfo": string;
/**
* すべてのノートがインポートできるわけではありません。改変のないMisskey以外では全くインポートできない場合もあります。
*/
"importNoteDisclaimer": string;
/**
* インポートされたノートは、ユーザーページ以外には表示されない場合があります。
*/
"importNoteWarm": string;
/**
* エクスポート
*/
Expand Down Expand Up @@ -5500,6 +5516,10 @@ export interface Locale extends ILocale {
};
};
readonly "_timelineDescription": {
/**
* はなみタイムラインでは、フォローしているアカウントの投稿に加えて、連合しているサーバーの人気な投稿も見られます。
*/
"hanami": string;
/**
* ホームタイムラインでは、あなたがフォローしているアカウントの投稿を見られます。
*/
Expand Down Expand Up @@ -6047,7 +6067,17 @@ export interface Locale extends ILocale {
*/
readonly "flavor": string;
};
readonly "_following1": {
"_markedAsHanaModeUser": {
/**
* 菫ほどな小さき人に生まれたし
*/
"title": string;
/**
* はなモードを有効にした
*/
"description": string;
};
"_following1": {
/**
* はじめてのフォロー
*/
Expand Down Expand Up @@ -6647,6 +6677,10 @@ export interface Locale extends ILocale {
* ローカルタイムラインの閲覧
*/
readonly "ltlAvailable": string;
/**
* はなみタイムラインの閲覧
*/
"hanamiTlAvailable": string;
/**
* パブリック投稿の許可
*/
Expand All @@ -6655,6 +6689,10 @@ export interface Locale extends ILocale {
* ノート内の最大メンション数
*/
readonly "mentionMax": string;
/**
* ノートのインポート
*/
"canImportNotes": string;
/**
* サーバー招待コードの発行
*/
Expand Down Expand Up @@ -6769,6 +6807,10 @@ export interface Locale extends ILocale {
* botユーザー
*/
readonly "isBot": string;
/**
* はなモードが有効なユーザー
*/
"isInHanaMode": string;
/**
* サスペンド済みユーザー
*/
Expand Down Expand Up @@ -8786,6 +8828,10 @@ export interface Locale extends ILocale {
* ホーム
*/
readonly "home": string;
/**
* はなみ
*/
"hanami": string;
/**
* ローカル
*/
Expand Down Expand Up @@ -10194,6 +10240,7 @@ export interface Locale extends ILocale {
*/
readonly "native": string;
};
<<<<<<< HEAD
readonly "_tms": {
/**
* taiy
Expand Down Expand Up @@ -10312,6 +10359,22 @@ export interface Locale extends ILocale {
*/
readonly "memoIsNotShared": string;
readonly "_about": {
=======
"_hana": {
/**
* はなみすきー設定
*/
"hanaSettings": string;
/**
* はなモード
*/
"hanaMode": string;
/**
* はな
*/
"hanaModeShort": string;
"_inDevelopment": {
>>>>>>> 15448033b2 (Feat:はなモード / ノートインポート (#23))
/**
* taiymeについて
*/
Expand Down Expand Up @@ -10489,6 +10552,48 @@ export interface Locale extends ILocale {
*/
readonly "repositoryUrlDescription": string;
};
"_hanaModeSwitcher": {
/**
* こんな方におすすめ
*/
"recomenddedFor": string;
/**
* 通常
*/
"normal": string;
/**
* LTLが使えます
*/
"normal1": string;
/**
* 公開範囲「パブリック」で投稿した内容はLTLに表示されます
*/
"normal2": string;
/**
* サーバー内のユーザーとの交流を重視したい方
*/
"normalRecommend": string;
/**
* LTLが使えません
*/
"hana1": string;
/**
* 公開範囲「パブリック」で投稿した内容はLTLに表示されません
*/
"hana2": string;
/**
* フォロー中ユーザーの最新のノートとFediverseの人気の投稿をザッピングできる「はなみタイムライン」が使用できます
*/
"hana3": string;
/**
* おひとりさまサーバーのような分散SNS体験をしたい方(内々での交流だけでなく、外部サーバーとの交流もしっかり重視したい方)
*/
"hanaRecommend": string;
/**
* 一定期間にモードを変更できる回数には制限があります。
*/
"saveConfirmDescription": string;
};
};
}
declare const locales: {
Expand Down
52 changes: 52 additions & 0 deletions locales/ja-JP.yml
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,10 @@ mentions: "あなた宛て"
directNotes: "ダイレクト投稿"
importAndExport: "インポートとエクスポート"
import: "インポート"
importOrigin: "インポート元"
importNoteInfo: "他サービスでエクスポートしたノートなどをインポートすることができます。"
importNoteDisclaimer: "すべてのノートがインポートできるわけではありません。改変のないMisskey以外では全くインポートできない場合もあります。"
importNoteWarm: "インポートされたノートは、ユーザーページ以外には表示されない場合があります。"
export: "エクスポート"
files: "ファイル"
download: "ダウンロード"
Expand Down Expand Up @@ -1387,6 +1391,7 @@ _initialTutorial:
description: "ここで紹介した機能はほんの一部にすぎません。Misskeyの使い方をより詳しく知るには、{link}をご覧ください。"

_timelineDescription:
hanami: "はなみタイムラインでは、フォローしているアカウントの投稿に加えて、連合しているサーバーの人気な投稿も見られます。"
home: "ホームタイムラインでは、あなたがフォローしているアカウントの投稿を見られます。"
local: "ローカルタイムラインでは、このサーバーにいるユーザー全員の投稿を見られます。"
social: "ソーシャルタイムラインには、ホームタイムラインとローカルタイムラインの投稿が両方表示されます。"
Expand Down Expand Up @@ -1545,6 +1550,9 @@ _achievements:
title: "吾輩は猫である"
description: "アカウントをCatとして設定した"
flavor: "名前はまだない。"
_markedAsHanaModeUser:
title: "菫ほどな小さき人に生まれたし"
description: "はなモードを有効にした"
_following1:
title: "はじめてのフォロー"
description: "初めてフォローした"
Expand Down Expand Up @@ -1718,8 +1726,10 @@ _role:
_options:
gtlAvailable: "グローバルタイムラインの閲覧"
ltlAvailable: "ローカルタイムラインの閲覧"
hanamiTlAvailable: "はなみタイムラインの閲覧"
canPublicNote: "パブリック投稿の許可"
mentionMax: "ノート内の最大メンション数"
canImportNotes: "ノートのインポート"
canInvite: "サーバー招待コードの発行"
inviteLimit: "招待コードの作成可能数"
inviteLimitCycle: "招待コードの発行間隔"
Expand Down Expand Up @@ -1749,6 +1759,7 @@ _role:
isRemote: "リモートユーザー"
isCat: "猫ユーザー"
isBot: "botユーザー"
isInHanaMode: "はなモードが有効なユーザー"
isSuspended: "サスペンド済みユーザー"
isLocked: "鍵アカウントユーザー"
isExplorable: "「アカウントを見つけやすくする」が有効なユーザー"
Expand Down Expand Up @@ -2318,6 +2329,7 @@ _instanceCharts:

_timelines:
home: "ホーム"
hanami: "はなみ"
local: "ローカル"
social: "ソーシャル"
global: "グローバル"
Expand Down Expand Up @@ -2798,3 +2810,43 @@ _tms:
caption: "長押しを含む操作が中断される問題を解消します。"
_admin:
repositoryUrlDescription: "ソースコードが公開されているリポジトリがある場合、そのURLを記入します。taiymeを現状のまま(ソースコードにいかなる変更も加えずに)使用している場合は https://github.com/taiyme/misskey と記入します。"
_hana:
hanaSettings: "はなみすきー設定"
hanaMode: "はなモード"
hanaModeShort: "はな"
_inDevelopment:
title: "この機能は開発中です"
description: "はなみすきーは新規機能盛りだくさんで鋭意開発中です!\nどんな機能が実装されるかはお楽しみ。"
_welcome:
whatAboutX: "「{x}」とは?"
_aboutHana:
title: "はなみすきー"
description: "はなみすきーは、Misskeyベースの分散型SNSサービスです。\nあなたのSNS体験に「はな」を添える、数々の独自機能を備えています。"
_aboutDecentralized:
title: "分散型SNS"
description: "一般的なSNSサービス(X, Instagram, YouTubeなど)はそのサービス内で投稿データなどが完結するようになっています。しかし、分散型SNSは、サービス同士が共通の仕組みを通して連携しており、他のサービスのユーザーの投稿を見たり、フォローしたりできるのです。\nはなみすきーは標準で分散型テクノロジーのActivityPubに対応しており、他のMisskey/Mastodon等を利用したサービスやThreadsなどと通信することができます。"
_features:
inDevelopment: "近日提供予定"
_hanaMode:
title: "はなモードで、あなただけのSNS体験を"
description: "はなみすきー独自機能「はなモード」をオンにすると、投稿内容がローカルタイムライン(LTL)に流れないようになります。ただし、「ホーム」投稿とは違い、LTLへのリノートが可能なほか、外部サーバーには通常のパブリックの投稿として配信されます。\nこれにより、おひとりさまサーバーに近い分散SNS体験をワンクリックで構築することができます。"
_easyMigration:
title: "他サービスから簡単移行"
description: "他のMisskeyサーバーなどからの移行が簡単になる機能を提供!過去の投稿もはなみすきー上に引き継ぐことができます。"
_preciseSearching:
title: "最新技術を活用した高精度な検索"
description: "機械学習や最新の学術研究をもとに、はなみすきーのためにチューニングされた高精度で高速な検索機能を利用できます。また、はなみすきーの検索機能そのものが学術研究プロジェクトとなっているため、検索精度は日進月歩となることが期待できます。"
_cta:
title: "「はな」のあるSNS体験を楽しもう"
_hanaModeSwitcher:
recomenddedFor: "こんな方におすすめ"
normal: "通常"
normal1: "LTLが使えます"
normal2: "公開範囲「パブリック」で投稿した内容はLTLに表示されます"
normalRecommend: "サーバー内のユーザーとの交流を重視したい方"
hana1: "LTLが使えません"
hana2: "公開範囲「パブリック」で投稿した内容はLTLに表示されません"
hana3: "フォロー中ユーザーの最新のノートとFediverseの人気の投稿をザッピングできる「はなみタイムライン」が使用できます"
hanaRecommend: "おひとりさまサーバーのような分散SNS体験をしたい方(内々での交流だけでなく、外部サーバーとの交流もしっかり重視したい方)"
saveConfirmDescription: "一定期間にモードを変更できる回数には制限があります。"
>>>>>>> 15448033b2 (Feat:はなモード / ノートインポート (#23))
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
export class AddIsInHanaModeColumnToMiUser1723641187454 {
name = 'AddIsInHanaModeColumnToMiUser1723641187454'

async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "user" ADD "isInHanaMode" boolean NOT NULL DEFAULT false`);
await queryRunner.query(`COMMENT ON COLUMN "user"."isInHanaMode" IS 'Whether the User is in Hana Mode.'`);
}

async down(queryRunner) {
await queryRunner.query(`COMMENT ON COLUMN "user"."isInHanaMode" IS 'Whether the User is in Hana Mode.'`);
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "isInHanaMode"`);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
export class AddIsNoteInHanaModeColumnToMiNote1723664940877 {
name = 'AddIsNoteInHanaModeColumnToMiNote1723664940877'

async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "note" ADD "isNoteInHanaMode" boolean NOT NULL DEFAULT false`);
}

async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "note" DROP COLUMN "isNoteInHanaMode"`);
}
}
Loading

0 comments on commit 22f9d3d

Please sign in to comment.