From 8ffb9ee8c52eda6d40c205d9e124f8a42730758a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=88=91=EF=BC=8C=E7=BA=A2=E9=A2=86=E5=B7=BE=EF=BC=81?=
<11900611@qq.com>
Date: Thu, 22 Jun 2023 14:48:00 +0800
Subject: [PATCH 01/88] Modified to a One-Click Deploy Version
And hide the text title of the icon in the upper right corner of the page (Navbar)
---
README.md | 7 +++++++
config/api.config.js | 4 ++--
config/site.config.js | 10 +++++-----
src/components/Navbar.tsx | 4 ++--
4 files changed, 16 insertions(+), 9 deletions(-)
diff --git a/README.md b/README.md
index d55c8b5d53..bb9893009c 100644
--- a/README.md
+++ b/README.md
@@ -11,6 +11,13 @@
+## Rapid Deploy
+
+[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/clone?repository-url=https%3A%2F%2Fgithub.com%2Fspencerwooo%2Fonedrive-vercel-index&env=NEXT_PUBLIC_SITE_TITLE,NEXT_PUBLIC_USER_PRINCIPLE_NAME,NEXT_PUBLIC_BASE_DIRECTORY,NEXT_PUBLIC_CLIENT_ID,NEXT_PUBLIC_CLIENT_SECRET)
+
+> **Unless you already know what to do after clicking this button, it is highly recommended that you read the instructions below first. Thank you.**
+>
+
## TL;DR
Showcase, share, preview, and download files inside *your* OneDrive with onedrive-vercel-index -
diff --git a/config/api.config.js b/config/api.config.js
index 8d1a25142d..8471aeb720 100644
--- a/config/api.config.js
+++ b/config/api.config.js
@@ -10,8 +10,8 @@
module.exports = {
// The clientId and clientSecret are used to authenticate the user with Microsoft Graph API using OAuth. You would
// not need to change anything here if you can authenticate with your personal Microsoft account with OneDrive International.
- clientId: 'd87bcc39-1750-4ca0-ad54-f8d0efbb2735',
- obfuscatedClientSecret: 'U2FsdGVkX1830zo3/pFDqaBCVBb37iLw3WnBDWGF9GIB2f4apzv0roemp8Y+iIxI3Ih5ecyukqELQEGzZlYiWg==',
+ clientId: process.env.NEXT_PUBLIC_CLIENT_ID,
+ obfuscatedClientSecret: process.env.NEXT_PUBLIC_CLIENT_SECRET,
// The redirectUri is the URL that the user will be redirected to after they have authenticated with Microsoft Graph API.
// Likewise, you would not need to change redirectUri if you are using your personal Microsoft account with OneDrive International.
diff --git a/config/site.config.js b/config/site.config.js
index 82d46494d4..9a05c1ce2d 100644
--- a/config/site.config.js
+++ b/config/site.config.js
@@ -7,7 +7,7 @@ module.exports = {
// Make sure this is exactly the same as the email address you use to sign into your Microsoft account.
// You can also put this in your Vercel's environment variable 'NEXT_PUBLIC_USER_PRINCIPLE_NAME' if you worry about
// your email being exposed in public.
- userPrincipalName: process.env.NEXT_PUBLIC_USER_PRINCIPLE_NAME || 'spencer@spwoo.onmicrosoft.com',
+ userPrincipalName: process.env.NEXT_PUBLIC_USER_PRINCIPLE_NAME,
// [OPTIONAL] This is the website icon to the left of the title inside the navigation bar. It should be placed under the
// /public directory of your GitHub project (not your OneDrive folder!), and referenced here by its relative path to /public.
@@ -17,14 +17,14 @@ module.exports = {
kvPrefix: process.env.KV_PREFIX || '',
// The name of your website. Present alongside your icon.
- title: "Spencer's OneDrive",
+ title: process.env.NEXT_PUBLIC_SITE_TITLE || 'OneDrive-Vercel-Index',
// The folder that you are to share publicly with onedrive-vercel-index. Use '/' if you want to share your root folder.
- baseDirectory: '/Public',
+ baseDirectory: process.env.NEXT_PUBLIC_BASE_DIRECTORY || '/',
// [OPTIONAL] This represents the maximum number of items that one directory lists, pagination supported.
// Do note that this is limited up to 200 items by the upstream OneDrive API.
- maxItems: 100,
+ maxItems: 200,
// [OPTIONAL] We use Google Fonts natively for font customisations.
// You can check and generate the required links and names at https://fonts.google.com.
@@ -42,7 +42,7 @@ module.exports = {
// [OPTIONAL] This is where you specify the folders that are password protected. It is an array of paths pointing to all
// the directories in which you have .password set. Check the documentation for details.
- protectedRoutes: ['/🌞 Private folder/u-need-a-password', '/🥟 Some test files/Protected route'],
+ protectedRoutes: [],
// [OPTIONAL] Use "" here if you want to remove this email address from the nav bar.
email: 'mailto:spencer.wushangbo@gmail.com',
diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx
index 9a7ac24aae..2877f9e6a7 100644
--- a/src/components/Navbar.tsx
+++ b/src/components/Navbar.tsx
@@ -99,13 +99,13 @@ const Navbar = () => {
className="flex items-center space-x-2 hover:opacity-80 dark:text-white"
>
-
+ {/*
{
// Append link name comments here to add translations
// t('Weibo')
t(l.name)
}
-
+ */}
))}
From fc394056546c031e258c92a53622591475577f06 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=88=91=EF=BC=8C=E7=BA=A2=E9=A2=86=E5=B7=BE=EF=BC=81?=
<11900611@qq.com>
Date: Thu, 22 Jun 2023 15:21:19 +0800
Subject: [PATCH 02/88] Update README.md
---
README.md | 11 ++++-------
1 file changed, 4 insertions(+), 7 deletions(-)
diff --git a/README.md b/README.md
index bb9893009c..812f052a13 100644
--- a/README.md
+++ b/README.md
@@ -11,13 +11,6 @@
-## Rapid Deploy
-
-[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/clone?repository-url=https%3A%2F%2Fgithub.com%2Fspencerwooo%2Fonedrive-vercel-index&env=NEXT_PUBLIC_SITE_TITLE,NEXT_PUBLIC_USER_PRINCIPLE_NAME,NEXT_PUBLIC_BASE_DIRECTORY,NEXT_PUBLIC_CLIENT_ID,NEXT_PUBLIC_CLIENT_SECRET)
-
-> **Unless you already know what to do after clicking this button, it is highly recommended that you read the instructions below first. Thank you.**
->
-
## TL;DR
Showcase, share, preview, and download files inside *your* OneDrive with onedrive-vercel-index -
@@ -31,6 +24,10 @@ Showcase, share, preview, and download files inside *your* OneDrive with onedriv
## Quick start
+[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/clone?repository-url=https%3A%2F%2Fgithub.com%2Fspencerwooo%2Fonedrive-vercel-index&env=NEXT_PUBLIC_SITE_TITLE,NEXT_PUBLIC_USER_PRINCIPLE_NAME,NEXT_PUBLIC_BASE_DIRECTORY,NEXT_PUBLIC_CLIENT_ID,NEXT_PUBLIC_CLIENT_SECRET)
+
+> **Unless you already know what to do after clicking this button, it is highly recommended that you read the instructions below first. Thank you.**
+
🚀 Quick start: [Getting started](https://ovi.swo.moe/docs/getting-started).
## Discussion
From 5705876a9f6a4a88d52b13fd9ffee981e96aab22 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=88=91=EF=BC=8C=E7=BA=A2=E9=A2=86=E5=B7=BE=EF=BC=81?=
<11900611@qq.com>
Date: Thu, 22 Jun 2023 15:33:00 +0800
Subject: [PATCH 03/88] Update api.config.js
---
config/api.config.js | 13 +++++++++++--
1 file changed, 11 insertions(+), 2 deletions(-)
diff --git a/config/api.config.js b/config/api.config.js
index 8471aeb720..ccc50bcac6 100644
--- a/config/api.config.js
+++ b/config/api.config.js
@@ -7,11 +7,20 @@
* - If you are using a E5 Subscription OneDrive for Business account, the direct links of your files are not the same here.
* In which case you would need to change directLinkRegex.
*/
+const clientIdEnv = process.env.NEXT_PUBLIC_CLIENT_ID;
+if (!clientIdEnv) {
+ throw new Error('CLIENT_ID is not defined in api.config.js');
+}
+const clientSecretEnv = process.env.NEXT_PUBLIC_CLIENT_SECRET;
+if (!clientSecretEnv) {
+ throw new Error('CLIENT_SECRET is not defined in api.config.js');
+}
+
module.exports = {
// The clientId and clientSecret are used to authenticate the user with Microsoft Graph API using OAuth. You would
// not need to change anything here if you can authenticate with your personal Microsoft account with OneDrive International.
- clientId: process.env.NEXT_PUBLIC_CLIENT_ID,
- obfuscatedClientSecret: process.env.NEXT_PUBLIC_CLIENT_SECRET,
+ clientId: clientIdEnv,
+ obfuscatedClientSecret: clientSecretEnv,
// The redirectUri is the URL that the user will be redirected to after they have authenticated with Microsoft Graph API.
// Likewise, you would not need to change redirectUri if you are using your personal Microsoft account with OneDrive International.
From 345a2d8d97d28edb85ef075ecd2da8495c2b0aa9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=88=91=EF=BC=8C=E7=BA=A2=E9=A2=86=E5=B7=BE=EF=BC=81?=
<11900611@qq.com>
Date: Thu, 22 Jun 2023 15:42:21 +0800
Subject: [PATCH 04/88] Update Navbar.tsx
---
src/components/Navbar.tsx | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/components/Navbar.tsx b/src/components/Navbar.tsx
index 2877f9e6a7..d4bc15a4bb 100644
--- a/src/components/Navbar.tsx
+++ b/src/components/Navbar.tsx
@@ -112,7 +112,7 @@ const Navbar = () => {
{siteConfig.email && (
- {t('Email')}
+ {/*{t('Email')}*/}
)}
From 708a78269ba6641a63bb8a96c2befbebc74d1cfa Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=88=91=EF=BC=8C=E7=BA=A2=E9=A2=86=E5=B7=BE=EF=BC=81?=
<11900611@qq.com>
Date: Thu, 22 Jun 2023 15:44:37 +0800
Subject: [PATCH 05/88] Create vercel.json
---
vercel.json | 4 ++++
1 file changed, 4 insertions(+)
create mode 100644 vercel.json
diff --git a/vercel.json b/vercel.json
new file mode 100644
index 0000000000..d90a3916af
--- /dev/null
+++ b/vercel.json
@@ -0,0 +1,4 @@
+{
+ "buildCommand": "pnpm build",
+ "installCommand": "pnpm install"
+}
\ No newline at end of file
From 01ca1512c6c796660530559201c9cf10dbd6be23 Mon Sep 17 00:00:00 2001
From: eks <11900611@qq.com>
Date: Sun, 25 Jun 2023 12:19:30 +0800
Subject: [PATCH 06/88] update README
---
LICENSE | 3 +-
README.md | 163 +++++++++++-------------------------------
README.zh-CN.md | 71 ++++++++++++++++++
config/site.config.js | 6 +-
4 files changed, 117 insertions(+), 126 deletions(-)
create mode 100644 README.zh-CN.md
diff --git a/LICENSE b/LICENSE
index 6946f10a00..f1f2ea0e13 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,6 +1,7 @@
MIT License
-Copyright (c) 2021 Spencer Woo
+Copyright (c) 2021-2023 Spencer Woo
+Copyright (c) 2023 iRedScarf
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
diff --git a/README.md b/README.md
index 812f052a13..f9e5efaa64 100644
--- a/README.md
+++ b/README.md
@@ -1,152 +1,71 @@
-
-
![onedrive-vercel-index](./public/header.png)
-
-
Get started · What's new? · Sponsoring
-
OneDrive public directory listing, powered by Vercel and Next.js
+# OneDrive-Vercel-Index (One-Click Deploy Version)
-
![OneDrive](https://img.shields.io/badge/OneDrive-2C68C3?style=flat&logo=microsoft-onedrive&logoColor=white)
-
![Next.js](https://img.shields.io/badge/Next.js-black?style=flat&logo=next.js&logoColor=white)
-
![Vercel](https://img.shields.io/badge/Vercel-black?style=flat&logo=Vercel&logoColor=white)
-
![Documentation](https://img.shields.io/badge/Documentation-black?style=flat&logo=data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABmJLR0QA/wD/AP+gvaeTAAABeUlEQVRIie2VwUrDQBCGZ5ZubNmS0Ba9tF6CUqTHpg+g+AhCn8R30DfpM3jRezdHoZJroaBJQ2qgsIEdD7YSsCtJVBTxP87u/t/u7M4swDcLTQNSSseyLFbERCmlPc9LCgF83z/jnE9s294vvk+AJEmesiwbe553awQEQbCXZVnY7/ebjBXa/Ju01jCbzVIA6AwGA7WN1/KT4jg+6vV6TcYYpGlKq9UKiQgAAOr1OnU6HWNKGWPQarWa8/n8GADudwIQ0UJ89QjDEKMoOiEitRm7tm37gnNuPAUiAiJa+VjNNJmIYDgcPiAiAQD4vh9tT1NG5RJdQT8PkFKak/5ZgJTyUgjxPJ1Ob4josArAeMmWZYHrulftdhvX6/X5YrEwPtFKgG63C7ApxEajga7rVvH/BZf8D/hjACJSVRpabj1su+9OgBAiiOM41VqXNtdaw3K5TIUQQT7+rjqllKec84njOAdlAEmSPCqlxqPR6O5DQA70JZ/+t+sFAb2R22dSZ7wAAAAASUVORK5CYII=)
-
![GitHub Discussions](https://img.shields.io/github/discussions/spencerwooo/onedrive-vercel-index?color=CF2B5B&labelColor=black&logo=github)
-
+English | [中文简体](./README.zh-CN.md)
-## TL;DR
+This project is a fork from [spencerwooo/onedrive-vercel-index](https://github.com/spencerwooo/onedrive-vercel-index), based on the archived version from the original author dated June 24, 2023. It includes some minor modifications that allow you to deploy it on Vercel for free, showcasing, sharing, previewing, and downloading your OneDrive files on a webpage. For specific deployment methods, please refer to the instructions below.
-Showcase, share, preview, and download files inside *your* OneDrive with onedrive-vercel-index -
+> This version has only been tested with an E5 Developer account. Other types of OneDrive accounts need further testing.
-- Completely free to host 💸
-- Super fast ⚡ and responsive 💦
-- Takes less than 15 minutes to setup ⏱️
-- Highly customisable ⚒️
+## Demo
-🍌 More importantly, we are pretty (●'◡'●)
+The [Demo](https://drive.swo.moe) provided by the original author | The [Demo](https://onedrive-index-iredscarf.vercel.app) of this One-Click Deployment version.
-## Quick start
+![demo](./public/demo.png)
-[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/clone?repository-url=https%3A%2F%2Fgithub.com%2Fspencerwooo%2Fonedrive-vercel-index&env=NEXT_PUBLIC_SITE_TITLE,NEXT_PUBLIC_USER_PRINCIPLE_NAME,NEXT_PUBLIC_BASE_DIRECTORY,NEXT_PUBLIC_CLIENT_ID,NEXT_PUBLIC_CLIENT_SECRET)
+## Getting Started
-> **Unless you already know what to do after clicking this button, it is highly recommended that you read the instructions below first. Thank you.**
+### Preparations
-🚀 Quick start: [Getting started](https://ovi.swo.moe/docs/getting-started).
+1. **Setting up the API permissions for your OneDrive account:**
-## Discussion
+ This project retrieves the file list and download links by calling OneDrive's API, so setting up the API permissions for your OneDrive account is essential. Please refer to the [Docs](https://ovi.swo.moe/docs/advanced#modify-api-permissions) written by the original author for retrieval methods.
-Please go to our [discussion forum](https://github.com/spencerwooo/onedrive-vercel-index/discussions) for general questions and FAQs, **issues are for bug reports and bug reports only.** Feature requests may or may not be ignored, as [I (@spencerwooo)](https://spencerwoo.com) am the only one maintaining the project, so **I only prioritise features that I use.**
+ The three API permissions that need to be set up are: `user.read`, `files.read.all`, `offline_access`.
-*If you happen to like this project, please give it a star!* :3
+2. **Prepare the five environmental parameters to be filled in during deployment on Vercel:**
-*If you really, really like this project, please send money! -> [Sponsors 🤑 and donations 💰](https://ovi.swo.moe/sponsor/ways)*
+| Name | Description | Default | Note |
+| --- | --- | --- | --- |
+| `NEXT_PUBLIC_SITE_TITLE` | Title of the displayed page | `null` | e.g., OneDrive of the Richest Man in Nicaragua |
+| `NEXT_PUBLIC_USER_PRINCIPLE_NAME` | Your OneDrive account | `null` | **Case-sensitive** |
+| `NEXT_PUBLIC_BASE_DIRECTORY` | The OneDrive directory you want to share | `null` | Format is `/directory-name`, for root directory, fill in `/` |
+| `NEXT_PUBLIC_CLIENT_ID` | Client ID of the app you registered in Microsoft Azure | `null` | The one provided by the original author has expired, it's recommended to register your own, which can be valid for up to two years. Retrieval methods are the same as in the [Docs](https://ovi.swo.moe/docs/advanced#using-your-own-clientid-and-clientsecret) written by the original author |
+| `NEXT_PUBLIC_CLIENT_SECRET` | Client Secret of the app you registered in Microsoft Azure | `null` | Retrieval methods are the same as above, note that you need to **AES encrypt the original secret** (can be done as described in the [Docs](https://ovi.swo.moe/docs/advanced#modify-configs-in-apiconfigjs)) |
-## Demo
+### Deploying to Vercel
-Live demo at [Spencer's OneDrive](https://drive.swo.moe).
+**Once you're prepared, you can click the button below to deploy:**
-![demo](./public/demo.png)
+[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/clone?repository-url=https%3A%2F%2Fgithub.com%2FiRedScarf%2Fonedrive-vercel-index&env=NEXT_PUBLIC_SITE_TITLE,NEXT_PUBLIC_USER_PRINCIPLE_NAME,NEXT_PUBLIC_BASE_DIRECTORY,NEXT_PUBLIC_CLIENT_ID,NEXT_PUBLIC_CLIENT_SECRET)
-## Features
-
-
-
-
-
- 👀 File preview
- |
-
- 💠 List / Grid layouts
- |
-
- 🎥 Video and audio
- |
-
-
- PDF, EPUB, markdown, code, plain text |
- For previewing images and documents with thumbnails |
- mp4, mp3, ..., play online or with IINA, PotPlayer ... with subtitles! |
-
-
-
- 📄 Office preview
- |
- 📝 README.md preview |
- 📑 Pagination |
-
-
- docx, pptx, xlsx, ... |
- Also renders code blocks, images with relative links, ... |
- For folders with 200 or more items |
-
-
- 🔒 Protected folders |
- ⏬ Multi-file download |
- 🔎 Native Search |
-
-
- Password protected routes and files. Details here |
-
- Compress and download multiple files or folders.
- Details here
- |
-
- Searching through your shared OneDrive files (with some caveats 🥺).
- Details here
- |
-
-
-
-
-... and more:
-
-- Streamlined deployment, without having to get your tokens manually anymore!
-- Direct raw-file serving and hosting ...
-- Full dark mode support, style and website customisations ...
-
-> **Note**: This project is focused on showcasing and providing a way for others to download files from your OneDrive. Emphasis on **free** and **serverless**. If you have your own server / need WebDAV / use cloud providers other than OneDrive, checkout [alist](https://github.com/alist-org/alist).
+- After the initial successful deployment, the deployed page will return a 404 error because we still need to connect to the Redis database.
-## Documentation
+- `REDIS_URL`:If you are encountering Redis database for the first time like me, I strongly recommend using Upstash, which is free and deeply integrated with Vercel. For details, refer to [Vercel Integration](https://docs.upstash.com/redis/howto/vercelintegration). Follow the instructions to set it up in Vercel's [Upstash Integration](https://vercel.com/integrations/upstash), it will automatically fill in the environment variables after project deployment.
+
+- After `REDIS_URL` is successfully set, redeploy the project again.
-Documentation is hosted at [ovi.swo.moe](https://ovi.swo.moe/).
+**After successful deployment, when you visit your `onedrive-vercel-index` page for the first time, it will guide you to perform OAuth authentication (quite simple). For details, please refer to the [Instructions](https://ovi.swo.moe/zh/docs/getting-started#authentication) written by the original author.**
-- [How can I get started and deploy?](https://ovi.swo.moe/docs/getting-started)
-- [How can I configure ... ?](https://ovi.swo.moe/docs/custom-configs)
-- Where is feature ... ?
- - [Docs - Password protected folders](https://ovi.swo.moe/docs/features/protected-folders)
- - [Docs - Multi-file and folder download](https://ovi.swo.moe/docs/features/multi-file-folder-download)
- - [Docs - Hosting files (images) directly](https://ovi.swo.moe/docs/features/hosting-images-directly)
- - [Docs - Search for files and folders](https://ovi.swo.moe/docs/features/search-for-files-and-folders)
- - [Docs - Load video subtitles](https://ovi.swo.moe/docs/features/load-video-subtitles)
-- [I deployed this before, how can I upgrade to the latest version?](https://ovi.swo.moe/docs/migration/updating-to-latest-version)
-- [I was here before 2022, how can I migrate to the new version?](https://ovi.swo.moe/docs/migration/if-you-deployed-before-2022)
-- [I got a problem during deployment ...](https://ovi.swo.moe/docs/faqs/error-on-deployment)
-- I didn't find a solution / My problem is unique? [Find help in discussion forum](https://github.com/spencerwooo/onedrive-vercel-index/discussions).
+## Documentation
-## Server-*less* (free)?
+**For more usage methods, please refer to the [Docs](https://ovi.swo.moe/docs/getting-started) written by the original author.**
-Yes! Completely free with no backend server what-so-ever. (Well, we use Redis, but that's free to some extent also.)
+## Modifications
-## Sponsors and donations
+- Compared with the original version, this version mainly extracts the steps of modifying `clientId` and `obfuscatedClientSecret` in `config/api.config.js`, as well as modifying `userPrincipalName`, `title`, and `baseDirectory` in `config/site.config.js`, and sets them as environmental variables during Vercel deployment.
-Open-source is hard! If you happen to like this project and want me to keep going, please consider sponsoring me or providing a single donation! Thanks for all the love and support!
+- Left `mail` in `config/site.config.js` blank (if you want to display your contact information on the page, you can modify it yourself), and removed the `GitHub` text next to the GitHub icon (because the icons on the right side of the navigation bar felt a bit too crowded).
-[🧸 Please donate - 微信/支付宝](https://ovi.swo.moe/sponsor/ways) · [Patreon](https://www.patreon.com/spencerwoo) · [爱发电](https://afdian.net/@spencerwoo)
+- Also added support for [Vercel Analytics](https://vercel.com/docs/concepts/analytics) to conveniently check the access situation of the shared page (needs to be enabled in the Analytics tab of the project after deployment).
## License
-[MIT](LICENSE)
+[MIT License](LICENSE)
+
+© 2021-2023 [spencer woo](https://spencerwoo.com)
+
+© 2023 [iRedScarf](https://github.com/iRedScarf)
+ Made by spencer woo | Modified by iRedScarf
+
\ No newline at end of file
diff --git a/README.zh-CN.md b/README.zh-CN.md
new file mode 100644
index 0000000000..037171867b
--- /dev/null
+++ b/README.zh-CN.md
@@ -0,0 +1,71 @@
+# OneDrive-Vercel-Index(一键部署版)
+
+[English](./README.md) | 简体中文
+
+本项目fork自[spencerwooo/onedrive-vercel-index](https://github.com/spencerwooo/onedrive-vercel-index),基于原作者于2023年6月24日归档的版本并进行了一些小修改,让您可以一键部署在完全免费托管的Vercel,在一个网页中展示、分享、预览和下载您的OneDrive文件。具体部署方法请参考下面的说明。
+
+> 本版本只测试通过E5开发者帐户,其他类型的OneDrive帐户有待进一步测试。
+
+## 在线预览
+
+原作者提供的[在线预览](https://drive.swo.moe) | 本一键部署版的[在线预览](https://onedrive-index-iredscarf.vercel.app)
+
+![demo](./public/demo.png)
+
+## 部署方法
+
+### 前期准备
+
+1. **设置OneDrive帐户的API权限:**
+
+ 本项目是通过调用OneDrive的API来获取文件列表以及下载链接的,所以设置OneDrive帐户的API权限是必须的,获取方法请参考原作者编写的[使用文档](https://ovi.swo.moe/zh/docs/advanced#修改-api-权限)。
+
+ 需要设置的API权限为以下三个:`user.read`、`files.read.all`、`offline_access`。
+
+2. **准备好在Vercel部署时填写的五个环境参数:**
+
+| 名称 | 描述 | 默认 | 备注 |
+| --- | --- | --- | --- |
+| `NEXT_PUBLIC_SITE_TITLE` | 展示页面的标题 | `null` | 例如:尼加拉瓜首富的OneDrive |
+| `NEXT_PUBLIC_USER_PRINCIPLE_NAME` | 您的OneDrive帐户 | `null` | **字母大小写必须一致** |
+| `NEXT_PUBLIC_BASE_DIRECTORY` | 您要分享的OneDrive目录 | `null` | (格式为`/目录名`),根目录则填写`/` |
+| `NEXT_PUBLIC_CLIENT_ID` | 您在微软Azure注册的应用程序客户端ID | `null` | 原作者提供的已过期,建议自己注册一个,有效期可以设到两年(反正也要设置帐户的API权限,顺道咯)。获取方式参照原作者编写的[使用文档](https://ovi.swo.moe/zh/docs/advanced#使用你自己的-client-id-与-secret) |
+| `NEXT_PUBLIC_CLIENT_SECRET` | 您在微软Azure注册的应用程序客户端密钥 | `null` | 获取方式同上,特别注意这个**需要对原密钥进行AES加密**(可在原作者编写的[使用文档](https://ovi.swo.moe/zh/docs/advanced#修改-apiconfigjs)中进行) |
+
+### 部署到Vercel
+
+**当您做好准备工作,就可以点击下面的按钮进行部署了:**
+
+[![Deploy with Vercel](https://vercel.com/button)](https://vercel.com/new/git/clone?repository-url=https%3A%2F%2Fgithub.com%2FiRedScarf%2Fonedrive-vercel-index&env=NEXT_PUBLIC_SITE_TITLE,NEXT_PUBLIC_USER_PRINCIPLE_NAME,NEXT_PUBLIC_BASE_DIRECTORY,NEXT_PUBLIC_CLIENT_ID,NEXT_PUBLIC_CLIENT_SECRET)
+
+- 初次部署成功后,部署的页面上去是404的,因为我们还需要连接到Redis数据库。
+
+- `REDIS_URL`:如果您和我一样第一次接触这个Redis数据库,那么强烈推荐您使用免费且与Vercel深度合作的Upstash,详细参考[Vercel Integration](https://docs.upstash.com/redis/howto/vercelintegration),按说明在Vercel的[Upstash集成](https://vercel.com/integrations/upstash)中设置好,它会自动填入项目部署后的环境变量中。
+
+- `REDIS_URL`设置成功后,再重新部署一次项目。
+
+**部署成功后,当您第一次访问您的`onedrive-vercel-index`页面时,会引导你进行OAuth认证(相当简单),详情请参考原作者编写的[说明文档](https://ovi.swo.moe/zh/docs/getting-started#进行认证)。**
+
+## 说明文档
+
+**更多玩法请查阅原作者编写的[使用文档](https://ovi.swo.moe/zh/docs/getting-started)**
+
+## 修改说明
+
+- 本版本对比原版主要是把需要先修改`config/api.config.js`中的`clientId`和`obfuscatedClientSecret`,以及修改`config/site.config.js`中的`userPrincipalName`、`title`和`baseDirectory`的步骤提取出来,放在Vercel部署时的环境变量设置中进行。
+
+- 留空了`config/site.config.js`中的`mail`(如果想在页面中展示自己的联系方式,可自行修改),以及去除了GitHub图标旁的`GitHub`字样(因为感觉导航栏右边的图标有点多有点挤了)。
+
+- 另外就是加入了[Vercel Analytics](https://vercel.com/docs/concepts/analytics)的支持,方便查看分享的页面被访问情况(需要在部署后自行在项目的Analytics选项卡中开启)。
+
+## License
+
+[MIT License](LICENSE)
+
+© 2021-2023 [spencer woo](https://spencerwoo.com)
+
+© 2023 [iRedScarf](https://github.com/iRedScarf)
+
+
diff --git a/config/site.config.js b/config/site.config.js
index 9a05c1ce2d..6f2f7e03b2 100644
--- a/config/site.config.js
+++ b/config/site.config.js
@@ -38,14 +38,14 @@ module.exports = {
// [OPTIONAL] The footer component of your website. You can write HTML here, but you need to escape double
// quotes - changing " to \". You can write anything here, and if you like badges, generate some with https://shields.io
footer:
- 'Powered by onedrive-vercel-index. Made with ❤ by SpencerWoo.',
+ 'Powered by onedrive-vercel-index. Made by SpencerWoo | Modified by iRedScarf | MIT License',
// [OPTIONAL] This is where you specify the folders that are password protected. It is an array of paths pointing to all
// the directories in which you have .password set. Check the documentation for details.
protectedRoutes: [],
// [OPTIONAL] Use "" here if you want to remove this email address from the nav bar.
- email: 'mailto:spencer.wushangbo@gmail.com',
+ email: '',
// [OPTIONAL] This is an array of names and links for setting your social information and links.
// In the latest update, all brand icons inside font awesome is supported and the icon to render is based on the name
@@ -53,7 +53,7 @@ module.exports = {
links: [
{
name: 'GitHub',
- link: 'https://github.com/spencerwooo/onedrive-vercel-index',
+ link: 'https://github.com/iRedScarf/onedrive-vercel-index',
},
],
From 2c35eafa206a3d1e34c8199234c3685cc339901c Mon Sep 17 00:00:00 2001
From: eks <11900611@qq.com>
Date: Mon, 26 Jun 2023 09:36:19 +0800
Subject: [PATCH 07/88] update README
---
README.md | 2 +-
README.zh-CN.md | 2 +-
public/footer.png | Bin 3549 -> 0 bytes
public/header.png | Bin 72302 -> 0 bytes
4 files changed, 2 insertions(+), 2 deletions(-)
delete mode 100644 public/footer.png
delete mode 100644 public/header.png
diff --git a/README.md b/README.md
index f9e5efaa64..77b396542e 100644
--- a/README.md
+++ b/README.md
@@ -8,7 +8,7 @@ This project is a fork from [spencerwooo/onedrive-vercel-index](https://github.c
## Demo
-The [Demo](https://drive.swo.moe) provided by the original author | The [Demo](https://onedrive-index-iredscarf.vercel.app) of this One-Click Deployment version.
+The [Demo](https://drive.swo.moe) provided by the original author | The [Demo](https://onedrive-index-demo.vercel.app) of this One-Click Deployment version.
![demo](./public/demo.png)
diff --git a/README.zh-CN.md b/README.zh-CN.md
index 037171867b..ec93a46315 100644
--- a/README.zh-CN.md
+++ b/README.zh-CN.md
@@ -8,7 +8,7 @@
## 在线预览
-原作者提供的[在线预览](https://drive.swo.moe) | 本一键部署版的[在线预览](https://onedrive-index-iredscarf.vercel.app)
+原作者提供的[在线预览](https://drive.swo.moe) | 本一键部署版的[在线预览](https://onedrive-index-demo.vercel.app)
![demo](./public/demo.png)
diff --git a/public/footer.png b/public/footer.png
deleted file mode 100644
index 245380a345ed7a818520c067b1d58e1251caccdb..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 3549
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
S!GY}qg05V)G^sIidhl;|l3XnS
diff --git a/public/header.png b/public/header.png
deleted file mode 100644
index d0f2634e3021d51fd439a2c8db4ffd574889b9be..0000000000000000000000000000000000000000
GIT binary patch
literal 0
HcmV?d00001
literal 72302
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