From 974757c7da725c91219efabee8ffa17ff7723947 Mon Sep 17 00:00:00 2001
From: Jackson Harper
Date: Fri, 27 May 2022 16:38:19 -0700
Subject: [PATCH 001/141] Improve background uploading of PDFs
---
.../Share/ShareExtensionScene.swift | 15 ++++-
.../DataService/Mutations/SavePDF.swift | 59 ++++++++++++-------
.../DataService/Networking/Networker.swift | 25 +++++++-
3 files changed, 71 insertions(+), 28 deletions(-)
diff --git a/apple/OmnivoreKit/Sources/App/AppExtensions/Share/ShareExtensionScene.swift b/apple/OmnivoreKit/Sources/App/AppExtensions/Share/ShareExtensionScene.swift
index d3fa98d5f..1566bcf91 100644
--- a/apple/OmnivoreKit/Sources/App/AppExtensions/Share/ShareExtensionScene.swift
+++ b/apple/OmnivoreKit/Sources/App/AppExtensions/Share/ShareExtensionScene.swift
@@ -26,6 +26,7 @@ final class ShareExtensionViewModel: ObservableObject {
@Published var debugText: String?
var subscriptions = Set()
+ var backgroundTask: UIBackgroundTaskIdentifier?
let requestID = UUID().uuidString.lowercased()
init() {}
@@ -41,11 +42,16 @@ final class ShareExtensionViewModel: ObservableObject {
}
func savePage(extensionContext: NSExtensionContext?) {
+ backgroundTask = UIApplication.shared.beginBackgroundTask(withName: "BACKGROUND")
+
PageScraper.scrape(extensionContext: extensionContext) { [weak self] result in
switch result {
case let .success(payload):
self?.persist(pageScrapePayload: payload, requestId: self?.requestID ?? "")
case let .failure(error):
+ if let backgroundTask = self?.backgroundTask {
+ UIApplication.shared.endBackgroundTask(backgroundTask)
+ }
self?.debugText = error.message
}
}
@@ -59,7 +65,6 @@ final class ShareExtensionViewModel: ObservableObject {
return
}
- let backgroundTask = UIApplication.shared.beginBackgroundTask(withName: requestId)
let saveLinkPublisher: AnyPublisher = {
if case let .pdf(data) = pageScrapePayload.contentType {
return services.dataService.uploadPDFPublisher(pageScrapePayload: pageScrapePayload,
@@ -80,10 +85,14 @@ final class ShareExtensionViewModel: ObservableObject {
guard case let .failure(error) = completion else { return }
self?.debugText = "saveArticleError: \(error)"
self?.status = .failed(error: error)
- UIApplication.shared.endBackgroundTask(backgroundTask)
+ if let backgroundTask = self?.backgroundTask {
+ UIApplication.shared.endBackgroundTask(backgroundTask)
+ }
} receiveValue: { [weak self] _ in
self?.status = .success
- UIApplication.shared.endBackgroundTask(backgroundTask)
+ if let backgroundTask = self?.backgroundTask {
+ UIApplication.shared.endBackgroundTask(backgroundTask)
+ }
}
.store(in: &subscriptions)
diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/SavePDF.swift b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/SavePDF.swift
index 4267b5a6f..df0511ed6 100644
--- a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/SavePDF.swift
+++ b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/SavePDF.swift
@@ -64,6 +64,7 @@ private extension DataService {
return Deferred {
Future { promise in
send(mutation, to: path, headers: headers) { result in
+ print("result of upload file request", result)
switch result {
case let .success(payload):
if let graphqlError = payload.errors {
@@ -100,29 +101,43 @@ private extension DataService {
request.addValue("application/pdf", forHTTPHeaderField: "content-type")
request.httpBody = data
- return networker.urlSession.dataTaskPublisher(for: request)
- .tryMap { data, response -> String in
- let serverResponse = ServerResponse(data: data, response: response)
- if serverResponse.httpUrlResponse?.statusCode == 200, let fileUploadID = fileUploadConfig.uploadID {
- return fileUploadID
- }
+ // TODO: Maybe better to copy into this directory immediately
+ // instead of loading and writing the data
+ let tempDir = FileManager.default.temporaryDirectory
+ let localURL = tempDir.appendingPathComponent(fileUploadConfig.uploadFileID ?? "temporary")
+ try? data.write(to: localURL)
- throw ServerError(serverResponse: serverResponse)
- }
- .mapError { error -> SaveArticleError in
- let serverResponse = ServerResponse(error: error)
- NetworkRequestLogger.log(request: request, serverResponse: serverResponse)
- let serverError = ServerError(serverResponse: serverResponse)
- switch serverError {
- case .noConnection, .timeout:
- return .network
- case .unauthenticated:
- return .unauthorized
- case .unknown:
- return .unknown(description: "upload to file server failed")
- }
- }
- .eraseToAnyPublisher()
+ print("STARTING UPLOAD TASK WITH LOCAL URL", localURL)
+
+ let task = networker.backgroundSession.uploadTask(with: request, fromFile: localURL)
+ task.resume()
+
+ // Just return immediately at this point.
+ return Empty(completeImmediately: true).eraseToAnyPublisher()
+// return "".publisher.eraseToAnyPublisher()
+// return networker.urlSession.dataTaskPublisher(for: request)
+// .tryMap { data, response -> String in
+// let serverResponse = ServerResponse(data: data, response: response)
+// if serverResponse.httpUrlResponse?.statusCode == 200, let fileUploadID = fileUploadConfig.uploadID {
+// return fileUploadID
+// }
+//
+// throw ServerError(serverResponse: serverResponse)
+// }
+// .mapError { error -> SaveArticleError in
+// let serverResponse = ServerResponse(error: error)
+// NetworkRequestLogger.log(request: request, serverResponse: serverResponse)
+// let serverError = ServerError(serverResponse: serverResponse)
+// switch serverError {
+// case .noConnection, .timeout:
+// return .network
+// case .unauthenticated:
+// return .unauthorized
+// case .unknown:
+// return .unknown(description: "upload to file server failed")
+// }
+// }
+// .eraseToAnyPublisher()
}
// swiftlint:disable:next line_length
diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Networking/Networker.swift b/apple/OmnivoreKit/Sources/Services/DataService/Networking/Networker.swift
index 4f2869e23..cdf683d3e 100644
--- a/apple/OmnivoreKit/Sources/Services/DataService/Networking/Networker.swift
+++ b/apple/OmnivoreKit/Sources/Services/DataService/Networking/Networker.swift
@@ -1,7 +1,7 @@
import Foundation
import Models
-public final class Networker {
+public final class Networker: NSObject, URLSessionTaskDelegate {
let urlSession: URLSession
let appEnvironment: AppEnvironment
@@ -15,9 +15,28 @@ public final class Networker {
return headers
}
- public init(appEnvironment: AppEnvironment, urlSession: URLSession = .shared) {
+ public init(appEnvironment: AppEnvironment) {
self.appEnvironment = appEnvironment
- self.urlSession = urlSession
+ self.urlSession = .shared
+ }
+
+ lazy var backgroundSession: URLSession = {
+ let sessionConfig = URLSessionConfiguration.background(withIdentifier: "app.omnivoreapp.BackgroundSessionConfig")
+ sessionConfig.sharedContainerIdentifier = "group.app.omnivoreapp"
+ return URLSession(configuration: sessionConfig, delegate: self, delegateQueue: nil)
+ }()
+
+ public func urlSession(_: URLSession, task: URLSessionTask, didCompleteWithError _: Error?) {
+ print("finished upload of file:", task.taskIdentifier)
+ }
+
+ public func urlSession(_: URLSession,
+ task: URLSessionTask,
+ didSendBodyData _: Int64,
+ totalBytesSent: Int64,
+ totalBytesExpectedToSend _: Int64)
+ {
+ print("sent background data:", task.taskIdentifier, totalBytesSent)
}
}
From a04bfbb83eb126f39b88365bf406f311dfb750e6 Mon Sep 17 00:00:00 2001
From: Hongbo Wu
Date: Sun, 29 May 2022 22:43:21 +0800
Subject: [PATCH 002/141] When searching for highlights we should include
document title, description, content as secondary indexes
---
packages/api/src/elastic/highlights.ts | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/packages/api/src/elastic/highlights.ts b/packages/api/src/elastic/highlights.ts
index 62902863b..8f1bfb73d 100644
--- a/packages/api/src/elastic/highlights.ts
+++ b/packages/api/src/elastic/highlights.ts
@@ -179,7 +179,12 @@ export const searchHighlights = async (
{
multi_match: {
query: query || '',
- fields: ['highlights.quote', 'highlights.annotation'],
+ fields: [
+ 'highlights.quote^5',
+ 'title^3',
+ 'description^2',
+ 'content',
+ ],
operator: 'and',
type: 'cross_fields',
},
From 9dc7fd4c4cb07c0f82a91cafeafb3e1435af587f Mon Sep 17 00:00:00 2001
From: Hongbo Wu
Date: Mon, 30 May 2022 22:47:47 +0800
Subject: [PATCH 003/141] Add test case for electrek
---
.../electrek/expected-metadata.json | 12 +
.../test/test-pages/electrek/expected.html | 78 +
.../test/test-pages/electrek/source.html | 1887 +++++++++++++++++
.../test/test-pages/electrek/url.txt | 1 +
4 files changed, 1978 insertions(+)
create mode 100644 packages/readabilityjs/test/test-pages/electrek/expected-metadata.json
create mode 100644 packages/readabilityjs/test/test-pages/electrek/expected.html
create mode 100644 packages/readabilityjs/test/test-pages/electrek/source.html
create mode 100644 packages/readabilityjs/test/test-pages/electrek/url.txt
diff --git a/packages/readabilityjs/test/test-pages/electrek/expected-metadata.json b/packages/readabilityjs/test/test-pages/electrek/expected-metadata.json
new file mode 100644
index 000000000..ec043ebba
--- /dev/null
+++ b/packages/readabilityjs/test/test-pages/electrek/expected-metadata.json
@@ -0,0 +1,12 @@
+{
+ "title": "Georgia gives US solar panel manufacturing a big boost with a new factory",
+ "byline": "Michelle Lewis",
+ "dir": null,
+ "excerpt": "Solar-cell manufacturing giant Q Cells today announced that it's opening a new solar panel manufacturing facility in Dalton, Georgia.",
+ "siteName": "Electrek",
+ "siteIcon": "/favicon.ico",
+ "previewImage": "https://i0.wp.com/electrek.co/wp-content/uploads/sites/3/2022/05/georgia-solar-manufacturing.jpg?resize=1200%2C628&quality=82&strip=all&ssl=1",
+ "publishedDate": "2022-05-26T15:57:59.000Z",
+ "language": "English",
+ "readerable": true
+}
diff --git a/packages/readabilityjs/test/test-pages/electrek/expected.html b/packages/readabilityjs/test/test-pages/electrek/expected.html
new file mode 100644
index 000000000..d1a72dd2a
--- /dev/null
+++ b/packages/readabilityjs/test/test-pages/electrek/expected.html
@@ -0,0 +1,78 @@
+
+
+
+
+
+
+
+
+
+
+
+
Seoul-headquartered PV solar-cell manufacturing giant Q Cells today announced that it’s opening a new solar panel manufacturing facility in Dalton, Georgia.
+
Georgia solar panel manufacturing grows again
+
It’s a $171 million expansion of Q Cells’ existing solar module manufacturing plant in Dalton, and that will create 470 additional jobs. Total local Q Cells employees will exceed 1,000 when the expansion is complete.
+
Groundbreaking is planned for fall 2022 and operation is expected to commence within the first half of 2023.
+
This latest domestic solar manufacturing expansion will boost production of advanced photovoltaic (PV) modules, and that will help the US work move toward its goal of decarbonizing the electric grid.
+
The new facility will produce 1.4 gigawatts (GW) of solar modules per year made with Q Cells’ next-gen PV cells, a high-efficiency tunnel oxide passivated contact technology better known as TOPCon.
+
Combined with the existing 1.7-GW factory, the expansion will bring Q Cells’ total capacity in the US to 3.1 GW; that’s equivalent to one-third of the country’s solar module manufacturing capacity.
+
Qcells CEO Justin Lee said:
+
+
Georgia has become the clean energy manufacturing heart of America, and we are proud to contribute to the state’s advanced manufacturing economy.
+
+
Q Cells has the largest market share in the US commercial and residential markets and also supplies the utility-scale solar sector.
+
Senator Jon Ossoff (D-GA) met with Q Cells’ parent company Hanwha in Seoul last year and has been actively pitching and securing additional clean energy investment in Georgia.
Also in Georgia, WeSolar CSP, a minority-owned renewable energy tech and design company headquartered in Princeton, New Jersey, will design a solar farm along with a microgrid that will supply the City of Washington, Georgia, that will replace natural gas use. Washington is 90 miles east of Atlanta and has a population of around 4,000.
+
The project will comprise both solar panels and a concentrating solar-thermal power (CSP) technology.
+
WeSolar CSP’s CEO, Steve Anglin, said:
+
+
The citizens of the City of Washington will benefit by having a cleaner environment and experiencing price certainty in the face of the ever-increasing energy costs of fossil fuels.
+ UnderstandSolar is a free service that links you to top-rated solar installers in your region for personalized solar estimates. Tesla now offers price matching, so it’s important to shop for the best quotes. Click here to learn more and get your quotes. — *ad.
+
+
+ FTC: We use income earning auto affiliate links.More.
+
Michelle Lewis is a writer and editor on Electrek and an editor on DroneDJ, 9to5Mac, and 9to5Google. She lives in White River Junction, Vermont. She has previously worked for Fast Company, the Guardian, News Deeply, Time, and others. Message Michelle on Twitter or at michelle@9to5mac.com. Check out her personal blog.
+ Seoul-headquartered PV solar-cell manufacturing giant Q Cells today announced that it’s opening a new solar panel manufacturing facility in Dalton, Georgia.
+
+
+
+
+
+
+ Georgia solar panel manufacturing grows again
+
+
+ It’s a $171 million expansion of Q Cells’ existing solar module manufacturing plant in Dalton, and that will create 470 additional jobs. Total local Q Cells employees will exceed 1,000 when the expansion is complete.
+
+
+ Groundbreaking is planned for fall 2022 and operation is expected to commence within the first half of 2023.
+
+
+ This latest domestic solar manufacturing expansion will boost production of advanced photovoltaic (PV) modules, and that will help the US work move toward its goal of decarbonizing the electric grid.
+
+
+ The new facility will produce 1.4 gigawatts (GW) of solar modules per year made with Q Cells’ next-gen PV cells, a high-efficiency tunnel oxide passivated contact technology better known as TOPCon.
+
+
+ Combined with the existing 1.7-GW factory, the expansion will bring Q Cells’ total capacity in the US to 3.1 GW; that’s equivalent to one-third of the country’s solar module manufacturing capacity.
+
+
+ Qcells CEO Justin Lee said:
+
+
+
+ Georgia has become the clean energy manufacturing heart of America, and we are proud to contribute to the state’s advanced manufacturing economy.
+
+
+
+ Q Cells has the largest market share in the US commercial and residential markets and also supplies the utility-scale solar sector.
+
+
+ Senator Jon Ossoff (D-GA) met with Q Cells’ parent company Hanwha in Seoul last year and has been actively pitching and securing additional clean energy investment in Georgia.
+
+ Also in Georgia, WeSolar CSP, a minority-owned renewable energy tech and design company headquartered in Princeton, New Jersey, will design a solar farm along with a microgrid that will supply the City of Washington, Georgia, that will replace natural gas use. Washington is 90 miles east of Atlanta and has a population of around 4,000.
+
+
+ The project will comprise both solar panels and a concentrating solar-thermal power (CSP) technology.
+
+
+ WeSolar CSP’s CEO, Steve Anglin, said:
+
+
+
+ The citizens of the City of Washington will benefit by having a cleaner environment and experiencing price certainty in the face of the ever-increasing energy costs of fossil fuels.
+
+ UnderstandSolar is a free service that links you to top-rated solar installers in your region for personalized solar estimates. Tesla now offers price matching, so it’s important to shop for the best quotes. Click here to learn more and get your quotes. — *ad.
+
+
+
+
+
+
+ FTC: We use income earning auto affiliate links.More.
+
+
+
+
+
+
+
+ You’re reading Electrek— experts who break news about Tesla, electric vehicles, and green energy, day after day. Be sure to check out our homepage for all the latest news, and follow Electrek on Twitter, Facebook, and LinkedIn to stay in the loop. Don’t know where to start? Check out our YouTube channel for the latest reviews.
+
+ Michelle Lewis is a writer and editor on Electrek and an editor on DroneDJ, 9to5Mac, and 9to5Google. She lives in White River Junction, Vermont. She has previously worked for Fast Company, the Guardian, News Deeply, Time, and others. Message Michelle on Twitter or at michelle@9to5mac.com. Check out her personal blog.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/readabilityjs/test/test-pages/electrek/url.txt b/packages/readabilityjs/test/test-pages/electrek/url.txt
new file mode 100644
index 000000000..04b170cf7
--- /dev/null
+++ b/packages/readabilityjs/test/test-pages/electrek/url.txt
@@ -0,0 +1 @@
+https://electrek.co/2022/05/26/georgia-solar-panel-manufacturing/
\ No newline at end of file
From a17cb72527833e2f7128825deaede5456cd3a8d5 Mon Sep 17 00:00:00 2001
From: Jackson Harper
Date: Mon, 30 May 2022 09:16:33 -0700
Subject: [PATCH 004/141] Use the request ID as the background task ID
---
.../Sources/App/AppExtensions/Share/ShareExtensionScene.swift | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/apple/OmnivoreKit/Sources/App/AppExtensions/Share/ShareExtensionScene.swift b/apple/OmnivoreKit/Sources/App/AppExtensions/Share/ShareExtensionScene.swift
index 1566bcf91..0a3c78217 100644
--- a/apple/OmnivoreKit/Sources/App/AppExtensions/Share/ShareExtensionScene.swift
+++ b/apple/OmnivoreKit/Sources/App/AppExtensions/Share/ShareExtensionScene.swift
@@ -42,7 +42,7 @@ final class ShareExtensionViewModel: ObservableObject {
}
func savePage(extensionContext: NSExtensionContext?) {
- backgroundTask = UIApplication.shared.beginBackgroundTask(withName: "BACKGROUND")
+ backgroundTask = UIApplication.shared.beginBackgroundTask(withName: requestID)
PageScraper.scrape(extensionContext: extensionContext) { [weak self] result in
switch result {
From bb86447451b0df66cf0faacc3565b1d96df30b68 Mon Sep 17 00:00:00 2001
From: Jackson Harper
Date: Mon, 30 May 2022 09:34:40 -0700
Subject: [PATCH 005/141] Fix params list on SavePage call
---
.../Services/DataService/Mutations/SavePage.swift | 13 ++++++++-----
1 file changed, 8 insertions(+), 5 deletions(-)
diff --git a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/SavePage.swift b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/SavePage.swift
index b3ae4fc12..9f34c2268 100644
--- a/apple/OmnivoreKit/Sources/Services/DataService/Mutations/SavePage.swift
+++ b/apple/OmnivoreKit/Sources/Services/DataService/Mutations/SavePage.swift
@@ -12,16 +12,19 @@ public extension DataService {
}
let input = InputObjects.SavePageInput(
- url: requestId,
- source: html,
- clientRequestId: "ios-page",
+ url: pageScrapePayload.url,
+ source: "ios-page",
+ clientRequestId: requestId,
title: OptionalArgument(title),
- originalContent: pageScrapePayload.url
+ originalContent: html
)
let selection = Selection {
try $0.on(
- saveSuccess: .init { .saved(requestId: requestId, url: (try? $0.url()) ?? "") }, saveError: .init { .error(errorCode: (try? $0.errorCodes().first) ?? .unknown) }
+ saveSuccess: .init { .saved(requestId: requestId, url: (try? $0.url()) ?? "") },
+ saveError: .init {
+ .error(errorCode: (try? $0.errorCodes().first) ?? .unknown)
+ }
)
}
From bce50c2a92ddb7a4cb85eb3953c7b840e33d64cf Mon Sep 17 00:00:00 2001
From: Hongbo Wu
Date: Tue, 31 May 2022 11:11:06 +0800
Subject: [PATCH 006/141] Update electrek test case
---
.../test/test-pages/electrek/expected.html | 53 +-
.../test/test-pages/electrek/source.html | 6602 ++++++++++++-----
2 files changed, 4786 insertions(+), 1869 deletions(-)
diff --git a/packages/readabilityjs/test/test-pages/electrek/expected.html b/packages/readabilityjs/test/test-pages/electrek/expected.html
index d1a72dd2a..29df338f2 100644
--- a/packages/readabilityjs/test/test-pages/electrek/expected.html
+++ b/packages/readabilityjs/test/test-pages/electrek/expected.html
@@ -4,10 +4,19 @@
-
-
+
+
+
-
+
+
Seoul-headquartered PV solar-cell manufacturing giant Q Cells today announced that it’s opening a new solar panel manufacturing facility in Dalton, Georgia.
Georgia solar panel manufacturing grows again
@@ -16,7 +25,7 @@
This latest domestic solar manufacturing expansion will boost production of advanced photovoltaic (PV) modules, and that will help the US work move toward its goal of decarbonizing the electric grid.
The new facility will produce 1.4 gigawatts (GW) of solar modules per year made with Q Cells’ next-gen PV cells, a high-efficiency tunnel oxide passivated contact technology better known as TOPCon.
Combined with the existing 1.7-GW factory, the expansion will bring Q Cells’ total capacity in the US to 3.1 GW; that’s equivalent to one-third of the country’s solar module manufacturing capacity.
-
Qcells CEO Justin Lee said:
+
Qcells CEO Justin Lee said:
Georgia has become the clean energy manufacturing heart of America, and we are proud to contribute to the state’s advanced manufacturing economy.
@@ -28,22 +37,22 @@
Washington, Georgia, embraces solar
Also in Georgia, WeSolar CSP, a minority-owned renewable energy tech and design company headquartered in Princeton, New Jersey, will design a solar farm along with a microgrid that will supply the City of Washington, Georgia, that will replace natural gas use. Washington is 90 miles east of Atlanta and has a population of around 4,000.
The project will comprise both solar panels and a concentrating solar-thermal power (CSP) technology.
-
WeSolar CSP’s CEO, Steve Anglin, said:
+
WeSolar CSP’s CEO, Steve Anglin, said:
The citizens of the City of Washington will benefit by having a cleaner environment and experiencing price certainty in the face of the ever-increasing energy costs of fossil fuels.
UnderstandSolar is a free service that links you to top-rated solar installers in your region for personalized solar estimates. Tesla now offers price matching, so it’s important to shop for the best quotes. Click here to learn more and get your quotes. — *ad.
- FTC: We use income earning auto affiliate links.More.
+ FTC: We use income earning auto affiliate links.
+ More.
Michelle Lewis is a writer and editor on Electrek and an editor on DroneDJ, 9to5Mac, and 9to5Google. She lives in White River Junction, Vermont. She has previously worked for Fast Company, the Guardian, News Deeply, Time, and others. Message Michelle on Twitter or at michelle@9to5mac.com. Check out her personal blog.
+ Seoul-headquartered PV solar-cell manufacturing giant
+ Q Cells
+ today announced that it’s opening a new solar panel manufacturing
+ facility in Dalton, Georgia.
+
+
+
+
+
+
+ Georgia solar panel manufacturing grows again
+
+
+ It’s a $171 million expansion of Q Cells’ existing solar module
+ manufacturing plant in Dalton, and that will create 470 additional
+ jobs. Total local Q Cells employees will exceed 1,000 when the
+ expansion is complete.
+
+
+ Groundbreaking is planned for fall 2022 and operation is expected
+ to commence within the first half of 2023.
+
+
+ This latest domestic solar manufacturing expansion will boost
+ production of advanced photovoltaic (PV) modules, and that will
+ help the US work move toward its goal of decarbonizing the
+ electric grid.
+
+
+ The new facility will produce 1.4 gigawatts (GW) of solar modules
+ per year made with Q Cells’ next-gen PV cells, a high-efficiency
+ tunnel oxide passivated contact technology better known as TOPCon.
+
+
+ Combined with the existing 1.7-GW factory, the expansion will
+ bring Q Cells’ total capacity in the US to 3.1 GW; that’s
+ equivalent to one-third of the country’s solar module
+ manufacturing capacity.
+
+
Qcells CEO Justin Lee said:
+
+
+ Georgia has become the clean energy manufacturing heart of
+ America, and we are proud to contribute to the state’s advanced
+ manufacturing economy.
+
+
+
+ Q Cells has the largest market share in the US commercial and
+ residential markets and also supplies the utility-scale solar
+ sector.
+
+
+ Senator Jon Ossoff (D-GA) met with Q Cells’ parent company
+ Hanwha in Seoul last year and has been actively pitching and
+ securing additional clean energy investment in Georgia.
+
+
+
+
+
+
+
+
+ NEWS: Today, Sen.
+ @ossoff
+ and
+ @Qcells_NA
+ announced a $171 million expansion of their Dalton, Georgia
+ solar manufacturing plant, creating nearly 500 new Georgia
+ jobs.
+ pic.twitter.com/5bWGfUb3RQ
+
+ Also in Georgia,
+ WeSolar CSP, a minority-owned renewable energy tech and design company
+ headquartered in Princeton, New Jersey, will design a solar farm
+ along with a microgrid that will supply the City of Washington,
+ Georgia, that will replace natural gas use. Washington is 90 miles
+ east of Atlanta and has a population of around 4,000.
+
+
+ The project will comprise both solar panels and a concentrating
+ solar-thermal power (CSP) technology.
+
+
WeSolar CSP’s CEO, Steve Anglin, said:
+
+
+ The citizens of the City of Washington will benefit by having a
+ cleaner environment and experiencing price certainty in the face
+ of the ever-increasing energy costs of fossil fuels.
+
+ UnderstandSolar is a free service that links you to top-rated
+ solar installers in your region for personalized solar
+ estimates. Tesla now offers price matching, so it’s important to
+ shop for the best quotes. Click here to learn more and get your quotes. — *ad.
+
+
+
+
+
+
+ FTC: We use income earning auto affiliate links.
+ More.
+
+
+
+
+
+
+
+
+ You’re reading Electrek— experts who break news about
+ Tesla,
+ electric vehicles,
+ and green energy,
+ day after day. Be sure to check out our
+ homepage for all the latest
+ news, and follow Electrek on
+ Twitter,
+ Facebook, and
+ LinkedIn
+ to stay in the loop. Don’t know where to start? Check out our
+ YouTube channel for the latest reviews.
+
+ Michelle Lewis is a writer and editor on Electrek and an
+ editor on DroneDJ, 9to5Mac, and 9to5Google. She lives in
+ White River Junction, Vermont. She has previously worked for
+ Fast Company, the Guardian, News Deeply, Time, and others.
+ Message Michelle on Twitter or at michelle@9to5mac.com.
+ Check out her personal blog.
+